[PR 85762, 87008, 85459] Relax MEM_REF check in contains_vce_or_bfcref_p
Richard Biener
rguenther@suse.de
Tue Mar 5 14:55:00 GMT 2019
On Tue, 5 Mar 2019, Martin Jambor wrote:
> Hi,
>
> after looking into the three PRs I found that the problem is the same in
> all of them, introduced in revision 255510, with SRA treating completely
> non type-punning MEM_REFs to a filed of a structure as a V_C_E (these
> are typically introduced by inlining tiny C++ getters/setters and other
> methods), sending it to a paranoid mode and leaving many unnecessary
> memory accesses behind.
>
> I believe the right fix is to relax the condition to what it was
> intended to do in r255510 to fix PR 83141. This particular behavior was
> chosen because we were afraid floating-point accesses might be
> introduced to load non-FP data, but as https://pastebin.com/Jk7ZPsVH
> shows, that can still happen and so if it really must be avoided at all
> costs, we have to deal with it differently.
>
> The regressions this fixes are potentially severe, therefore I'd like to
> backport this also to the gcc-8-branch. The patch has passed bootstrap
> and testing on x86_64-linux and aarch64-linux, testing and bootstrap on
> i686-linux and ppc64le-linux are in progress.
>
> OK for trunk and then later on for the branch?
>
> Thanks,
>
>
> Martin
>
>
> 2019-03-01 Martin Jambor <mjambor@suse.cz>
>
> PR tree-optimization/85762
> PR tree-optimization/87008
> PR tree-optimization/85459
> * tree-sra.c (contains_vce_or_bfcref_p): Relax MEM_REF type-conversion
> check.
>
> testsuite/
> * g++.dg/tree-ssa/pr87008.C: New test.
> ---
> gcc/testsuite/g++.dg/tree-ssa/pr87008.C | 17 +++++++++++++++++
> gcc/tree-sra.c | 13 ++++---------
> 2 files changed, 21 insertions(+), 9 deletions(-)
> create mode 100644 gcc/testsuite/g++.dg/tree-ssa/pr87008.C
>
> diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr87008.C b/gcc/testsuite/g++.dg/tree-ssa/pr87008.C
> new file mode 100644
> index 00000000000..eef521f9ad5
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/tree-ssa/pr87008.C
> @@ -0,0 +1,17 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fdump-tree-optimized" } */
> +
> +extern void dontcallthis();
> +
> +struct A { long a, b; };
> +struct B : A {};
> +template<class T>void cp(T&a,T const&b){a=b;}
> +long f(B x){
> + B y; cp<A>(y,x);
> + B z; cp<A>(z,x);
> + if (y.a - z.a)
> + dontcallthis ();
> + return 0;
> +}
> +
> +/* { dg-final { scan-tree-dump-not "dontcallthis" "optimized" } } */
> diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
> index eeef31ba496..bd30af5c6e0 100644
> --- a/gcc/tree-sra.c
> +++ b/gcc/tree-sra.c
> @@ -1151,7 +1151,7 @@ contains_view_convert_expr_p (const_tree ref)
> }
>
> /* Return true if REF contains a VIEW_CONVERT_EXPR or a MEM_REF that performs
> - type conversion or a COMPONENT_REF with a bit-field field declaration. */
> + memcpy or a COMPONENT_REF with a bit-field field declaration. */
>
> static bool
> contains_vce_or_bfcref_p (const_tree ref)
> @@ -1165,14 +1165,9 @@ contains_vce_or_bfcref_p (const_tree ref)
> ref = TREE_OPERAND (ref, 0);
> }
>
> - if (TREE_CODE (ref) != MEM_REF
> - || TREE_CODE (TREE_OPERAND (ref, 0)) != ADDR_EXPR)
> - return false;
> -
> - tree mem = TREE_OPERAND (TREE_OPERAND (ref, 0), 0);
> - if (TYPE_MAIN_VARIANT (TREE_TYPE (ref))
> - != TYPE_MAIN_VARIANT (TREE_TYPE (mem)))
> - return true;
> + if (TREE_CODE (ref) == MEM_REF
> + && TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (ref, 1))))
> + return true;
This doesn't make much sense to me - why not simply go back to the
old implementation which would mean to just
return false;
here?
Richard.
More information about the Gcc-patches
mailing list