Ajit Agarwal <aagar...@linux.ibm.com> writes:
> Hello Richard:
> On 11/06/24 4:56 pm, Ajit Agarwal wrote:
>> Hello Richard:
>> 
>> On 11/06/24 4:36 pm, Richard Sandiford wrote:
>>> Ajit Agarwal <aagar...@linux.ibm.com> writes:
>>>>>>>> After LRA reload:
>>>>>>>>
>>>>>>>> (insn 9299 2472 2412 187 (set (reg:V2DF 51 19 [orig:240 vect__302.545 
>>>>>>>> ] [240])
>>>>>>>>         (mem:V2DF (plus:DI (reg:DI 8 8 [orig:1285 ivtmp.886 ] [1285])
>>>>>>>>                 (const_int 16 [0x10])) [1 MEM <vector(2) real(kind=8)> 
>>>>>>>> [(real(kind=8) *)_4188]+16 S16 A64])) "shell_lam.fppized.f":238:72 
>>>>>>>> 1190 {vsx_movv2df_64bit}
>>>>>>>>      (nil))
>>>>>>>> (insn 2412 9299 2477 187 (set (reg:V2DF 51 19 [orig:240 vect__302.545 
>>>>>>>> ] [240])
>>>>>>>>         (neg:V2DF (fma:V2DF (reg:V2DF 39 7 [ MEM <vector(2) 
>>>>>>>> real(kind=8)> [(real(kind=8) *)_4050]+16 ])
>>>>>>>>                 (reg:V2DF 44 12 [3119])
>>>>>>>>                 (neg:V2DF (reg:V2DF 51 19 [orig:240 vect__302.545 ] 
>>>>>>>> [240]))))) {*vsx_nfmsv2df4}
>>>>>>>>      (nil))
>>>>>>>>
>>>>>>>> (insn 2473 9311 9312 187 (set (reg:V2DF 38 6 [orig:905 vect__302.545 ] 
>>>>>>>> [905])
>>>>>>>>         (neg:V2DF (fma:V2DF (reg:V2DF 44 12 [3119])
>>>>>>>>                 (reg:V2DF 38 6 [orig:2561 MEM <vector(2) real(kind=8)> 
>>>>>>>> [(real(kind=8) *)_4050] ] [2561])
>>>>>>>>                 (neg:V2DF (reg:V2DF 47 15 [5266]))))) {*vsx_nfmsv2df4}
>>>>>>>>      (nil))
>>>>>>>>
>>>>>>>> In the above allocated code it assign registers 51 and 47 and they are 
>>>>>>>> not sequential.
>>>>>>>
>>>>>>> The reload for 2412 looks valid.  What was the original pre-reload
>>>>>>> version of insn 2473?  Also, what happened to insn 2472?  Was it 
>>>>>>> deleted?
>>>>>>>
>>>>>>
>>>>>> This is preload version of 2473:
>>>>>>
>>>>>> (insn 2473 2396 2478 161 (set (reg:V2DF 905 [ vect__302.545 ])
>>>>>>         (neg:V2DF (fma:V2DF (reg:V2DF 4283 [3119])
>>>>>>                 (subreg:V2DF (reg:OO 2561 [ MEM <vector(2) real(kind=8)> 
>>>>>> [(real(kind=8) *)_4050] ]) 0)
>>>>>>                 (neg:V2DF (subreg:V2DF (reg:OO 2572 [ vect__300.543_236 
>>>>>> ]) 0))))) {*vsx_nfmsv2df4}
>>>>>>      (expr_list:REG_DEAD (reg:OO 2572 [ vect__300.543_236 ])
>>>>>>         (expr_list:REG_DEAD (reg:OO 2561 [ MEM <vector(2) real(kind=8)> 
>>>>>> [(real(kind=8) *)_4050] ])
>>>>>>             (nil))))
>>>>>>
>>>>>> insn 2472 is replaced with 9299 after reload.
>>>>>
>>>>> You'd have to check the dumps to be sure, but I think 9299 is instead
>>>>> generated as an input reload of 2412, rather than being a replacement
>>>>> of insn 2472.  T
>>>>
>>>> Yes it is generated for 2412. The predecessor of 2412 is load from
>>>> plus offset as in 2412 we have subreg:V2DF (reg OO 2572) 16).
>>>>
>>>> This is not correct as we are not generating lxvp and it is 
>>>> normal load lxv.
>>>> As normal load is generated in predecessor insn of 2412 with
>>>> plus constant offset it breaks the correctness.
>>>
>>> Not using lxvp is a deliberate choice though.
>>>
>>> If a (reg:OO R) has been spilled, there's no requirement for LRA
>>> to load both halves of R when only one half is needed.  LRA just
>>> loads what it needs into whichever registers happen to be free.
>>>
>>> If the reload of R instead used lxvp, LRA would be forced to free
>>> up another register for the other half of R, even though that value
>>> would never be used.
>>>
>> 
>> If a (reg:OO R ) 16 is loaded when it is spilled then loaded value
>> will be from plus offset 16 instead it should be loaded value 
>> from zero offset. As in load fusion pass we are replacing
>> (reg:V2DI R) with subreg (reg:OO R) 16 and hence loaded value
>> is from plus 16 offsets and thats why its breaking the correctness.
>> 
>> Similarly we are replacing (reg:V2DI R) 16 with subreg (reg:OO R) 0
>> and loaded value is from 16 offset instead its loading from zero
>> offset and thats why we are breaking the correctness.
>> 
>
> If a (reg:OO R ) 16 is loaded when it is spilled then loaded value
> will be from plus offset 16 instead it should be loaded value 
> from zero offset. As in load fusion pass we are replacing
> (reg:V2DI R) with subreg (reg:OO R) 16 and hence loaded value
> is from plus 16 offsets instead it should load from zero offset.
> Thats why its breaking the correctness.
>  
> Similarly we are replacing (reg:V2DI R) 16 with subreg (reg:OO R) 0
> and loaded value is from 16 offset instead its loading from zero
> offset and thats why we are breaking the correctness.

I don't understand, sorry.  (subreg:V2DI (reg:OO R) 0) is always

(a) the first hard register in (reg:OO R), when the whole of R
    is stored in hard registers
(b) at address offset 0 from the start of (reg:OO R), when R is
    spilled to memory

Similarly, (subreg:V2DI (reg:OO R) 16) is always

(c) the second hard register in (reg:OO R), when the whole of R
    is stored in hard registers
(d) at address offset 16 from the start of (reg:OO R), when R is
    spilled to memory

Richard

Reply via email to