diff options
author | Jeff Law <law@redhat.com> | 2004-05-19 12:31:35 -0600 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 2004-05-19 12:31:35 -0600 |
commit | 84c672b950e3427d9abb5b74d635e586bda74c4e (patch) | |
tree | 8caf03eb5bb52d5bd46e5a0506f75d33507b2517 /gcc/tree-ssa-phiopt.c | |
parent | 0aea6467d5022e3858bfed5ce5d24aa877bfed1a (diff) | |
download | gcc-84c672b950e3427d9abb5b74d635e586bda74c4e.zip gcc-84c672b950e3427d9abb5b74d635e586bda74c4e.tar.gz gcc-84c672b950e3427d9abb5b74d635e586bda74c4e.tar.bz2 |
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
Diffstat (limited to 'gcc/tree-ssa-phiopt.c')
-rw-r--r-- | gcc/tree-ssa-phiopt.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c index 7648bc0..fa34270 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 |