]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR rtl-optimization/47166 (SpecCpu2000 Ammp segfaults for ARM with -O3 -mthumb)
authorRichard Sandiford <richard.sandiford@linaro.org>
Mon, 14 Mar 2011 13:48:46 +0000 (13:48 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Mon, 14 Mar 2011 13:48:46 +0000 (13:48 +0000)
gcc/testsuite/
PR rtl-optimization/47166
* gcc.c-torture/execute/postmod-1.c: New test.

From-SVN: r170940

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/postmod-1.c [new file with mode: 0644]

index 16665b60da47b8ea723837bd994b7dd7b178c952..c9c66de2924c6105e659c6eae6d15fc20078df5a 100644 (file)
@@ -1,3 +1,8 @@
+2011-03-14  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       PR rtl-optimization/47166
+       * gcc.c-torture/execute/postmod-1.c: New test.
+
 2011-03-13  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        PR libfortran/48066
diff --git a/gcc/testsuite/gcc.c-torture/execute/postmod-1.c b/gcc/testsuite/gcc.c-torture/execute/postmod-1.c
new file mode 100644 (file)
index 0000000..b56454f
--- /dev/null
@@ -0,0 +1,62 @@
+#define DECLARE_ARRAY(A) array##A[0x10]
+#define DECLARE_COUNTER(A) counter##A = 0
+#define DECLARE_POINTER(A) *pointer##A = array##A + x
+/* Create a loop that allows post-modification of pointerA, followed by
+   a use of the post-modified address.  */
+#define BEFORE(A) counter##A += *pointer##A, pointer##A += 3
+#define AFTER(A) counter##A += pointer##A[x]
+
+/* Set up the arrays so that one iteration of the loop sets the counter
+   to 3.0f.  */
+#define INIT_ARRAY(A) array##A[1] = 1.0f, array##A[5] = 2.0f
+
+/* Check that the loop worked correctly for all values.  */
+#define CHECK_ARRAY(A) exit_code |= (counter##A != 3.0f)
+
+/* Having 6 copies triggered the bug for ARM and Thumb.  */
+#define MANY(A) A (0), A (1), A (2), A (3), A (4), A (5)
+
+/* Each addendA should be allocated a register.  */
+#define INIT_VOLATILE(A) addend##A = vol
+#define ADD_VOLATILE(A) vol += addend##A
+
+/* Having 5 copies triggered the bug for ARM and Thumb.  */
+#define MANY2(A) A (0), A (1), A (2), A (3), A (4)
+
+float MANY (DECLARE_ARRAY);
+float MANY (DECLARE_COUNTER);
+
+volatile int stop = 1;
+volatile int vol;
+
+void __attribute__((noinline))
+foo (int x)
+{
+  float MANY (DECLARE_POINTER);
+  int i;
+
+  do
+    {
+      MANY (BEFORE);
+      MANY (AFTER);
+      /* Create an inner loop that should ensure the code above
+        has registers free for reload inheritance.  */
+      {
+       int MANY2 (INIT_VOLATILE);
+       for (i = 0; i < 10; i++)
+         MANY2 (ADD_VOLATILE);
+      }
+    }
+  while (!stop);
+}
+
+int
+main (void)
+{
+  int exit_code = 0;
+
+  MANY (INIT_ARRAY);
+  foo (1);
+  MANY (CHECK_ARRAY);
+  return exit_code;
+}