]> gcc.gnu.org Git - gcc.git/commitdiff
re PR tree-optimization/20640 (ICE on NULL PHI_ARG_DEF)
authorAlexandre Oliva <aoliva@redhat.com>
Sat, 2 Apr 2005 17:02:15 +0000 (17:02 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Sat, 2 Apr 2005 17:02:15 +0000 (17:02 +0000)
gcc/ChangeLog:
PR tree-optimization/20640
* tree-ssa-dce.c (remove_dead_stmt): Don't redirect edge to
post-dominator if it has phi nodes.
(eliminate_unnecessary_stmts): Remove dead phis in all blocks
before dead statements.
gcc/testsuite/ChangeLog:
PR tree-optimization/20640
* gcc.dg/torture/tree-loop-1.c: New.

From-SVN: r97446

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/tree-loop-1.c [new file with mode: 0644]
gcc/tree-ssa-dce.c

index d03fcf914f292cba6f8f1b32fc28a7e04c89308b..3cb960effd831faa5e95b48f85417f02486587d2 100644 (file)
@@ -1,3 +1,11 @@
+2005-04-02  Alexandre Oliva  <aoliva@redhat.com>
+
+       PR tree-optimization/20640
+       * tree-ssa-dce.c (remove_dead_stmt): Don't redirect edge to
+       post-dominator if it has phi nodes.
+       (eliminate_unnecessary_stmts): Remove dead phis in all blocks
+       before dead statements.
+
 2005-04-02  Alexandre Oliva  <aoliva@redhat.com>
 
        PR middle-end/20491
index c2a49280c1448fc69e2a4cd50ee98659d96356f1..1264cf7879bc60e1ee8d8d8ded0447d19416d1e6 100644 (file)
@@ -1,3 +1,8 @@
+2005-04-02  Alexandre Oliva  <aoliva@redhat.com>
+
+       PR tree-optimization/20640
+       * gcc.dg/torture/tree-loop-1.c: New.
+
 2005-04-02  Alexandre Oliva  <aoliva@redhat.com>
 
        PR rtl-optimization/20290
diff --git a/gcc/testsuite/gcc.dg/torture/tree-loop-1.c b/gcc/testsuite/gcc.dg/torture/tree-loop-1.c
new file mode 100644 (file)
index 0000000..1d38691
--- /dev/null
@@ -0,0 +1,21 @@
+/* PR tree-optimization/20640 */
+
+/* After unrolling the loop, we'd turn some conditional branches into
+   unconditional ones, but branch redirection would fail to compute
+   the PHI args for the PHI nodes in the replacement edge
+   destination, so they'd remain NULL causing crashes later on.  */
+
+/* { dg-do compile } */
+
+static int a = 0;
+extern int foo (void);
+extern int *bar (void) __attribute__ ((__const__));
+
+void
+test (int x)
+{
+  int b = 10;
+  while (foo () == -1 && *bar () == 4 && b > 0)
+    --b;
+  a = x;
+}
index f8946bcbd92bb0833c7c6607156ea77467b80423..dc388ee7a8776b0b63c471b112821ab23d3af39d 100644 (file)
@@ -637,7 +637,10 @@ eliminate_unnecessary_stmts (void)
     {
       /* Remove dead PHI nodes.  */
       remove_dead_phis (bb);
+    }
 
+  FOR_EACH_BB (bb)
+    {
       /* Remove dead statements.  */
       for (i = bsi_start (bb); ! bsi_end_p (i) ; )
        {
@@ -724,6 +727,7 @@ remove_dead_stmt (block_stmt_iterator *i, basic_block bb)
   if (is_ctrl_stmt (t))
     {
       basic_block post_dom_bb;
+
       /* The post dominance info has to be up-to-date.  */
       gcc_assert (dom_computed[CDI_POST_DOMINATORS] == DOM_OK);
       /* Get the immediate post dominator of bb.  */
@@ -737,9 +741,20 @@ remove_dead_stmt (block_stmt_iterator *i, basic_block bb)
          return;
        }
 
-      /* Redirect the first edge out of BB to reach POST_DOM_BB.  */
-      redirect_edge_and_branch (EDGE_SUCC (bb, 0), post_dom_bb);
-      PENDING_STMT (EDGE_SUCC (bb, 0)) = NULL;
+      /* If the post dominator block has PHI nodes, we might be unable
+        to compute the right PHI args for them.  Since the control
+        statement is unnecessary, all edges can be regarded as
+        equivalent, but we have to get rid of the condition, since it
+        might reference a variable that was determined to be
+        unnecessary and thus removed.  */
+      if (phi_nodes (post_dom_bb))
+       post_dom_bb = EDGE_SUCC (bb, 0)->dest;
+      else
+       {
+         /* Redirect the first edge out of BB to reach POST_DOM_BB.  */
+         redirect_edge_and_branch (EDGE_SUCC (bb, 0), post_dom_bb);
+         PENDING_STMT (EDGE_SUCC (bb, 0)) = NULL;
+       }
       EDGE_SUCC (bb, 0)->probability = REG_BR_PROB_BASE;
       EDGE_SUCC (bb, 0)->count = bb->count;
 
This page took 0.121649 seconds and 5 git commands to generate.