mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-20 15:20:59 +08:00
lambda-code.c (lambda_loopnest_to_gcc_loopnest): Swap the test when the edge has the opposite meaning...
2004-11-16 Daniel Berlin <dberlin@dberlin.org> * lambda-code.c (lambda_loopnest_to_gcc_loopnest): Swap the test when the edge has the opposite meaning, not when the first argument is invariant. From-SVN: r90788
This commit is contained in:
parent
354ed18fbd
commit
13cf683781
@ -1,3 +1,9 @@
|
||||
2004-11-16 Daniel Berlin <dberlin@dberlin.org>
|
||||
|
||||
* lambda-code.c (lambda_loopnest_to_gcc_loopnest): Swap
|
||||
the test when the edge has the opposite meaning, not when
|
||||
the first argument is invariant.
|
||||
|
||||
2004-11-16 Aldy Hernandez <aldyh@redhat.com>
|
||||
|
||||
* config/rs6000/rs6000.c (rs6000_override_options): Split e500v2
|
||||
|
@ -1867,6 +1867,7 @@ lambda_loopnest_to_gcc_loopnest (struct loop *old_loopnest,
|
||||
{
|
||||
lambda_loop newloop;
|
||||
basic_block bb;
|
||||
edge exit;
|
||||
tree ivvar, ivvarinced, exitcond, stmts;
|
||||
enum tree_code testtype;
|
||||
tree newupperbound, newlowerbound;
|
||||
@ -1908,6 +1909,7 @@ lambda_loopnest_to_gcc_loopnest (struct loop *old_loopnest,
|
||||
type,
|
||||
new_ivs,
|
||||
invariants, MIN_EXPR, &stmts);
|
||||
exit = temp->single_exit;
|
||||
exitcond = get_loop_exit_condition (temp);
|
||||
bb = bb_for_stmt (exitcond);
|
||||
bsi = bsi_start (bb);
|
||||
@ -1928,14 +1930,13 @@ lambda_loopnest_to_gcc_loopnest (struct loop *old_loopnest,
|
||||
|
||||
testtype = LL_STEP (newloop) >= 0 ? LE_EXPR : GE_EXPR;
|
||||
|
||||
/* Since we don't know which cond_expr part currently points to each
|
||||
edge, check which one is invariant and make sure we reverse the
|
||||
comparison if we are trying to replace a <= 50 with 50 >= newiv.
|
||||
This ensures that we still canonicalize to <invariant> <test>
|
||||
<induction variable>. */
|
||||
if (!expr_invariant_in_loop_p (temp, TREE_OPERAND (exitcond, 0)))
|
||||
/* We want to build a conditional where true means exit the loop, and
|
||||
false means continue the loop.
|
||||
So swap the testtype if this isn't the way things are.*/
|
||||
|
||||
if (exit->flags & EDGE_FALSE_VALUE)
|
||||
testtype = swap_tree_comparison (testtype);
|
||||
|
||||
|
||||
COND_EXPR_COND (exitcond) = build (testtype,
|
||||
boolean_type_node,
|
||||
newupperbound, ivvarinced);
|
||||
|
Loading…
x
Reference in New Issue
Block a user