[GCC8,28/33] Don't count non-interger PHIs for register pressure

Message ID VI1PR0802MB21768BD089A0E74CD6143825E7190@VI1PR0802MB2176.eurprd08.prod.outlook.com
State New
Headers show

Commit Message

Bin Cheng April 18, 2017, 10:52 a.m.
Hi,
Given only integer variables are meaningful for register pressure estimation in IVOPTs,
this patch skips non-integer type PHIs when counting register pressure.
Is it OK?
Thanks,
bin

2017-04-11  Bin Cheng  <bin.cheng@arm.com>

	* tree-ssa-loop-ivopts.c (determine_set_costs): Skip non-interger
	when counting register pressure.
From ea74dcacc97e4aee0de952dc0142d71502cc5252 Mon Sep 17 00:00:00 2001
From: Bin Cheng <binche01@e108451-lin.cambridge.arm.com>
Date: Tue, 7 Mar 2017 16:26:27 +0000
Subject: [PATCH 28/33] skip-non_int-phi-reg-pressure-20170221.txt

---
 gcc/tree-ssa-loop-ivopts.c | 3 +++
 1 file changed, 3 insertions(+)

Comments

Richard Biener April 26, 2017, 1:32 p.m. | #1
On Tue, Apr 18, 2017 at 12:52 PM, Bin Cheng <Bin.Cheng@arm.com> wrote:
> Hi,
> Given only integer variables are meaningful for register pressure estimation in IVOPTs,
> this patch skips non-integer type PHIs when counting register pressure.
> Is it OK?

Huh.  I suppose it only makes a difference because you are ignoring
POINTER_TYPE_P
IVs?  At least I would be surprised if get_iv returns true for float
or vector PHIs (yeah, see
early out in get_iv)?  So why exclude POINTER_TYPE_P IVs?

Richard.

> Thanks,
> bin
>
> 2017-04-11  Bin Cheng  <bin.cheng@arm.com>
>
>         * tree-ssa-loop-ivopts.c (determine_set_costs): Skip non-interger
>         when counting register pressure.
>
Bin.Cheng April 26, 2017, 1:37 p.m. | #2
On Wed, Apr 26, 2017 at 2:32 PM, Richard Biener
<richard.guenther@gmail.com> wrote:
> On Tue, Apr 18, 2017 at 12:52 PM, Bin Cheng <Bin.Cheng@arm.com> wrote:
>> Hi,
>> Given only integer variables are meaningful for register pressure estimation in IVOPTs,
>> this patch skips non-integer type PHIs when counting register pressure.
>> Is it OK?
>
> Huh.  I suppose it only makes a difference because you are ignoring
> POINTER_TYPE_P
> IVs?  At least I would be surprised if get_iv returns true for float
> or vector PHIs (yeah, see
> early out in get_iv)?  So why exclude POINTER_TYPE_P IVs?
Hmm, but if get_iv returns non-NULL, the phi won't be counted because
loop is continued?  Actually, all IV and invariants are skipped by
checking get_iv, so this is only to skip floating point phis.

Thanks,
bin
>
> Richard.
>
>> Thanks,
>> bin
>>
>> 2017-04-11  Bin Cheng  <bin.cheng@arm.com>
>>
>>         * tree-ssa-loop-ivopts.c (determine_set_costs): Skip non-interger
>>         when counting register pressure.
>>
Richard Biener April 26, 2017, 2:23 p.m. | #3
On Wed, Apr 26, 2017 at 3:37 PM, Bin.Cheng <amker.cheng@gmail.com> wrote:
> On Wed, Apr 26, 2017 at 2:32 PM, Richard Biener
> <richard.guenther@gmail.com> wrote:
>> On Tue, Apr 18, 2017 at 12:52 PM, Bin Cheng <Bin.Cheng@arm.com> wrote:
>>> Hi,
>>> Given only integer variables are meaningful for register pressure estimation in IVOPTs,
>>> this patch skips non-integer type PHIs when counting register pressure.
>>> Is it OK?
>>
>> Huh.  I suppose it only makes a difference because you are ignoring
>> POINTER_TYPE_P
>> IVs?  At least I would be surprised if get_iv returns true for float
>> or vector PHIs (yeah, see
>> early out in get_iv)?  So why exclude POINTER_TYPE_P IVs?
> Hmm, but if get_iv returns non-NULL, the phi won't be counted because
> loop is continued?  Actually, all IV and invariants are skipped by
> checking get_iv, so this is only to skip floating point phis.

