From: rguenth Date: Tue, 4 Sep 2018 12:04:42 +0000 (+0000) Subject: 2018-09-04 Richard Biener X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b86a1a386a1a4718ce56741c8cd75925fc6038d6;p=thirdparty%2Fgcc.git 2018-09-04 Richard Biener PR tree-optimization/87211 * tree-ssa-sccvn.c (visit_phi): When value-numbering to a backedge value we're supposed to treat as VARYING also number the PHI to VARYING in case it got a different value-number already. * gcc.dg/torture/pr87211.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@264079 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index afa7e5bf69e5..5b60b32f243d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2018-09-04 Richard Biener + + PR tree-optimization/87211 + * tree-ssa-sccvn.c (visit_phi): When value-numbering to a + backedge value we're supposed to treat as VARYING also number + the PHI to VARYING in case it got a different value-number already. + 2018-09-04 Aldy Hernandez * tree-vrp.c (vrp_can_optimize_bit_op): Remove. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8602ff4988ac..47bb26591d23 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-09-04 Richard Biener + + PR tree-optimization/87211 + * gcc.dg/torture/pr87211.c: New testcase. + 2018-09-04 Richard Biener PR tree-optimization/87176 diff --git a/gcc/testsuite/gcc.dg/torture/pr87211.c b/gcc/testsuite/gcc.dg/torture/pr87211.c new file mode 100644 index 000000000000..386d2a481c3e --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr87211.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ + +int a, b; +int i(int *); +int *c(int *d, int *e) +{ + for (; b;) + d = e; + return d; +} +void f() +{ + for (;;) + { + int *g[1]; + int h = 0; + for (; h < 3; h++) + g[0] = &a; + &a == g[0] || i(c((int *)g, g[0])); + } +} diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index 8d68b6bac599..1e4bfe5f7ba9 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -4180,7 +4180,8 @@ visit_phi (gimple *phi, bool *inserted, bool backedges_varying_p) } /* If the value we want to use is the backedge and that wasn't visited - yet drop to VARYING. This only happens when not iterating. + yet or if we should take it as VARYING but it has a non-VARYING + value drop to VARYING. This only happens when not iterating. If we value-number a virtual operand never value-number to the value from the backedge as that confuses the alias-walking code. See gcc.dg/torture/pr87176.c. If the value is the same on a @@ -4190,7 +4191,8 @@ visit_phi (gimple *phi, bool *inserted, bool backedges_varying_p) && TREE_CODE (backedge_val) == SSA_NAME && sameval == backedge_val && (SSA_NAME_IS_VIRTUAL_OPERAND (backedge_val) - || !SSA_VISITED (backedge_val))) + || !SSA_VISITED (backedge_val) + || SSA_VAL (backedge_val) != backedge_val)) /* Note this just drops to VARYING without inserting the PHI into the hashes. */ result = PHI_RESULT (phi);