From 84c672b950e3427d9abb5b74d635e586bda74c4e Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Wed, 19 May 2004 12:31:35 -0600 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 ++++++ gcc/tree-ssa-phiopt.c | 13 +++++++++++++ 2 files changed, 19 insertions(+) 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 -- 2.30.2