OSDN Git Service

* tree-ssa-phiopt.c (value_replacement): Handle the case where
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 19 May 2004 18:31:35 +0000 (18:31 +0000)
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 19 May 2004 18:31:35 +0000 (18:31 +0000)
the desired edge out of COND_BLOCK reaches OTHER_BLOCK rather than
BB directly.

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

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

index 673dae6..2bdfb82 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 7648bc0..fa34270 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