http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52868

--- Comment #1 from Igor Zamyatin <izamyatin at gmail dot com> 2012-04-19 
13:09:07 UTC ---
Experimental patch that fixes the regression:

diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c
index 3c11c0e..9c04516 100644
--- a/gcc/tree-ssa-loop-ivopts.c
+++ b/gcc/tree-ssa-loop-ivopts.c
@@ -4112,6 +4112,7 @@ get_computation_cost_at (struct ivopts_data *data,
   else if (ratio == 1)
     {
       tree real_cbase = cbase;
+      int diff_cost, add_cost_val;

       /* Check to see if any adjustment is needed.  */
       if (cstepi == 0 && stmt_is_after_inc)
@@ -4131,7 +4132,19 @@ get_computation_cost_at (struct ivopts_data *data,
                              ubase, real_cbase,
                              &symbol_present, &var_present, &offset,
                              depends_on);
+      diff_cost = cost.cost;
       cost.cost /= avg_loop_niter (data->current_loop);
+      add_cost_val = add_cost (TYPE_MODE (ctype), data->speed);
+      /* do cost correction if address cost is small enough
+         and difference cost is high enough */
+      if (address_p && diff_cost > add_cost_val
+          && get_address_cost (symbol_present, var_present,
+                               offset, ratio, cstepi,
+                               TYPE_MODE (TREE_TYPE (utype)),
+                               TYPE_ADDR_SPACE (TREE_TYPE (utype)),
+                               speed, stmt_is_after_inc,
+                               can_autoinc).cost <= add_cost_val)
+        cost.cost += add_cost_val;
     }
   else if (address_p
           && !POINTER_TYPE_P (ctype)



It also fixes the bwaves regression from
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52272

Reply via email to