diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 41c09ff5a61..724e6edcceb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-02-18 Richard Guenther + + PR tree-optimization/47737 + * tree-ssa-loop-im.c (extract_true_false_args_from_phi): Fix + edge dominance check. + 2011-02-18 Jakub Jelinek PR debug/47780 diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c index 57f98978223..4ec67cf1138 100644 --- a/gcc/tree-ssa-loop-im.c +++ b/gcc/tree-ssa-loop-im.c @@ -676,31 +676,38 @@ extract_true_false_args_from_phi (basic_block dom, gimple phi, by the true edge of the predicate block and the other edge dominated by the false edge. This ensures that the PHI argument we are going to take is completely determined by the path we - take from the predicate block. */ + take from the predicate block. + We can only use BB dominance checks below if the destination of + the true/false edges are dominated by their edge, thus only + have a single predecessor. */ extract_true_false_edges_from_block (dom, &true_edge, &false_edge); tem = EDGE_PRED (bb, 0); if (tem == true_edge - || tem->src == true_edge->dest - || dominated_by_p (CDI_DOMINATORS, - tem->src, true_edge->dest)) + || (single_pred_p (true_edge->dest) + && (tem->src == true_edge->dest + || dominated_by_p (CDI_DOMINATORS, + tem->src, true_edge->dest)))) arg0 = PHI_ARG_DEF (phi, tem->dest_idx); else if (tem == false_edge - || tem->src == false_edge->dest - || dominated_by_p (CDI_DOMINATORS, - tem->src, false_edge->dest)) + || (single_pred_p (false_edge->dest) + && (tem->src == false_edge->dest + || dominated_by_p (CDI_DOMINATORS, + tem->src, false_edge->dest)))) arg1 = PHI_ARG_DEF (phi, tem->dest_idx); else return false; tem = EDGE_PRED (bb, 1); if (tem == true_edge - || tem->src == true_edge->dest - || dominated_by_p (CDI_DOMINATORS, - tem->src, true_edge->dest)) + || (single_pred_p (true_edge->dest) + && (tem->src == true_edge->dest + || dominated_by_p (CDI_DOMINATORS, + tem->src, true_edge->dest)))) arg0 = PHI_ARG_DEF (phi, tem->dest_idx); else if (tem == false_edge - || tem->src == false_edge->dest - || dominated_by_p (CDI_DOMINATORS, - tem->src, false_edge->dest)) + || (single_pred_p (false_edge->dest) + && (tem->src == false_edge->dest + || dominated_by_p (CDI_DOMINATORS, + tem->src, false_edge->dest)))) arg1 = PHI_ARG_DEF (phi, tem->dest_idx); else return false;