diff mbox

Cleanup interface of iv_ca_add_use and the calls to it

Message ID 000001cfc1ce$5196ba10$f4c42e30$@arm.com
State New
Headers show

Commit Message

Bin Cheng Aug. 27, 2014, 8:10 a.m. UTC
Hi,
As I analyzed in bug pr62178, current candidate selecting algorithm can't
find out the optimal solution in some scenarios.  I am trying to improve it
but before that, I need to clean up the interface of iv_ca_add_use and the
calls to it.  The two calls to the function are controlled by a boolean
argument, and the second call is always fired if the first one doesn't give
any result.  This patch encapsulates logic of the two calls into function
iv_ca_add_use and cleanups the interface.
Another change is remove the check in below code.

  gcc_assert (ivs->upto >= use->id);

  if (ivs->upto == use->id)
    {
      ivs->upto++;
      ivs->bad_uses++;
    }

It can be proved in an inductive approach that ivs->up_to always equals to
use->id at the position.

This patch does not change code logic at all, anyway, it passes bootstrap
and regtest on x86_64/x86.  So is it OK?

Thanks,
bin

2014-08-27  Bin Cheng  <bin.cheng@arm.com>

	* tree-ssa-loop-ivopts.c (iv_ca_add_use): Delete parameter
	important_candidates.  Consider all important candidates if
	IVS doesn't give any result.  Remove check on ivs->upto.
	(try_add_cand_for): Call iv_ca_add_use only once.

Comments

Richard Biener Aug. 27, 2014, 8:23 a.m. UTC | #1
On Wed, Aug 27, 2014 at 10:10 AM, Bin Cheng <bin.cheng@arm.com> wrote:
> Hi,
> As I analyzed in bug pr62178, current candidate selecting algorithm can't
> find out the optimal solution in some scenarios.  I am trying to improve it
> but before that, I need to clean up the interface of iv_ca_add_use and the
> calls to it.  The two calls to the function are controlled by a boolean
> argument, and the second call is always fired if the first one doesn't give
> any result.  This patch encapsulates logic of the two calls into function
> iv_ca_add_use and cleanups the interface.
> Another change is remove the check in below code.
>
>   gcc_assert (ivs->upto >= use->id);
>
>   if (ivs->upto == use->id)
>     {
>       ivs->upto++;
>       ivs->bad_uses++;
>     }
>
> It can be proved in an inductive approach that ivs->up_to always equals to
> use->id at the position.
>
> This patch does not change code logic at all, anyway, it passes bootstrap
> and regtest on x86_64/x86.  So is it OK?

Ok (I suppose you checked that it really generates the same code on
a set of files?)

Thanks,
Richard.

> Thanks,
> bin
>
> 2014-08-27  Bin Cheng  <bin.cheng@arm.com>
>
>         * tree-ssa-loop-ivopts.c (iv_ca_add_use): Delete parameter
>         important_candidates.  Consider all important candidates if
>         IVS doesn't give any result.  Remove check on ivs->upto.
>         (try_add_cand_for): Call iv_ca_add_use only once.
diff mbox

Patch

Index: gcc/tree-ssa-loop-ivopts.c
===================================================================
--- gcc/tree-ssa-loop-ivopts.c	(revision 214413)
+++ gcc/tree-ssa-loop-ivopts.c	(working copy)
@@ -5415,29 +5415,23 @@  iv_ca_set_cp (struct ivopts_data *data, struct iv_
 }
 
 /* Extend set IVS by expressing USE by some of the candidates in it
-   if possible. All important candidates will be considered
-   if IMPORTANT_CANDIDATES is true.  */
+   if possible.  Consider all important candidates if candidates in
+   set IVS don't give any result.  */
 
 static void
 iv_ca_add_use (struct ivopts_data *data, struct iv_ca *ivs,
-	       struct iv_use *use, bool important_candidates)
+	       struct iv_use *use)
 {
   struct cost_pair *best_cp = NULL, *cp;
   bitmap_iterator bi;
-  bitmap cands;
   unsigned i;
 
   gcc_assert (ivs->upto >= use->id);
+  ivs->upto++;
+  ivs->bad_uses++;
 
-  if (ivs->upto == use->id)
+  EXECUTE_IF_SET_IN_BITMAP (ivs->cands, 0, i, bi)
     {
-      ivs->upto++;
-      ivs->bad_uses++;
-    }
-
-  cands = (important_candidates ? data->important_candidates : ivs->cands);
-  EXECUTE_IF_SET_IN_BITMAP (cands, 0, i, bi)
-    {
       struct iv_cand *cand = iv_cand (data, i);
 
       cp = get_use_iv_cost (data, use, cand);
@@ -5445,6 +5439,17 @@  iv_ca_add_use (struct ivopts_data *data, struct iv
       if (cheaper_cost_pair (cp, best_cp))
 	best_cp = cp;
     }
+
+  if (best_cp == NULL)
+    {
+      EXECUTE_IF_SET_IN_BITMAP (data->important_candidates, 0, i, bi)
+	{
+	  cand = iv_cand (data, i);
+	  cp = get_use_iv_cost (data, use, cand);
+	  if (cheaper_cost_pair (cp, best_cp))
+	    best_cp = cp;
+	}
+    }
 
   iv_ca_set_cp (data, ivs, use, best_cp);
 }
@@ -5878,18 +5883,9 @@  try_add_cand_for (struct ivopts_data *data, struct
   struct iv_ca_delta *best_delta = NULL, *act_delta;
   struct cost_pair *cp;
 
-  iv_ca_add_use (data, ivs, use, false);
+  iv_ca_add_use (data, ivs, use);
   best_cost = iv_ca_cost (ivs);
-
   cp = iv_ca_cand_for_use (ivs, use);
-  if (!cp)
-    {
-      ivs->upto--;
-      ivs->bad_uses--;
-      iv_ca_add_use (data, ivs, use, true);
-      best_cost = iv_ca_cost (ivs);
-      cp = iv_ca_cand_for_use (ivs, use);
-    }
   if (cp)
     {
       best_delta = iv_ca_delta_add (use, NULL, cp, NULL);