OSDN Git Service

2007-12-10 Kenneth Zadeck <zadeck@naturalbridge.com>
authorzadeck <zadeck@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 10 Dec 2007 21:31:59 +0000 (21:31 +0000)
committerzadeck <zadeck@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 10 Dec 2007 21:31:59 +0000 (21:31 +0000)
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.

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

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 d9dbd49..e9dca61 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 e59adab..2e2d047 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 120d026..dfcb3b0 100644 (file)
@@ -1,5 +1,10 @@
 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
        * g++.dg/cpp0x/error1.C: New test.
 
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;
+}