diff options
author | Aldy Hernandez <aldyh@redhat.com> | 2020-06-16 13:43:57 +0200 |
---|---|---|
committer | Aldy Hernandez <aldyh@redhat.com> | 2020-06-16 20:46:42 +0200 |
commit | 8fb4d1d58362b77da78c09740c6b5562124a369e (patch) | |
tree | d470227eac24ec1358fa296e331d673a9c706ae9 | |
parent | 12df77ab6df4b91d4770240bcc4ab443e4bb18b9 (diff) | |
download | gcc-8fb4d1d58362b77da78c09740c6b5562124a369e.tar.gz |
Fix pasto in the substitute_and_fold_engine merge with evrp.
The original code only propagated into PHI arguments if the value was
a constant. This behavior was lost in the conversion, allowing
any value (SSAs for instance) to be propagated into PHIs.
gcc/ChangeLog:
PR tree-optimization/95649
* tree-ssa-propagate.c (propagate_into_phi_args): Do not propagate unless
value is a constant.
gcc/testsuite/ChangeLog:
* g++.dg/tree-ssa/pr95649.C: New test.
* gcc.dg/tree-ssa/pr95649.c: New test.
-rw-r--r-- | gcc/testsuite/g++.dg/tree-ssa/pr95649.C | 13 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr95649.c | 21 | ||||
-rw-r--r-- | gcc/tree-ssa-propagate.c | 3 |
3 files changed, 36 insertions, 1 deletions
diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr95649.C b/gcc/testsuite/g++.dg/tree-ssa/pr95649.C new file mode 100644 index 00000000000..139f699ee2e --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr95649.C @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +extern unsigned short var_5; +extern int var_8, var_9; +extern short arr_7[]; +void test() { + for (; 0 < (char)var_5;) + for (int a(var_9 ? var_5 : 0); a < 3002972621U + 1291994699; + a += 19499 - 19497) + for (long b(var_8); b; b += 4) + arr_7[a * b] = 0; +} diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr95649.c b/gcc/testsuite/gcc.dg/tree-ssa/pr95649.c new file mode 100644 index 00000000000..cc9b7640c19 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr95649.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fno-tree-scev-cprop" } */ + +char b (void); +char *d; +int e; +int f; +void +g (char *h) +{ + while (d) + { + long i = b (); + if (h + i > d) + break; + if (f > 0 || e) + do + *h++ = *h; + while (--i); + } +} diff --git a/gcc/tree-ssa-propagate.c b/gcc/tree-ssa-propagate.c index 4fda296ef9e..01ee7fd33eb 100644 --- a/gcc/tree-ssa-propagate.c +++ b/gcc/tree-ssa-propagate.c @@ -1035,7 +1035,8 @@ substitute_and_fold_engine::propagate_into_phi_args (basic_block bb) || virtual_operand_p (arg)) continue; tree val = get_value (arg, phi); - if (val && may_propagate_copy (arg, val)) + if (val && is_gimple_min_invariant (val) + && may_propagate_copy (arg, val)) propagate_value (use_p, val); } } |