]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR rtl-optimization/58831 (wrong code at -O2 and -O3 on x86_64-linux-gnu in 64...
authorEric Botcazou <ebotcazou@gcc.gnu.org>
Fri, 25 Oct 2013 09:21:11 +0000 (09:21 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Fri, 25 Oct 2013 09:21:11 +0000 (09:21 +0000)
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

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

index d18f98804494d16af96e230cb8c4bd4eb4150e2a..1c7bc5436d9645aec407b1ab58138e56c7340f5b 100644 (file)
@@ -1,3 +1,9 @@
+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...
index 0f9ae73e3d268aa9745b657ffc68837223fc6ec0..1736169b476f0c9052fc587851d1ed5ec81e0479 100644 (file)
@@ -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++)
index 3b99bfb90cca764c5c81e5a567529389d7bec7f1..5ba87b5597a58a3d536cc9b091693198672f6527 100644 (file)
@@ -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 (file)
index 0000000..a40cd54
--- /dev/null
@@ -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;
+}