OSDN Git Service

2007-10-11 Kenneth Zadeck <zadeck@naturalbridge.com>
authorzadeck <zadeck@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 11 Oct 2007 22:31:55 +0000 (22:31 +0000)
committerzadeck <zadeck@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 11 Oct 2007 22:31:55 +0000 (22:31 +0000)
PR middle-end/33676
* global.c (build_insn_chain): Include insn that occur between
basic blocks.

2007-10-11  Kenneth Zadeck <zadeck@naturalbridge.com>

PR middle-end/33676
* gcc.dg/torture/pr33676.c: New.

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

gcc/ChangeLog
gcc/global.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr33676.c [new file with mode: 0644]

index 56e0b17..dac597f 100644 (file)
@@ -1,3 +1,9 @@
+2007-10-11  Kenneth Zadeck <zadeck@naturalbridge.com>
+
+       PR middle-end/33676
+       * global.c (build_insn_chain): Include insn that occur between
+       basic blocks.
+       
 2007-10-11  Tom Tromey  <tromey@redhat.com>
 
        * gengtype-yacc.y: Delete.
index 1dc63d3..69257bc 100644 (file)
@@ -1575,6 +1575,41 @@ build_insn_chain (void)
                  }
            }
        }
+
+      /* FIXME!! The following code is a disaster.  Reload needs to see the
+        labels and jump tables that are just hanging out in between
+        the basic blocks.  See pr33676.  */
+
+      insn = BB_HEAD (bb);
+
+      /* Skip over the barriers and cruft.  */
+      while (insn && (BARRIER_P (insn) || NOTE_P (insn) || BLOCK_FOR_INSN (insn) == bb))
+       insn = PREV_INSN (insn);
+       
+      /* While we add anything except barriers and notes, the focus is
+        to get the labels and jump tables into the
+        reload_insn_chain.  */
+      while (insn)
+       {
+         if (!NOTE_P (insn) && !BARRIER_P (insn))
+           {
+             if (BLOCK_FOR_INSN (insn))
+               break;
+
+             c = new_insn_chain ();
+             c->next = next;
+             next = c;
+             *p = c;
+             p = &c->prev;
+             
+             c->insn = insn;
+             /* The block makes no sense here, but it is what the old
+                code did.  */
+             c->block = bb->index;
+             bitmap_copy (&c->live_throughout, live_relevant_regs);
+           }     
+         insn = PREV_INSN (insn);
+       }
     }
 
   for (i = 0; i < (unsigned int)max_regno; i++)
index 5129625..69ab86f 100644 (file)
@@ -1,3 +1,8 @@
+2007-10-11  Kenneth Zadeck <zadeck@naturalbridge.com>
+
+       PR middle-end/33676
+       * gcc.dg/torture/pr33676.c: New.
+
 2007-10-11  Paolo Carlini  <pcarlini@suse.de>
 
        PR c++/31441
diff --git a/gcc/testsuite/gcc.dg/torture/pr33676.c b/gcc/testsuite/gcc.dg/torture/pr33676.c
new file mode 100644 (file)
index 0000000..74525c2
--- /dev/null
@@ -0,0 +1,51 @@
+/* { dg-do run } */ 
+/* { dg-options "-march=i586 -fomit-frame-pointer" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
+
+__attribute__((noreturn,noinline)) void abrt (const char *fi, const char *fu)
+{
+  __builtin_abort ();
+}
+
+__attribute__((noinline)) int f (int k)
+{
+  return k;
+}
+
+__attribute__((noinline)) int g (int t, int k)
+{
+  int b;
+
+  switch (t)
+    {
+    case 0:
+      abrt (__FILE__, __FUNCTION__);
+
+    case 1:
+      b = f (k);
+      break;
+
+    case 2:
+      b = f (k);
+      break;
+
+    case 3:
+      b = f (k);
+      break;
+
+    case 4:
+      b = f (k);
+      break;
+
+    default:
+      abrt (__FILE__, __FUNCTION__);
+    }
+
+  return b;
+}
+
+int main (void)
+{
+  if (g (3, 1337) != 1337)
+      abrt (__FILE__, __FUNCTION__);
+  return 0;
+}