diff options
author | Richard Guenther <rguenther@suse.de> | 2011-02-18 13:22:17 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2011-02-18 13:22:17 +0000 |
commit | 12d80acc4898f08ea2abbfd8c2be41a52c8d98bc (patch) | |
tree | 3c922e2a1a58a34b735ca64db0fe8d3abb392357 /gcc/tree-ssa-loop-im.c | |
parent | 357f98e5520d628b5acf21b516c8ce5f408a605f (diff) | |
download | gcc-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.c | 33 |
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; |