lambda-code.c (lambda_loopnest_to_gcc_loopnest): Swap the test when the edge has...
authorDaniel Berlin <dberlin@dberlin.org>
Wed, 17 Nov 2004 02:51:55 +0000 (02:51 +0000)
committerDaniel Berlin <dberlin@gcc.gnu.org>
Wed, 17 Nov 2004 02:51:55 +0000 (02:51 +0000)
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

gcc/ChangeLog
gcc/lambda-code.c

index def3930b57087b8e74dde070ebca69e7cd355d9b..1461084c592ffa49f8cd37e702259f04ece2b7e8 100644 (file)
@@ -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
index 2e1d85107b5e69d01a826e28040b44a093dbd4bb..96d9798aabd13c30606cfa5f19a066d415a63ea7 100644 (file)
@@ -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);