* tree-ssa-loop-ivopts.c (iv_ca_narrow): New parameter.
authoramker <amker@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 11 Jan 2014 09:33:39 +0000 (09:33 +0000)
committeramker <amker@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 11 Jan 2014 09:33:39 +0000 (09:33 +0000)
Start narrowing with START.  Apply candidate-use pair
and check overall cost in narrowing.
(iv_ca_prune): Pass new argument.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@206552 138bc75d-0d04-0410-961f-82ee72b054a4

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

index c554609..a66a01d 100644 (file)
@@ -1,3 +1,10 @@
+2014-01-11  Bin Cheng  <bin.cheng@arm.com>
+
+       * tree-ssa-loop-ivopts.c (iv_ca_narrow): New parameter.
+       Start narrowing with START.  Apply candidate-use pair
+       and check overall cost in narrowing.
+       (iv_ca_prune): Pass new argument.
+
 2014-01-10  Jeff Law  <law@redhat.com>
 
        PR middle-end/59743
index 483b4d0..2d96fce 100644 (file)
@@ -5733,18 +5733,20 @@ iv_ca_extend (struct ivopts_data *data, struct iv_ca *ivs,
 }
 
 /* Try narrowing set IVS by removing CAND.  Return the cost of
-   the new set and store the differences in DELTA.  */
+   the new set and store the differences in DELTA.  START is
+   the candidate with which we start narrowing.  */
 
 static comp_cost
 iv_ca_narrow (struct ivopts_data *data, struct iv_ca *ivs,
-             struct iv_cand *cand, struct iv_ca_delta **delta)
+             struct iv_cand *cand, struct iv_cand *start,
+             struct iv_ca_delta **delta)
 {
   unsigned i, ci;
   struct iv_use *use;
   struct cost_pair *old_cp, *new_cp, *cp;
   bitmap_iterator bi;
   struct iv_cand *cnd;
-  comp_cost cost;
+  comp_cost cost, best_cost, acost;
 
   *delta = NULL;
   for (i = 0; i < n_iv_uses (data); i++)
@@ -5755,13 +5757,15 @@ iv_ca_narrow (struct ivopts_data *data, struct iv_ca *ivs,
       if (old_cp->cand != cand)
        continue;
 
-      new_cp = NULL;
+      best_cost = iv_ca_cost (ivs);
+      /* Start narrowing with START.  */
+      new_cp = get_use_iv_cost (data, use, start);
 
       if (data->consider_all_candidates)
        {
          EXECUTE_IF_SET_IN_BITMAP (ivs->cands, 0, ci, bi)
            {
-             if (ci == cand->id)
+             if (ci == cand->id || (start && ci == start->id))
                continue;
 
              cnd = iv_cand (data, ci);
@@ -5770,20 +5774,21 @@ iv_ca_narrow (struct ivopts_data *data, struct iv_ca *ivs,
              if (!cp)
                continue;
 
-             if (!iv_ca_has_deps (ivs, cp))
-                continue; 
+             iv_ca_set_cp (data, ivs, use, cp);
+             acost = iv_ca_cost (ivs);
 
-             if (!cheaper_cost_pair (cp, new_cp))
-               continue;
-
-             new_cp = cp;
+             if (compare_costs (acost, best_cost) < 0)
+               {
+                 best_cost = acost;
+                 new_cp = cp;
+               }
            }
        }
       else
        {
          EXECUTE_IF_AND_IN_BITMAP (use->related_cands, ivs->cands, 0, ci, bi)
            {
-             if (ci == cand->id)
+             if (ci == cand->id || (start && ci == start->id))
                continue;
 
              cnd = iv_cand (data, ci);
@@ -5791,15 +5796,19 @@ iv_ca_narrow (struct ivopts_data *data, struct iv_ca *ivs,
              cp = get_use_iv_cost (data, use, cnd);
              if (!cp)
                continue;
-             if (!iv_ca_has_deps (ivs, cp))
-               continue;
 
-             if (!cheaper_cost_pair (cp, new_cp))
-               continue;
+             iv_ca_set_cp (data, ivs, use, cp);
+             acost = iv_ca_cost (ivs);
 
-             new_cp = cp;
+             if (compare_costs (acost, best_cost) < 0)
+               {
+                 best_cost = acost;
+                 new_cp = cp;
+               }
            }
        }
+      /* Restore to old cp for use.  */
+      iv_ca_set_cp (data, ivs, use, old_cp);
 
       if (!new_cp)
        {
@@ -5841,7 +5850,7 @@ iv_ca_prune (struct ivopts_data *data, struct iv_ca *ivs,
       if (cand == except_cand)
        continue;
 
-      acost = iv_ca_narrow (data, ivs, cand, &act_delta);
+      acost = iv_ca_narrow (data, ivs, cand, except_cand, &act_delta);
 
       if (compare_costs (acost, best_cost) < 0)
        {