| | | | |
| ----------- | ---V--- loop_body ---------------
| | | iv_after = iv_before + stride |
- | | | if (iv_after <= upper_bound) |
+ | | | if (iv_before < upper_bound) |
| | ---|--------------\--------------
| | | \ exit_e
| | V \
| \ ___ /
Creates an empty loop as shown above, the IV_BEFORE is the SSA_NAME
- that is used before the increment of IV. IV_BEFORE should be used for
+ that is used before the increment of IV. IV_BEFORE should be used for
adding code to the body that uses the IV. OUTER is the outer loop in
- which the new loop should be inserted.
+ which the new loop should be inserted.
Both INITIAL_VALUE and UPPER_BOUND expressions are gimplified and
inserted on the loop entry edge. This implies that this function
invariant. */
struct loop *
-create_empty_loop_on_edge (edge entry_edge,
+create_empty_loop_on_edge (edge entry_edge,
tree initial_value,
tree stride, tree upper_bound,
tree iv,
tree exit_test;
edge exit_e;
int prob;
-
+
gcc_assert (entry_edge && initial_value && stride && upper_bound && iv);
/* Create header, latch and wire up the loop. */
/* Insert loop exit condition. */
cond_expr = gimple_build_cond
- (LE_EXPR, *iv_after, upper_bound, NULL_TREE, NULL_TREE);
+ (LT_EXPR, *iv_before, upper_bound, NULL_TREE, NULL_TREE);
exit_test = gimple_cond_lhs (cond_expr);
exit_test = force_gimple_operand_gsi (&gsi, exit_test, true, NULL,