aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@linaro.org>2011-03-14 13:46:12 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2011-03-14 13:46:12 +0000
commitb03bdade7aac1d74817bf756de872a15c573db35 (patch)
tree7cfc412319b9f818ecd117a6dcf007d3d4ed3ac4
parent6bd73dd88994055cdddca4225a5305f7a9282df9 (diff)
downloadgcc-b03bdade7aac1d74817bf756de872a15c573db35.zip
gcc-b03bdade7aac1d74817bf756de872a15c573db35.tar.gz
gcc-b03bdade7aac1d74817bf756de872a15c573db35.tar.bz2
re PR rtl-optimization/47166 (SpecCpu2000 Ammp segfaults for ARM with -O3 -mthumb)
gcc/testsuite/ PR rtl-optimization/47166 * gcc.c-torture/execute/postmod-1.c: New test. From-SVN: r170939
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/postmod-1.c62
2 files changed, 67 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2356b1d..67ba071 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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-14 Richard Guenther <rguenther@suse.de>
PR middle-end/48098
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
index 0000000..b56454f
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/postmod-1.c
@@ -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;
+}