From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28217 invoked by alias); 31 May 2019 11:56:25 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 28209 invoked by uid 89); 31 May 2019 11:56:25 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-10.5 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_2,GIT_PATCH_3,KAM_ASCII_DIVIDERS,SPF_PASS autolearn=ham version=3.3.1 spammy= X-HELO: mx1.suse.de Received: from mx2.suse.de (HELO mx1.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 31 May 2019 11:56:23 +0000 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 0BDF2ABE1; Fri, 31 May 2019 11:56:21 +0000 (UTC) Date: Fri, 31 May 2019 12:50:00 -0000 From: Richard Biener To: Jan Hubicka cc: Richard Biener , GCC Patches , d@dcepelik.cz, mjambor@suse.cz Subject: Re: Teach same_types_for_tbaa to structurally compare arrays, pointers and vectors In-Reply-To: <20190529195839.jmp32xu6v6a6dhjn@kam.mff.cuni.cz> Message-ID: References: <20190524111433.mv5z33ysiatlxmxz@kam.mff.cuni.cz> <20190524131856.zduvz27dbjfy6yqw@kam.mff.cuni.cz> <20190527082804.uxp3ugxulvdray5z@kam.mff.cuni.cz> <20190529132057.ivcrg3upxubuaazh@kam.mff.cuni.cz> <20190529195839.jmp32xu6v6a6dhjn@kam.mff.cuni.cz> User-Agent: Alpine 2.20 (LSU 67 2015-01-07) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII X-SW-Source: 2019-05/txt/msg02124.txt.bz2 On Wed, 29 May 2019, Jan Hubicka wrote: > Hi, > this is a variant of testcase I have comitted. Once Martin implements SRA > part, we could add next variant that drops -fno-tree-sra. > > It seems odd that constant propagation only happens in fre3. > I woud expect fre1 to discover this already. > The IL before fre1 and 3 differs only by: > > test () > { > struct foo foo; > struct bar * barptr.0_1; > struct foo * fooptr.1_2; > - struct bar * barptr.2_3; > - int _8; > + int _7; > > - : > + [local count: 1073741824]: > foo.val = 0; > barptr.0_1 = barptr; > barptr.0_1->val2 = 123; > fooptr.1_2 = fooptr; > *fooptr.1_2 = foo; > - barptr.2_3 = barptr; > - _8 = barptr.2_3->val2; > + _7 = barptr.0_1->val2; > foo ={v} {CLOBBER}; > - return _8; > + return _7; > > } > > Why VN is not able to optimize the barptr access and lookup through > it at once? It looks that could potentially save some need to re-run > GVN since it is common to store pointers to memory and use them multiple > times to access other pointers. This is because in the first pass we substitute the value of barptr.2_3 (barptr.0_1) when looking up barptr.2_3->val2 and since that happens in VNs IL we run into ao_ref_init_from_vn_reference which does not re-build a GENERIC tree for the access path but leaves us with NULL ao_ref.ref -- I suppose we could put the original ref tree in there, too, even if the pieces are "valueized", it's just a more imprecise representation of the ref. That helps this testcase. Bootstrap / regtest running on x86_64-unknown-linux-gnu. Richard. 2019-05-31 Richard Biener * tree-ssa-sccvn.c (ao_ref_init_from_vn_reference): Get original full reference tree and record in ref->ref. (vn_reference_lookup_3): Pass in original ref to ao_ref_init_from_vn_reference. (vn_reference_lookup): Likewise. * tree-ssa-sccvn.h (ao_ref_init_from_vn_reference): Adjust prototype. * gcc.dg/tree-ssa/alias-access-path-1.c: Scan fre1. Index: gcc/tree-ssa-sccvn.c =================================================================== --- gcc/tree-ssa-sccvn.c (revision 271803) +++ gcc/tree-ssa-sccvn.c (working copy) @@ -995,7 +995,7 @@ copy_reference_ops_from_ref (tree ref, v bool ao_ref_init_from_vn_reference (ao_ref *ref, alias_set_type set, tree type, - vec ops) + vec ops, tree orig_ref) { vn_reference_op_t op; unsigned i; @@ -1149,7 +1149,7 @@ ao_ref_init_from_vn_reference (ao_ref *r if (base == NULL_TREE) return false; - ref->ref = NULL_TREE; + ref->ref = orig_ref; ref->base = base; ref->ref_alias_set = set; if (base_alias_set != -1) @@ -1976,7 +1976,8 @@ vn_reference_lookup_3 (ao_ref *ref, tree { lhs_ref_ok = ao_ref_init_from_vn_reference (&lhs_ref, get_alias_set (lhs), - TREE_TYPE (lhs), lhs_ops); + TREE_TYPE (lhs), lhs_ops, + lhs); if (lhs_ref_ok && !refs_may_alias_p_1 (ref, &lhs_ref, true)) { @@ -2718,7 +2719,7 @@ vn_reference_lookup (tree op, tree vuse, Otherwise preserve the full reference for advanced TBAA. */ if (!valuezied_anything || !ao_ref_init_from_vn_reference (&r, vr1.set, vr1.type, - vr1.operands)) + vr1.operands, op)) ao_ref_init (&r, op); if (! tbaa_p) r.ref_alias_set = r.base_alias_set = 0; Index: gcc/tree-ssa-sccvn.h =================================================================== --- gcc/tree-ssa-sccvn.h (revision 271803) +++ gcc/tree-ssa-sccvn.h (working copy) @@ -229,7 +229,7 @@ vn_nary_op_t vn_nary_op_insert (tree, tr vn_nary_op_t vn_nary_op_insert_pieces (unsigned int, enum tree_code, tree, tree *, tree, unsigned int); bool ao_ref_init_from_vn_reference (ao_ref *, alias_set_type, tree, - vec ); + vec, tree = NULL_TREE); vec vn_reference_operands_for_lookup (tree); tree vn_reference_lookup_pieces (tree, alias_set_type, tree, vec , Index: gcc/testsuite/gcc.dg/tree-ssa/alias-access-path-1.c =================================================================== --- gcc/testsuite/gcc.dg/tree-ssa/alias-access-path-1.c (revision 271803) +++ gcc/testsuite/gcc.dg/tree-ssa/alias-access-path-1.c (working copy) @@ -1,5 +1,6 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-fre3 -fno-tree-sra" } */ +/* { dg-options "-O2 -fdump-tree-fre1 -fno-tree-sra" } */ + struct foo { int val; @@ -18,4 +19,4 @@ test () return barptr->val2; } -/* { dg-final { scan-tree-dump-times "return 123" 1 "fre3"} } */ +/* { dg-final { scan-tree-dump-times "return 123" 1 "fre1"} } */