]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-ssa-loop-ivopts.c (rewrite_use_nonlinear_expr): Do not add unnecessary cast...
authorZdenek Dvorak <dvorakz@suse.cz>
Sun, 6 Feb 2005 18:48:58 +0000 (19:48 +0100)
committerZdenek Dvorak <rakdver@gcc.gnu.org>
Sun, 6 Feb 2005 18:48:58 +0000 (18:48 +0000)
* tree-ssa-loop-ivopts.c (rewrite_use_nonlinear_expr): Do not add
unnecessary cast to original induction variable increments.

From-SVN: r94681

gcc/ChangeLog
gcc/tree-ssa-loop-ivopts.c

index 83c0ed5836e68c7254dd51ee51e7a7e0ff202ade..a498661799631427d6b8e22b7c0e6d8131c3aec1 100644 (file)
@@ -1,3 +1,8 @@
+2005-02-06  Zdenek Dvorak  <dvorakz@suse.cz>
+
+       * tree-ssa-loop-ivopts.c (rewrite_use_nonlinear_expr): Do not add
+       unnecessary cast to original induction variable increments.
+
 2005-02-06  Zdenek Dvorak  <dvorakz@suse.cz>
 
        PR tree-optimization/18219
index 05f4a8da7bbdb32f5e6aeef942b6b0182f60e9e7..b5f693e4c9d0df11487bf5fb5abf6cab5b032e72 100644 (file)
@@ -4542,11 +4542,32 @@ static void
 rewrite_use_nonlinear_expr (struct ivopts_data *data,
                            struct iv_use *use, struct iv_cand *cand)
 {
-  tree comp = unshare_expr (get_computation (data->current_loop,
-                                            use, cand));
+  tree comp;
   tree op, stmts, tgt, ass;
   block_stmt_iterator bsi, pbsi;
+
+  /* An important special case -- if we are asked to express value of
+     the original iv by itself, just exit; there is no need to
+     introduce a new computation (that might also need casting the
+     variable to unsigned and back).  */
+  if (cand->pos == IP_ORIGINAL
+      && TREE_CODE (use->stmt) == MODIFY_EXPR
+      && TREE_OPERAND (use->stmt, 0) == cand->var_after)
+    {
+      op = TREE_OPERAND (use->stmt, 1);
+
+      /* Be a bit careful.  In case variable is expressed in some
+        complicated way, rewrite it so that we may get rid of this
+        complicated expression.  */
+      if ((TREE_CODE (op) == PLUS_EXPR
+          || TREE_CODE (op) == MINUS_EXPR)
+         && TREE_OPERAND (op, 0) == cand->var_before
+         && TREE_CODE (TREE_OPERAND (op, 1)) == INTEGER_CST)
+       return;
+    }
+
+  comp = unshare_expr (get_computation (data->current_loop,
+                                       use, cand));
   switch (TREE_CODE (use->stmt))
     {
     case PHI_NODE: