diff options
Diffstat (limited to 'gcc/lambda-code.c')
-rw-r--r-- | gcc/lambda-code.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/gcc/lambda-code.c b/gcc/lambda-code.c index 1fc3af5..40f3ac3 100644 --- a/gcc/lambda-code.c +++ b/gcc/lambda-code.c @@ -2189,9 +2189,10 @@ can_convert_to_perfect_nest (struct loop *loop, VEC (tree) *loopivs) { basic_block *bbs; - tree exit_condition; + tree exit_condition, phi; size_t i; block_stmt_iterator bsi; + basic_block exitdest; /* Can't handle triply nested+ loops yet. */ if (!loop->inner || loop->inner->inner) @@ -2233,6 +2234,16 @@ can_convert_to_perfect_nest (struct loop *loop, } } } + + /* We also need to make sure the loop exit only has simple copy phis in it, + otherwise we don't know how to transform it into a perfect nest right + now. */ + exitdest = loop->single_exit->dest; + + for (phi = phi_nodes (exitdest); phi; phi = PHI_CHAIN (phi)) + if (PHI_NUM_ARGS (phi) != 1) + return false; + return true; } @@ -2309,9 +2320,6 @@ perfect_nestify (struct loops *loops, for (phi = phi_nodes (olddest); phi; phi = PHI_CHAIN (phi)) { - /* These should be simple exit phi copies. */ - if (PHI_NUM_ARGS (phi) != 1) - return false; VEC_safe_push (tree, phis, PHI_RESULT (phi)); VEC_safe_push (tree, phis, PHI_ARG_DEF (phi, 0)); mark_for_rewrite (PHI_RESULT (phi)); |