]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[multiple changes]
authorKenneth Zadeck <zadeck@gcc.gnu.org>
Mon, 10 Dec 2007 21:31:59 +0000 (21:31 +0000)
committerKenneth Zadeck <zadeck@gcc.gnu.org>
Mon, 10 Dec 2007 21:31:59 +0000 (21:31 +0000)
2007-12-10  Kenneth Zadeck <zadeck@naturalbridge.com>

PR rtl-optimization/34302
* auto-inc-dec.c (attempt_change): Change place where move is
inserted.

2007-12-10  Jakub Jelinek  <jakub@redhat.com>

PR rtl-optimization/34302
* gcc.c-torture/execute/20071210-1.c: New test.

From-SVN: r130751

gcc/ChangeLog
gcc/auto-inc-dec.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/20071210-1.c [new file with mode: 0644]

index d9dbd4910fc1dff86afeffb2ce28267df0b36987..e9dca619baab185ff0b5f79bd10a6b71d020277d 100644 (file)
@@ -1,3 +1,9 @@
+2007-12-10  Kenneth Zadeck <zadeck@naturalbridge.com>
+
+       PR rtl-optimization/34302
+       * auto-inc-dec.c (attempt_change): Change place where move is
+       inserted.
+
 2007-12-10  Jakub Jelinek  <jakub@redhat.com>
 
        * dwarf2out.c (gen_array_type_die, gen_descr_array_type_die): For
index e59adab264189689d6c77b4f13d382f13b788f1e..2e2d047bf97ef4873e576271b467ea3f68ff1936 100644 (file)
@@ -550,7 +550,10 @@ attempt_change (rtx new_addr, rtx inc_reg)
   switch (inc_insn.form)
     {
     case FORM_PRE_ADD:
-      mov_insn = insert_move_insn_before (mem_insn.insn, 
+      /* Replace the addition with a move.  Do it at the location of
+        the addition since the operand of the addition may change
+        before the memory reference.  */
+      mov_insn = insert_move_insn_before (inc_insn.insn, 
                                          inc_insn.reg_res, inc_insn.reg0);
       move_dead_notes (mov_insn, inc_insn.insn, inc_insn.reg0);
 
@@ -673,7 +676,7 @@ try_merge (void)
     }
 
   /* Look to see if the inc register is dead after the memory
-     reference.  If it is do not do the combination.  */
+     reference.  If it is, do not do the combination.  */
   if (find_regno_note (last_insn, REG_DEAD, REGNO (inc_reg)))
     {
       if (dump_file)
index 120d026df2f878b934b7028e1e6b53843bd69f89..dfcb3b05ae474d7d95d975db294757477e09c12d 100644 (file)
@@ -1,3 +1,8 @@
+2007-12-10  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/34302
+       * gcc.c-torture/execute/20071210-1.c: New test.
+
 2007-12-10  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/34395
diff --git a/gcc/testsuite/gcc.c-torture/execute/20071210-1.c b/gcc/testsuite/gcc.c-torture/execute/20071210-1.c
new file mode 100644 (file)
index 0000000..0d113c0
--- /dev/null
@@ -0,0 +1,67 @@
+/* PR rtl-optimization/34302 */
+
+extern void abort (void);
+
+struct S
+{
+  int n1, n2, n3, n4;
+};
+
+__attribute__((noinline)) struct S
+foo (int x, int y, int z)
+{
+  if (x != 10 || y != 9 || z != 8)
+    abort ();
+  struct S s = { 1, 2, 3, 4 };
+  return s;
+}
+
+__attribute__((noinline)) void **
+bar (void **u, int *v)
+{
+  void **w = u;
+  int *s = v, x, y, z;
+  void **p, **q;
+  static void *l[] = { &&lab1, &&lab1, &&lab2, &&lab3, &&lab4 };
+
+  if (!u)
+    return l;
+
+  q = *w++;
+  goto *q;
+lab2:
+  p = q;
+  q = *w++;
+  x = s[2];
+  y = s[1];
+  z = s[0];
+  s -= 1;
+  struct S r = foo (x, y, z);
+  s[3] = r.n1;
+  s[2] = r.n2;
+  s[1] = r.n3;
+  s[0] = r.n4;
+  goto *q;
+lab3:
+  p = q;
+  q = *w++;
+  s += 1;
+  s[0] = 23;
+lab1:
+  goto *q;
+lab4:
+  return 0;
+}
+
+int
+main (void)
+{
+  void **u = bar ((void **) 0, (int *) 0);
+  void *t[] = { u[2], u[4] };
+  int s[] = { 7, 8, 9, 10, 11, 12 };
+  if (bar (t, &s[1]) != (void **) 0
+      || s[0] != 4 || s[1] != 3 || s[2] != 2 || s[3] != 1
+      || s[4] != 11 || s[5] != 12)
+    abort ();
+  return 0;
+}