OSDN Git Service

* reload1.c (reload): Call wrap_constant when substituting
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 22 Sep 2009 12:52:20 +0000 (12:52 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 22 Sep 2009 12:52:20 +0000 (12:52 +0000)
reg for equiv inside of DEBUG_INSNs.

* gcc.dg/20090922-1.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@151976 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/reload1.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/20090922-1.c [new file with mode: 0644]

index fa41a8a..eb4e37a 100644 (file)
@@ -1,3 +1,8 @@
+2009-09-22  Jakub Jelinek  <jakub@redhat.com>
+
+       * reload1.c (reload): Call wrap_constant when substituting
+       reg for equiv inside of DEBUG_INSNs.
+
 2009-09-22  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/41428
index 984913a..fae95d6 100644 (file)
@@ -1273,6 +1273,7 @@ reload (rtx first, int global)
                                                SUBREG_BYTE (x));
                  else
                    gcc_unreachable ();
+                 *loc = wrap_constant (GET_MODE (x), *loc);
                }
        }
     }
index 97b6262..eb4005a 100644 (file)
@@ -1,3 +1,7 @@
+2009-09-22  Jakub Jelinek  <jakub@redhat.com>
+
+       * gcc.dg/20090922-1.c: New test.
+
 2009-09-22  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/41428
diff --git a/gcc/testsuite/gcc.dg/20090922-1.c b/gcc/testsuite/gcc.dg/20090922-1.c
new file mode 100644 (file)
index 0000000..62045cb
--- /dev/null
@@ -0,0 +1,65 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -g -funroll-loops -std=gnu99" } */
+
+struct S
+{
+  unsigned long s1;
+  int **s2;
+};
+struct T
+{
+  unsigned long t1, t2;
+};
+struct U
+{
+  int u1, u2;
+  unsigned long u3;
+};
+struct V
+{
+  int v1, v3;
+  struct T *v2;
+  struct U *v4;
+};
+struct W
+{
+  int w1;
+  struct V **w2;
+};
+struct S *foo1 (void);
+int *foo2 (void);
+
+void
+test (struct W *w)
+{
+  for (int i = 0; i < w->w1; i++)
+    {
+      struct V *v = w->w2[i];
+      struct S *t = foo1 ();
+      if (!t)
+       for (int j; j < v->v1;)
+         {
+           struct T *q = &v->v2[j];
+           t += (q->t2 - q->t1) * 45000L;
+         }
+      for (; v->v3;)
+       {
+         struct U *v4 = (struct U *) &v->v4;
+         if (v4->u1 && v4->u2 >= 0 && v4->u2)
+           {
+             int *s = foo2 ();
+             if (!s)
+               for (int k = 0; k <= v4->u2; k++)
+                 {
+                   struct T *q = &v->v2[k];
+                   if (k == v4->u2)
+                     v4->u3 += (q->t1) * 1000000;
+                 }
+             t->s2[t->s1] = s;
+           }
+       }
+      int *s = foo2 ();
+      if (!t)
+       t->s2[t->s1] = s;
+    }
+}