diff mbox

[loop2_invariant,2/2] Change heuristics for identical invariants

Message ID CACgzC7BZtZRf0B0f=mXMJu6nKVQLv_H2entC5xpRRdnQ8r4uSg@mail.gmail.com
State New
Headers show

Commit Message

Zhenqiang Chen July 1, 2014, 7:16 a.m. UTC
On 10 June 2014 19:16, Steven Bosscher <stevenb.gcc@gmail.com> wrote:
> On Tue, Jun 10, 2014 at 11:23 AM, Zhenqiang Chen wrote:
>>         * loop-invariant.c (struct invariant): Add a new member: eqno;
>>         (find_identical_invariants): Update eqno;
>>         (create_new_invariant): Init eqno;
>>         (get_inv_cost): Compute comp_cost wiht eqno;
>>         (gain_for_invariant): Take spill cost into account.
>
> Look OK except ...
>
>> @@ -1243,7 +1256,13 @@ gain_for_invariant (struct invariant *inv,
>> unsigned *regs_needed,
>>                  + IRA_LOOP_RESERVED_REGS
>>                  - ira_class_hard_regs_num[cl];
>>        if (size_cost > 0)
>> -       return -1;
>> +       {
>> +         int spill_cost = target_spill_cost [speed] * (int) regs_needed[cl];
>> +         if (comp_cost <= spill_cost)
>> +           return -1;
>> +
>> +         return 2;
>> +       }
>>        else
>>         size_cost = 0;
>>      }
>
> ... why "return 2", instead of just falling through to "return
> comp_cost - size_cost;"?

The updated patch removes the check on spill cost since the check
seams not sound and tests show it does not help much on the result.

Bootstrap and no make check regression on X86-64.

OK for trunk?

Thanks!
-Zhenqiang

ChangeLog:
2014-07-01  Zhenqiang Chen  <zhenqiang.chen@linaro.org>

        * loop-invariant.c (struct invariant): Add a new member: eqno;
        (find_identical_invariants): Update eqno;
        (create_new_invariant): Init eqno;
        (get_inv_cost): Compute comp_cost wiht eqno;

     return;
@@ -513,7 +517,12 @@ find_identical_invariants (invariant_htab_type
*eq, struct invariant *inv)
   mode = GET_MODE (expr);
   if (mode == VOIDmode)
     mode = GET_MODE (SET_DEST (set));
-  inv->eqto = find_or_insert_inv (eq, expr, mode, inv)->invno;
+
+  tmp = find_or_insert_inv (eq, expr, mode, inv);
+  inv->eqto = tmp->invno;
+
+  if (tmp->invno != inv->invno && inv->always_executed)
+    tmp->eqno++;

   if (dump_file && inv->eqto != inv->invno)
     fprintf (dump_file,
@@ -722,6 +731,10 @@ create_new_invariant (struct def *def, rtx insn,
bitmap depends_on,

   inv->invno = invariants.length ();
   inv->eqto = ~0u;
+
+  /* Itself.  */
+  inv->eqno = 1;
+
   if (def)
     def->invno = inv->invno;
   invariants.safe_push (inv);
@@ -1136,7 +1149,7 @@ get_inv_cost (struct invariant *inv, int
*comp_cost, unsigned *regs_needed,

   if (!inv->cheap_address
       || inv->def->n_addr_uses < inv->def->n_uses)
-    (*comp_cost) += inv->cost;
+    (*comp_cost) += inv->cost * inv->eqno;

 #ifdef STACK_REGS
   {

Comments

Jeff Law July 1, 2014, 7:54 p.m. UTC | #1
On 07/01/14 01:16, Zhenqiang Chen wrote:

>
> ChangeLog:
> 2014-07-01  Zhenqiang Chen  <zhenqiang.chen@linaro.org>
>
>          * loop-invariant.c (struct invariant): Add a new member: eqno;
>          (find_identical_invariants): Update eqno;
>          (create_new_invariant): Init eqno;
>          (get_inv_cost): Compute comp_cost wiht eqno;
s/wiht/with/

Do you have a testcase for this?  If at all possible I'd like to see 
some kind of test to verify that this tracking results in better 
invariant selection.

With some kind of test and the ChangeLog typo fixed, this is OK.

jeff
diff mbox

Patch

diff --git a/gcc/loop-invariant.c b/gcc/loop-invariant.c
index d47d461..bd67eb9 100644
--- a/gcc/loop-invariant.c
+++ b/gcc/loop-invariant.c
@@ -104,6 +104,9 @@  struct invariant
   /* The number of the invariant with the same value.  */
   unsigned eqto;

+  /* The number of invariants which eqto this.  */
+  unsigned eqno;
+
   /* If we moved the invariant out of the loop, the register that contains its
      value.  */
   rtx reg;
@@ -498,6 +501,7 @@  find_identical_invariants (invariant_htab_type
*eq, struct invariant *inv)
   struct invariant *dep;
   rtx expr, set;
   enum machine_mode mode;
+  struct invariant *tmp;

   if (inv->eqto != ~0u)