diff options
author | Richard Biener <rguenther@suse.de> | 2018-09-04 12:04:42 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2018-09-04 12:04:42 +0000 |
commit | 5bf734facce9619c0757e32532fe8cc435f27a6d (patch) | |
tree | 002b5373060972cc867619c36989735499ce33a1 /gcc | |
parent | e20d979b7ada10b4665b0c97494ebeb1542ca047 (diff) | |
download | gcc-5bf734facce9619c0757e32532fe8cc435f27a6d.zip gcc-5bf734facce9619c0757e32532fe8cc435f27a6d.tar.gz gcc-5bf734facce9619c0757e32532fe8cc435f27a6d.tar.bz2 |
re PR tree-optimization/87211 (gcc ICE at O2: in set_ssa_val_to, at tree-ssa-sccvn.c:3628)
2018-09-04 Richard Biener <rguenther@suse.de>
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.
From-SVN: r264079
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr87211.c | 21 | ||||
-rw-r--r-- | gcc/tree-ssa-sccvn.c | 6 |
4 files changed, 37 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index afa7e5b..5b60b32 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2018-09-04 Richard Biener <rguenther@suse.de> + + 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 <aldyh@redhat.com> * tree-vrp.c (vrp_can_optimize_bit_op): Remove. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8602ff4..47bb265 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2018-09-04 Richard Biener <rguenther@suse.de> + PR tree-optimization/87211 + * gcc.dg/torture/pr87211.c: New testcase. + +2018-09-04 Richard Biener <rguenther@suse.de> + PR tree-optimization/87176 * gcc.dg/torture/pr87176.c: New testcase. * gcc.dg/torture/ssa-fre-1.c: Likewise. diff --git a/gcc/testsuite/gcc.dg/torture/pr87211.c b/gcc/testsuite/gcc.dg/torture/pr87211.c new file mode 100644 index 0000000..386d2a4 --- /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 8d68b6b..1e4bfe5 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); |