diff options
author | Bin Cheng <bin.cheng@arm.com> | 2016-02-10 14:09:05 +0000 |
---|---|---|
committer | Bin Cheng <amker@gcc.gnu.org> | 2016-02-10 14:09:05 +0000 |
commit | 13b562c502e92a602bf18e851c20fadfc2f4bfe9 (patch) | |
tree | 0e86553ae1799439c262ed251c08bab100f3fd5e /gcc | |
parent | 00a8574af2b7df89e82dab3c415de8b7cb48a333 (diff) | |
download | gcc-13b562c502e92a602bf18e851c20fadfc2f4bfe9.zip gcc-13b562c502e92a602bf18e851c20fadfc2f4bfe9.tar.gz gcc-13b562c502e92a602bf18e851c20fadfc2f4bfe9.tar.bz2 |
re PR tree-optimization/68021 (ice in rewrite_use_nonlinear_expr with -O3)
PR tree-optimization/68021
* tree-ssa-loop-ivopts.c (get_computation_aff): Set ratio to 1 if
when computing the value of biv cand by itself.
gcc/testsuite/ChangeLog
PR tree-optimization/68021
* gcc.dg/tree-ssa/pr68021.c: New test.
From-SVN: r233269
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr68021.c | 17 | ||||
-rw-r--r-- | gcc/tree-ssa-loop-ivopts.c | 14 |
4 files changed, 41 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 742d555..092797c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-02-10 Bin Cheng <bin.cheng@arm.com> + + PR tree-optimization/68021 + * tree-ssa-loop-ivopts.c (get_computation_aff): Set ratio to 1 if + when computing the value of biv cand by itself. + 2016-02-10 Wilco Dijkstra <wdijkstr@arm.com> * config/aarch64/aarch64.c (cortexa53_tunings): Enable AES fusion. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a6d388c..2c8be05 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-02-10 Bin Cheng <bin.cheng@arm.com> + + PR tree-optimization/68021 + * gcc.dg/tree-ssa/pr68021.c: New test. + 2016-02-10 Richard Biener <rguenther@suse.de> PR tree-optimization/69726 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr68021.c b/gcc/testsuite/gcc.dg/tree-ssa/pr68021.c new file mode 100644 index 0000000..f60b1ff --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr68021.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-O3" } */ + +char a; +void fn1 (char *p1, int p2, int p3) +{ + int i, x; + for (i = 0; i < 10; i++) + { + for (x = 0; x < p3; x++) + { + *p1 = a; + p1--; + } + p1 += p2; + } +} diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c index 4026d28..5302edf 100644 --- a/gcc/tree-ssa-loop-ivopts.c +++ b/gcc/tree-ssa-loop-ivopts.c @@ -3741,7 +3741,19 @@ get_computation_aff (struct loop *loop, var = fold_convert (uutype, var); } - if (!constant_multiple_of (ustep, cstep, &rat)) + /* Ratio is 1 when computing the value of biv cand by itself. + We can't rely on constant_multiple_of in this case because the + use is created after the original biv is selected. The call + could fail because of inconsistent fold behavior. See PR68021 + for more information. */ + if (cand->pos == IP_ORIGINAL && cand->incremented_at == use->stmt) + { + gcc_assert (is_gimple_assign (use->stmt)); + gcc_assert (use->iv->ssa_name == cand->var_after); + gcc_assert (gimple_assign_lhs (use->stmt) == cand->var_after); + rat = 1; + } + else if (!constant_multiple_of (ustep, cstep, &rat)) return false; /* In case both UBASE and CBASE are shortened to UUTYPE from some common |