re PR tree-optimization/35869 (ICE in calc_dfs_tree at -O2 -gnatp after VRP optimization)
authorRichard Guenther <rguenther@suse.de>
Fri, 11 Apr 2008 14:14:04 +0000 (14:14 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 11 Apr 2008 14:14:04 +0000 (14:14 +0000)
2008-04-11  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/35869
* tree-vrp.c (execute_vrp): Move switch statement update after
jump threading.  Schedule another cfg cleanup run.

* gcc.c-torture/compile/pr35869.c: New testcase.

From-SVN: r134197

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

index bc19665285c3e99a7fbb223b32aac3149216d243..1c50391c4cde50612c14e85bfd5cdc1c26d4c62d 100644 (file)
@@ -1,3 +1,9 @@
+2008-04-11  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/35869
+       * tree-vrp.c (execute_vrp): Move switch statement update after
+       jump threading.  Schedule another cfg cleanup run.
+
 2008-04-11  Volker Reichelt  <v.reichelt@netcologne.de>
 
        PR c/35744
index 8e6dd3940465b3c02465302ef33ac3d11238dde0..35112f287f48509d1301ba16961dabca2ac96af5 100644 (file)
@@ -1,3 +1,8 @@
+2008-04-11  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/35869
+       * gcc.c-torture/compile/pr35869.c: New testcase.
+
 2008-04-11  H.J. Lu  <hongjiu.lu@intel.com>
 
        * gcc.target/i386/sse-13.c: Move __builtin_ia32_round* to new
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr35869.c b/gcc/testsuite/gcc.c-torture/compile/pr35869.c
new file mode 100644 (file)
index 0000000..e83c0e8
--- /dev/null
@@ -0,0 +1,47 @@
+struct texture_stage_op
+{
+    unsigned int carg1, carg2, carg0;
+    unsigned int aarg1, aarg2, aarg0;
+    unsigned int dst;
+};
+
+static const char *debug_register(unsigned int reg) {
+    switch(reg) {
+        case 0x8921: return "GL_REG_0_ATI";
+        case 0x8923: return "GL_REG_2_ATI";
+        case 0x0: return "GL_ZERO";
+        case 0x1: return "GL_ONE";
+        default: return "Unknown register\n";
+    }
+}
+
+static unsigned int find_tmpreg(struct texture_stage_op op[8]) {
+    int i;
+    int tex_used[8];
+
+    for(i = 0; i < 8; i++) {
+        if(op[i].carg1 == 0x00000002 ) {
+            tex_used[i] = 1;
+        }
+    }
+
+    for(i = 1; i < 6; i++) {
+        if(!tex_used[i]) {
+                return 0x8921 + i;
+        }
+    }
+    return 0;
+}
+
+extern f(const char*);
+
+void g() {
+    struct texture_stage_op op[8];
+    unsigned int tmparg = find_tmpreg(op);
+    unsigned int dstreg;
+
+    if(tmparg == 0x0) return;
+    dstreg = tmparg;
+    f(debug_register(dstreg));
+    return;
+}
index 7ea026272b859f8a404e271a225987fad597ff04..76477c850ac6edb293254f05409b96757a005f31 100644 (file)
@@ -6734,20 +6734,6 @@ execute_vrp (void)
   ssa_propagate (vrp_visit_stmt, vrp_visit_phi_node);
   vrp_finalize ();
 
-  /* Remove dead edges from SWITCH_EXPR optimization.  This leaves the
-     CFG in a broken state and requires a cfg_cleanup run.  */
-  for (i = 0; VEC_iterate (edge, to_remove_edges, i, e); ++i)
-    remove_edge (e);
-  /* Update SWITCH_EXPR case label vector.  */
-  for (i = 0; VEC_iterate (switch_update, to_update_switch_stmts, i, su); ++i)
-    SWITCH_LABELS (su->stmt) = su->vec;
-
-  if (VEC_length (edge, to_remove_edges) > 0)
-    free_dominance_info (CDI_DOMINATORS);
-
-  VEC_free (edge, heap, to_remove_edges);
-  VEC_free (switch_update, heap, to_update_switch_stmts);
-
   /* ASSERT_EXPRs must be removed before finalizing jump threads
      as finalizing jump threads calls the CFG cleanup code which
      does not properly handle ASSERT_EXPRs.  */
@@ -6761,6 +6747,24 @@ execute_vrp (void)
   update_ssa (TODO_update_ssa);
 
   finalize_jump_threads ();
+
+  /* Remove dead edges from SWITCH_EXPR optimization.  This leaves the
+     CFG in a broken state and requires a cfg_cleanup run.  */
+  for (i = 0; VEC_iterate (edge, to_remove_edges, i, e); ++i)
+    remove_edge (e);
+  /* Update SWITCH_EXPR case label vector.  */
+  for (i = 0; VEC_iterate (switch_update, to_update_switch_stmts, i, su); ++i)
+    SWITCH_LABELS (su->stmt) = su->vec;
+
+  if (VEC_length (edge, to_remove_edges) > 0)
+    {
+      free_dominance_info (CDI_DOMINATORS);
+      cleanup_tree_cfg ();
+    }
+
+  VEC_free (edge, heap, to_remove_edges);
+  VEC_free (switch_update, heap, to_update_switch_stmts);
+
   scev_finalize ();
   loop_optimizer_finalize ();