]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/20612 (ICE in verify_ssa for -ftree-loop-linear)
authorDaniel Berlin <dberlin@dberlin.org>
Mon, 11 Apr 2005 18:55:47 +0000 (18:55 +0000)
committerDaniel Berlin <dberlin@gcc.gnu.org>
Mon, 11 Apr 2005 18:55:47 +0000 (18:55 +0000)
2005-04-11  Daniel Berlin  <dberlin@dberlin.org>

Fix PR tree-optimization/20612
* lambda-code.c (lambda_loopnest_to_gcc_loopnest): Fix increment
handling
(perfect_nestify): preheaderbb is *not* part of loop of the
old destination.

From-SVN: r97979

gcc/ChangeLog
gcc/lambda-code.c

index 2c7195401c84b991a06fe8b8830da862ce997295..1a723feafa562520ec785d256e67670d97e61e60 100644 (file)
@@ -1,3 +1,11 @@
+2005-04-11  Daniel Berlin  <dberlin@dberlin.org>
+       
+       Fix PR tree-optimization/20612
+       * lambda-code.c (lambda_loopnest_to_gcc_loopnest): Fix increment
+       handling
+       (perfect_nestify): preheaderbb is *not* part of loop of the
+       old destination.
+
 2005-04-11  Andrew Pinski  <pinskia@physics.uc.edu>
 
        * tree-ssa-alias.c (may_alias_p): If the variable
index 80e5478ec0d1417805385a9bb7db04ce456548c4..5b23d6d5fa136995210c9e245ed8ba4c35168270 100644 (file)
@@ -1874,6 +1874,7 @@ lambda_loopnest_to_gcc_loopnest (struct loop *old_loopnest,
       lambda_linear_expression offset;
       tree type;
       bool insert_after;
+      tree inc_stmt;
 
       oldiv = VEC_index (tree, old_ivs, i);
       type = TREE_TYPE (oldiv);
@@ -1922,7 +1923,20 @@ lambda_loopnest_to_gcc_loopnest (struct loop *old_loopnest,
       create_iv (newlowerbound,
                 build_int_cst (type, LL_STEP (newloop)),
                 ivvar, temp, &bsi, insert_after, &ivvar,
-                &ivvarinced);
+                NULL);
+
+      /* Unfortunately, the incremented ivvar that create_iv inserted may not
+        dominate the block containing the exit condition.
+        So we simply create our own incremented iv to use in the new exit
+        test,  and let redundancy elimination sort it out.  */
+      inc_stmt = build (PLUS_EXPR, type, 
+                       ivvar, build_int_cst (type, LL_STEP (newloop)));
+      inc_stmt = build (MODIFY_EXPR, void_type_node, SSA_NAME_VAR (ivvar),
+                       inc_stmt);
+      ivvarinced = make_ssa_name (SSA_NAME_VAR (ivvar), inc_stmt);
+      TREE_OPERAND (inc_stmt, 0) = ivvarinced;
+      bsi = bsi_for_stmt (exitcond);
+      bsi_insert_before (&bsi, inc_stmt, BSI_SAME_STMT);
 
       /* Replace the exit condition with the new upper bound
          comparison.  */
@@ -2375,7 +2389,6 @@ perfect_nestify (struct loops *loops,
   add_bb_to_loop (latchbb, newloop);
   add_bb_to_loop (bodybb, newloop);
   add_bb_to_loop (headerbb, newloop);
-  add_bb_to_loop (preheaderbb, olddest->loop_father);
   set_immediate_dominator (CDI_DOMINATORS, bodybb, headerbb);
   set_immediate_dominator (CDI_DOMINATORS, headerbb, preheaderbb);
   set_immediate_dominator (CDI_DOMINATORS, preheaderbb,