re PR bootstrap/56689 (internal compiler error: in get_loop_body, at cfgloop.c:841)
authorRichard Biener <rguenther@suse.de>
Mon, 25 Mar 2013 12:54:56 +0000 (12:54 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 25 Mar 2013 12:54:56 +0000 (12:54 +0000)
2013-03-25  Richard Biener  <rguenther@suse.de>

PR tree-optimization/56689
* tree-vrp.c (execute_vrp): Mark loops for fixup if we removed
any edge.

* gcc.dg/torture/pr56689.c: New testcase.

From-SVN: r197039

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr56689.c [new file with mode: 0644]
gcc/tree-vrp.c

index 3abf8781e7dc42226f0e41507069b974ebecd305..3db3f1d36d3b5af4867472222e08284d6f88fd3d 100644 (file)
@@ -1,3 +1,9 @@
+2013-03-25  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/56689
+       * tree-vrp.c (execute_vrp): Mark loops for fixup if we removed
+       any edge.
+
 2013-03-25  Richard Biener  <rguenther@suse.de>
 
        * tree-ssa-loop-im.c (struct mem_ref): Use bitmap_head instead
index 0a389fc18efa3860acd820ca21c0e5a10c0d82d5..2aad75a8e345e359ef5c48829b91c0ed9acbf964 100644 (file)
@@ -1,3 +1,8 @@
+2013-03-25  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/56689
+       * gcc.dg/torture/pr56689.c: New testcase.
+
 2013-03-25  Kai Tietz  <ktietz@redhat.com>
 
        * g++.dg/torture/20121105-1.C: Adjust for LLP64 targets.
diff --git a/gcc/testsuite/gcc.dg/torture/pr56689.c b/gcc/testsuite/gcc.dg/torture/pr56689.c
new file mode 100644 (file)
index 0000000..719f528
--- /dev/null
@@ -0,0 +1,46 @@
+/* { dg-do compile } */
+
+extern int baz ();
+extern void bar (void);
+extern void noret (void)   __attribute__ ((__noreturn__));
+
+void
+fix_register (const char *name, int fixed, int call_used, int nregs)
+{
+  int i;
+  int reg;
+
+  if ((reg = baz ()) >= 0)
+    {
+      for (i = reg; i < nregs; i++)
+       {
+         if ((i == 15 || i == 11) && (fixed == 0 || call_used == 0))
+           {
+             switch (fixed)
+               {
+               case 0:
+                 switch (call_used)
+                   {
+                   case 1:
+                     bar ();
+                     break;
+                   default:
+                     (noret ());
+                   }
+               case 1:
+                 switch (call_used)
+                   {
+                   case 1:
+                     break;
+                   case 0:
+                   default:
+                     (noret ());
+                   }
+                 break;
+               default:
+                 (noret ());
+               }
+           }
+       }
+    }
+}
index a38b14d495676267fb7025044338a63f5037efd7..250a506313678cc7f068c052676aec6a2fa09ce1 100644 (file)
@@ -9329,7 +9329,11 @@ execute_vrp (void)
     }
 
   if (to_remove_edges.length () > 0)
-    free_dominance_info (CDI_DOMINATORS);
+    {
+      free_dominance_info (CDI_DOMINATORS);
+      if (current_loops)
+       loops_state_set (LOOPS_NEED_FIXUP);
+    }
 
   to_remove_edges.release ();
   to_update_switch_stmts.release ();