aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.c-torture/execute/loop-ivopts-2.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/gcc.c-torture/execute/loop-ivopts-2.c')
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/loop-ivopts-2.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.c-torture/execute/loop-ivopts-2.c b/gcc/testsuite/gcc.c-torture/execute/loop-ivopts-2.c
new file mode 100644
index 00000000000..737640bff05
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/loop-ivopts-2.c
@@ -0,0 +1,50 @@
+/* PR rtl-optimization/20290 */
+
+/* We used to mis-optimize the second loop in main on at least ppc and
+ arm, because tree loop would change the loop to something like:
+
+ ivtmp.65 = &l[i];
+ ivtmp.16 = 113;
+ goto <bb 4> (<L4>);
+
+<L3>:;
+ *(ivtmp.65 + 4294967292B) = 9;
+ i = i + 1;
+
+<L4>:;
+ ivtmp.16 = ivtmp.16 - 1;
+ ivtmp.65 = ivtmp.65 + 4B;
+ if (ivtmp.16 != 0) goto <L3>;
+
+ We used to consider the increment of i as executed in every
+ iteration, so we'd miscompute the final value. */
+
+extern void abort (void);
+
+void
+check (unsigned int *l)
+{
+ int i;
+ for (i = 0; i < 288; i++)
+ if (l[i] != 7 + (i < 256 || i >= 280) + (i >= 144 && i < 256))
+ abort ();
+}
+
+int
+main (void)
+{
+ int i;
+ unsigned int l[288];
+
+ for (i = 0; i < 144; i++)
+ l[i] = 8;
+ for (; i < 256; i++)
+ l[i] = 9;
+ for (; i < 280; i++)
+ l[i] = 7;
+ for (; i < 288; i++)
+ l[i] = 8;
+ check (l);
+ return 0;
+}
+