tree-ssa-loop-niter.c (assert_loop_rolls_lt): Convert the operands of compare to...
authorZdenek Dvorak <dvorakz@suse.cz>
Fri, 20 Jul 2007 01:29:43 +0000 (03:29 +0200)
committerZdenek Dvorak <rakdver@gcc.gnu.org>
Fri, 20 Jul 2007 01:29:43 +0000 (01:29 +0000)
* tree-ssa-loop-niter.c (assert_loop_rolls_lt): Convert the operands
of compare to the same type.
* cfgloopmanip.c (add_loop): Update information about loop exits.
(loop_version): Remove the innermost loop requirement.
* tree-ssa-loop-manip.c (determine_exit_conditions): Convert bounds
to sizetype for pointers.

From-SVN: r126796

gcc/ChangeLog
gcc/cfgloopmanip.c
gcc/tree-ssa-loop-manip.c
gcc/tree-ssa-loop-niter.c

index eb3e3e447cd62a32b6ac3b0cb6373399b327e019..4a999b0281ddae277e3b9e922e420e094db3f6d3 100644 (file)
@@ -1,3 +1,12 @@
+2007-07-20  Zdenek Dvorak  <dvorakz@suse.cz>
+
+       * tree-ssa-loop-niter.c (assert_loop_rolls_lt): Convert the operands
+       of compare to the same type.
+       * cfgloopmanip.c (add_loop): Update information about loop exits.
+       (loop_version): Remove the innermost loop requirement.
+       * tree-ssa-loop-manip.c (determine_exit_conditions): Convert bounds
+       to sizetype for pointers.
+
 2007-07-18  H.J. Lu  <hongjiu.lu@intel.com>
 
        * Makefile.in (D32PBIT_FUNCS): Add _sd_to_tf and _tf_to_sd.
index 92ab088ea40fd78319e1d984b026f498449b0e65..83c4c570c5a9625e5190b9aaaeb540f821fab586 100644 (file)
@@ -411,6 +411,8 @@ add_loop (struct loop *loop, struct loop *outer)
   basic_block *bbs;
   int i, n;
   struct loop *subloop;
+  edge e;
+  edge_iterator ei;
 
   /* Add it to loop structure.  */
   place_new_loop (loop);
@@ -441,6 +443,15 @@ add_loop (struct loop *loop, struct loop *outer)
        }
     }
 
+  /* Update the information about loop exit edges.  */
+  for (i = 0; i < n; i++)
+    {
+      FOR_EACH_EDGE (e, ei, bbs[i]->succs)
+       {
+         rescan_loop_exit (e, false, false);
+       }
+    }
+
   free (bbs);
 }
 
@@ -1283,10 +1294,6 @@ loop_version (struct loop *loop,
   struct loop *nloop;
   basic_block cond_bb;
 
-  /* CHECKME: Loop versioning does not handle nested loop at this point.  */
-  if (loop->inner)
-    return NULL;
-
   /* Record entry and latch edges for the loop */
   entry = loop_preheader_edge (loop);
   irred_flag = entry->flags & EDGE_IRREDUCIBLE_LOOP;
index 3354fdea6df5e73044805fc1fcd254d242656124..35bf97895b56528f19b1e8ea08bb3590dfb3d4b9 100644 (file)
@@ -670,13 +670,17 @@ determine_exit_conditions (struct loop *loop, struct tree_niter_desc *desc,
   tree base = desc->control.base;
   tree step = desc->control.step;
   tree bound = desc->bound;
-  tree type = TREE_TYPE (base);
+  tree type = TREE_TYPE (step);
   tree bigstep, delta;
   tree min = lower_bound_in_type (type, type);
   tree max = upper_bound_in_type (type, type);
   enum tree_code cmp = desc->cmp;
   tree cond = boolean_true_node, assum;
 
+  /* For pointers, do the arithmetics in the type of step (sizetype).  */
+  base = fold_convert (type, base);
+  bound = fold_convert (type, bound);
+
   *enter_cond = boolean_false_node;
   *exit_base = NULL_TREE;
   *exit_step = NULL_TREE;
index e209f732a3b1a29cdd1fdbd6edbb39cdd9a58b00..fdce4be01d479c8e404b54ec3a1eddc10b71df19 100644 (file)
@@ -918,8 +918,9 @@ assert_loop_rolls_lt (tree type, affine_iv *iv0, affine_iv *iv1,
 
       /* And then we can compute iv0->base - diff, and compare it with
         iv1->base.  */      
-      mbzl = fold_build2 (MINUS_EXPR, type1, iv0->base, diff);
-      mbzr = iv1->base;
+      mbzl = fold_build2 (MINUS_EXPR, type1, 
+                         fold_convert (type1, iv0->base), diff);
+      mbzr = fold_convert (type1, iv1->base);
     }
   else
     {
@@ -934,8 +935,9 @@ assert_loop_rolls_lt (tree type, affine_iv *iv0, affine_iv *iv1,
                                    iv1->base, bound);
        }
 
-      mbzl = iv0->base;
-      mbzr = fold_build2 (MINUS_EXPR, type1, iv1->base, diff);
+      mbzl = fold_convert (type1, iv0->base);
+      mbzr = fold_build2 (MINUS_EXPR, type1,
+                         fold_convert (type1, iv1->base), diff);
     }
 
   if (!integer_nonzerop (assumption))