tree-ssa-phiopt.c (value_replacement): Handle the case where the desired edge out...
authorJeff Law <law@redhat.com>
Wed, 19 May 2004 18:31:35 +0000 (12:31 -0600)
committerJeff Law <law@gcc.gnu.org>
Wed, 19 May 2004 18:31:35 +0000 (12:31 -0600)
* tree-ssa-phiopt.c (value_replacement): Handle the case where
the desired edge out of COND_BLOCK reaches OTHER_BLOCK rather than
BB directly.

From-SVN: r82031

gcc/ChangeLog
gcc/tree-ssa-phiopt.c

index 673dae6791aa8fba8f4518d7d1e659cdd1b3b40e..2bdfb82e847fde40cec33da903a92241a2c399e3 100644 (file)
@@ -1,3 +1,9 @@
+2004-05-19  Jeff Law <law@redhat.com>
+
+       * tree-ssa-phiopt.c (value_replacement): Handle the case where
+       the desired edge out of COND_BLOCK reaches OTHER_BLOCK rather than
+       BB directly.
+
 2004-05-19  Zdenek Dvorak  <rakdver@atrey.karlin.mff.cuni.cz>
 
        PR c++/15463
index 7648bc090d60bce63f0c74af6c6579d6e3170161..fa342700d65fec44118a4246d9d8a842c0a3b443 100644 (file)
@@ -464,7 +464,20 @@ value_replacement (basic_block bb, tree phi, tree arg0, tree arg1)
       edge e;
       tree arg;
 
+      /* For NE_EXPR, we want to build an assignment result = arg where
+        arg is the PHI argument associated with the true edge.  For
+        EQ_EXPR we want the PHI argument associated with the false edge.  */
       e = (TREE_CODE (cond) == NE_EXPR ? true_edge : false_edge);
+
+      /* Unfortunately, E may not reach BB (it may instead have gone to
+        OTHER_BLOCK).  If that is the case, then we want the single outgoing
+        edge from OTHER_BLOCK which reaches BB and represents the desired
+        path from COND_BLOCK.  */
+      if (e->dest == other_block)
+       e = e->dest->succ;
+
+      /* Now we know the incoming edge to BB that has the argument for the
+        RHS of our new assignment statement.  */
       if (PHI_ARG_EDGE (phi, 0) == e)
        arg = arg0;
       else