aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-loop-im.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2011-02-18 13:22:17 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2011-02-18 13:22:17 +0000
commit12d80acc4898f08ea2abbfd8c2be41a52c8d98bc (patch)
tree3c922e2a1a58a34b735ca64db0fe8d3abb392357 /gcc/tree-ssa-loop-im.c
parent357f98e5520d628b5acf21b516c8ce5f408a605f (diff)
downloadgcc-12d80acc4898f08ea2abbfd8c2be41a52c8d98bc.zip
gcc-12d80acc4898f08ea2abbfd8c2be41a52c8d98bc.tar.gz
gcc-12d80acc4898f08ea2abbfd8c2be41a52c8d98bc.tar.bz2
re PR tree-optimization/47737 (wrong code with -funswitch-loops -fno-tree-dominator-opts -fgraphite-identity)
2011-02-18 Richard Guenther <rguenther@suse.de> PR tree-optimization/47737 * tree-ssa-loop-im.c (extract_true_false_args_from_phi): Fix edge dominance check. From-SVN: r170272
Diffstat (limited to 'gcc/tree-ssa-loop-im.c')
-rw-r--r--gcc/tree-ssa-loop-im.c33
1 files changed, 20 insertions, 13 deletions
diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c
index 57f9897..4ec67cf 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;