From: Jeff Law Date: Wed, 19 May 2004 18:31:35 +0000 (-0600) Subject: tree-ssa-phiopt.c (value_replacement): Handle the case where the desired edge out... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=84c672b950e3427d9abb5b74d635e586bda74c4e;p=gcc.git tree-ssa-phiopt.c (value_replacement): Handle the case where the desired edge out of COND_BLOCK reaches OTHER_BLOCK... * 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 673dae6791a..2bdfb82e847 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-05-19 Jeff Law + + * 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 PR c++/15463 diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c index 7648bc090d6..fa342700d65 100644 --- a/gcc/tree-ssa-phiopt.c +++ b/gcc/tree-ssa-phiopt.c @@ -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