Err, but AFAICS get_iv will return non-NULL for POINTER_TYPE_P IVs
which you then skip by your added

+      if (!INTEGRAL_TYPE_P (TREE_TYPE (op)))
+       continue;

thus float IVs are always skipped by means if get_iv returning NULL.

Oh, the get_iv check continues for non-NULL result ... so it makes sense.
But still, why exclude POINTER_TYPE_P non-IV ops?

Richard.

> Thanks,
> bin
>>
>> Richard.
>>
>>> Thanks,
>>> bin
>>>
>>> 2017-04-11  Bin Cheng  <bin.cheng@arm.com>
>>>
>>>         * tree-ssa-loop-ivopts.c (determine_set_costs): Skip non-interger
>>>         when counting register pressure.
>>>
Bin.Cheng April 26, 2017, 2:32 p.m. | #4
On Wed, Apr 26, 2017 at 3:23 PM, Richard Biener
<richard.guenther@gmail.com> wrote:
> On Wed, Apr 26, 2017 at 3:37 PM, Bin.Cheng <amker.cheng@gmail.com> wrote:
>> On Wed, Apr 26, 2017 at 2:32 PM, Richard Biener
>> <richard.guenther@gmail.com> wrote:
>>> On Tue, Apr 18, 2017 at 12:52 PM, Bin Cheng <Bin.Cheng@arm.com> wrote:
>>>> Hi,
>>>> Given only integer variables are meaningful for register pressure estimation in IVOPTs,
>>>> this patch skips non-integer type PHIs when counting register pressure.
>>>> Is it OK?
>>>
>>> Huh.  I suppose it only makes a difference because you are ignoring
>>> POINTER_TYPE_P
>>> IVs?  At least I would be surprised if get_iv returns true for float
>>> or vector PHIs (yeah, see
>>> early out in get_iv)?  So why exclude POINTER_TYPE_P IVs?
>> Hmm, but if get_iv returns non-NULL, the phi won't be counted because
>> loop is continued?  Actually, all IV and invariants are skipped by
>> checking get_iv, so this is only to skip floating point phis.
>
> Err, but AFAICS get_iv will return non-NULL for POINTER_TYPE_P IVs
> which you then skip by your added
>
> +      if (!INTEGRAL_TYPE_P (TREE_TYPE (op)))
> +       continue;
>
> thus float IVs are always skipped by means if get_iv returning NULL.
>
> Oh, the get_iv check continues for non-NULL result ... so it makes sense.
> But still, why exclude POINTER_TYPE_P non-IV ops?
POINTER_TYPE_P is simply an overlook,  will update patch.

Thanks,
bin
>
> Richard.
>
>> Thanks,
>> bin
>>>
>>> Richard.
>>>
>>>> Thanks,
>>>> bin
>>>>
>>>> 2017-04-11  Bin Cheng  <bin.cheng@arm.com>
>>>>
>>>>         * tree-ssa-loop-ivopts.c (determine_set_costs): Skip non-interger
>>>>         when counting register pressure.
>>>>

Patch

diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c
index 0b9170c..db8254c 100644
--- a/gcc/tree-ssa-loop-ivopts.c
+++ b/gcc/tree-ssa-loop-ivopts.c
@@ -5583,6 +5583,9 @@  determine_set_costs (struct ivopts_data *data)
       if (get_iv (data, op))
 	continue;
 
+      if (!INTEGRAL_TYPE_P (TREE_TYPE (op)))
+	continue;
+
       n++;
     }