aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorBin Cheng <bin.cheng@arm.com>2016-02-10 14:09:05 +0000
committerBin Cheng <amker@gcc.gnu.org>2016-02-10 14:09:05 +0000
commit13b562c502e92a602bf18e851c20fadfc2f4bfe9 (patch)
tree0e86553ae1799439c262ed251c08bab100f3fd5e /gcc
parent00a8574af2b7df89e82dab3c415de8b7cb48a333 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr68021.c17
-rw-r--r--gcc/tree-ssa-loop-ivopts.c14
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