Hello, On Sun, Mar 10 2019, Martin Jambor wrote: > Hi, > > after we have accidentally dropped the mailing list from our discussion > (my apologies for not spotting that in time), Richi has approved the > following patch which I have bootstrapped and tested on x86_64-linux > (all languages) and on i686-linux, aarch64-linux and ppc64-linux (C, C++ > and Fortran) and so I am about to commit it to trunk. > > It XFAILS three guality tests which pass at -O0, which means there are > three additional XPASSes - there already are 5 pre-existing XPASSes in > that testcase and 29 outright failures. I will come back to this next > in April and see whether I can make the tests pass by decoupling the > roles now played by cannot_scalarize_away_bitmap (or at least massage > the testcase to go make the XPASSes go away). But I won't have time to > do it next two weeks and this patch is important enough to have it in > trunk now. I intend to backport it to gcc 8 in April too. > > Thanks, > > Martin > > > 2019-03-08 Martin Jambor <mjam...@suse.cz> > > PR tree-optimization/85762 > PR tree-optimization/87008 > PR tree-optimization/85459 > * tree-sra.c (contains_vce_or_bfcref_p): New parameter, set the bool > it points to if there is a type changing MEM_REF. Adjust all callers. > (build_accesses_from_assign): Disable total scalarization if > contains_vce_or_bfcref_p returns true through the new parameter, for > both rhs and lhs. > > testsuite/ > * g++.dg/tree-ssa/pr87008.C: New test. > * gcc.dg/guality/pr54970.c: Xfail tests querying a[0] everywhere.
this patch has been on trunk for over a month and at least so far nobody complained. I have applied it to gcc-8-branch and did a bootstrap and testing on an x86_64-linux machine and there were no problems either. Therefore I would propose to backport it - the other option being leaving the gcc 8 regression(s) unfixed. What do you think? Martin 2019-04-16 Martin Jambor <mjam...@suse.cz> Backport from mainline 2019-03-10 Martin Jambor <mjam...@suse.cz> PR tree-optimization/85762 PR tree-optimization/87008 PR tree-optimization/85459 * tree-sra.c (contains_vce_or_bfcref_p): New parameter, set the bool it points to if there is a type changing MEM_REF. Adjust all callers. (build_accesses_from_assign): Disable total scalarization if contains_vce_or_bfcref_p returns true through the new parameter, for both rhs and lhs. testsuite/ * g++.dg/tree-ssa/pr87008.C: New test. * gcc.dg/guality/pr54970.c: Xfail tests querying a[0] everywhere. --- gcc/testsuite/g++.dg/tree-ssa/pr87008.C | 17 ++++++++++++ gcc/testsuite/gcc.dg/guality/pr54970.c | 6 ++--- gcc/tree-sra.c | 36 ++++++++++++++++++------- 3 files changed, 47 insertions(+), 12 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/testsuite/gcc.dg/guality/pr54970.c b/gcc/testsuite/gcc.dg/guality/pr54970.c index 1819d023e21..f12a9aac1d2 100644 --- a/gcc/testsuite/gcc.dg/guality/pr54970.c +++ b/gcc/testsuite/gcc.dg/guality/pr54970.c @@ -8,17 +8,17 @@ int main () { - int a[] = { 1, 2, 3 }; /* { dg-final { gdb-test 15 "a\[0\]" "1" } } */ + int a[] = { 1, 2, 3 }; /* { dg-final { gdb-test 15 "a\[0\]" "1" { xfail { *-*-* } } } } */ int *p = a + 2; /* { dg-final { gdb-test 15 "a\[1\]" "2" } } */ int *q = a + 1; /* { dg-final { gdb-test 15 "a\[2\]" "3" } } */ /* { dg-final { gdb-test 15 "*p" "3" } } */ asm volatile (NOP); /* { dg-final { gdb-test 15 "*q" "2" } } */ - *p += 10; /* { dg-final { gdb-test 20 "a\[0\]" "1" } } */ + *p += 10; /* { dg-final { gdb-test 20 "a\[0\]" "1" { xfail { *-*-* } } } } */ /* { dg-final { gdb-test 20 "a\[1\]" "2" } } */ /* { dg-final { gdb-test 20 "a\[2\]" "13" } } */ /* { dg-final { gdb-test 20 "*p" "13" } } */ asm volatile (NOP); /* { dg-final { gdb-test 20 "*q" "2" } } */ - *q += 10; /* { dg-final { gdb-test 25 "a\[0\]" "1" } } */ + *q += 10; /* { dg-final { gdb-test 25 "a\[0\]" "1" { xfail { *-*-* } } } } */ /* { dg-final { gdb-test 25 "a\[1\]" "12" } } */ /* { dg-final { gdb-test 25 "a\[2\]" "13" } } */ /* { dg-final { gdb-test 25 "*p" "13" } } */ diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index bb373b33b7a..e1ebdfaa225 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -1150,29 +1150,36 @@ contains_view_convert_expr_p (const_tree ref) return false; } -/* 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. */ +/* Return true if REF contains a VIEW_CONVERT_EXPR or a COMPONENT_REF with a + bit-field field declaration. If TYPE_CHANGING_P is non-NULL, set the bool + it points to will be set if REF contains any of the above or a MEM_REF + expression that effectively performs type conversion. */ static bool -contains_vce_or_bfcref_p (const_tree ref) +contains_vce_or_bfcref_p (const_tree ref, bool *type_changing_p = NULL) { while (handled_component_p (ref)) { if (TREE_CODE (ref) == VIEW_CONVERT_EXPR || (TREE_CODE (ref) == COMPONENT_REF && DECL_BIT_FIELD (TREE_OPERAND (ref, 1)))) - return true; + { + if (type_changing_p) + *type_changing_p = true; + return true; + } ref = TREE_OPERAND (ref, 0); } - if (TREE_CODE (ref) != MEM_REF + if (!type_changing_p + || 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; + *type_changing_p = true; return false; } @@ -1368,15 +1375,26 @@ build_accesses_from_assign (gimple *stmt) lacc->grp_assignment_write = 1; if (storage_order_barrier_p (rhs)) lacc->grp_unscalarizable_region = 1; + + if (should_scalarize_away_bitmap && !is_gimple_reg_type (lacc->type)) + { + bool type_changing_p = false; + contains_vce_or_bfcref_p (lhs, &type_changing_p); + if (type_changing_p) + bitmap_set_bit (cannot_scalarize_away_bitmap, + DECL_UID (lacc->base)); + } } if (racc) { racc->grp_assignment_read = 1; - if (should_scalarize_away_bitmap && !gimple_has_volatile_ops (stmt) - && !is_gimple_reg_type (racc->type)) + if (should_scalarize_away_bitmap && !is_gimple_reg_type (racc->type)) { - if (contains_vce_or_bfcref_p (rhs)) + bool type_changing_p = false; + contains_vce_or_bfcref_p (rhs, &type_changing_p); + + if (type_changing_p || gimple_has_volatile_ops (stmt)) bitmap_set_bit (cannot_scalarize_away_bitmap, DECL_UID (racc->base)); else -- 2.21.0