summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@gcc.gnu.org>2013-10-25 09:21:11 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2013-10-25 09:21:11 +0000
commit356610cb478784b55aeb9936f1611de5b0d27e70 (patch)
tree3eae639e031fb1f449c90e31952e47635f27c796
parent2e30c7fbc4eb5a58caae9fd2ed1cd05b60bdcec5 (diff)
downloadgcc-356610cb478784b55aeb9936f1611de5b0d27e70.tar.gz
re PR rtl-optimization/58831 (wrong code at -O2 and -O3 on x86_64-linux-gnu in 64-bit mode)
PR rtl-optimization/58831 * alias.c (init_alias_analysis): At the beginning of each iteration, set the reg_seen[N] bit if static_reg_base_value[N] is non-null. From-SVN: r204055
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/alias.c17
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr58831.c40
4 files changed, 58 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d18f9880449..1c7bc5436d9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2013-10-25 Eric Botcazou <ebotcazou@adacore.com>
+ PR rtl-optimization/58831
+ * alias.c (init_alias_analysis): At the beginning of each iteration, set
+ the reg_seen[N] bit if static_reg_base_value[N] is non-null.
+
+2013-10-25 Eric Botcazou <ebotcazou@adacore.com>
+
* recog.c (search_ofs): New static variable moved from...
(peep2_find_free_register): ...here.
(peephole2_optimize): Initialize it.
diff --git a/gcc/alias.c b/gcc/alias.c
index 0f9ae73e3d2..1736169b476 100644
--- a/gcc/alias.c
+++ b/gcc/alias.c
@@ -2975,16 +2975,13 @@ init_alias_analysis (void)
/* Wipe the reg_seen array clean. */
bitmap_clear (reg_seen);
- /* Mark all hard registers which may contain an address.
- The stack, frame and argument pointers may contain an address.
- An argument register which can hold a Pmode value may contain
- an address even if it is not in BASE_REGS.
-
- The address expression is VOIDmode for an argument and
- Pmode for other registers. */
-
- memcpy (new_reg_base_value, static_reg_base_value,
- FIRST_PSEUDO_REGISTER * sizeof (rtx));
+ /* Initialize the alias information for this pass. */
+ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
+ if (static_reg_base_value[i])
+ {
+ new_reg_base_value[i] = static_reg_base_value[i];
+ bitmap_set_bit (reg_seen, i);
+ }
/* Walk the insns adding values to the new_reg_base_value array. */
for (i = 0; i < rpo_cnt; i++)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3b99bfb90cc..5ba87b5597a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,4 +1,8 @@
-2013-10-24 Nick Clifton <nickc@redhat.com>
+2013-10-25 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gcc.c-torture/execute/pr58831.c: New test.
+
+2013-10-25 Nick Clifton <nickc@redhat.com>
* c-c++-common/pr57793.c: Add expected error messages for
targets with small integers.
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr58831.c b/gcc/testsuite/gcc.c-torture/execute/pr58831.c
new file mode 100644
index 00000000000..a40cd54d222
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pr58831.c
@@ -0,0 +1,40 @@
+#include <assert.h>
+
+int a, *b, c, d, f, **i, p, q, *r;
+short o, j;
+
+static int __attribute__((noinline, noclone))
+fn1 (int *p1, int **p2)
+{
+ int **e = &b;
+ for (; p; p++)
+ *p1 = 1;
+ *e = *p2 = &d;
+
+ assert (r);
+
+ return c;
+}
+
+static int ** __attribute__((noinline, noclone))
+fn2 (void)
+{
+ for (f = 0; f != 42; f++)
+ {
+ int *g[3] = {0, 0, 0};
+ for (o = 0; o; o--)
+ for (; a > 1;)
+ {
+ int **h[1] = { &g[2] };
+ }
+ }
+ return &r;
+}
+
+int
+main (void)
+{
+ i = fn2 ();
+ fn1 (b, i);
+ return 0;
+}