This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Paradoxical subreg reload issue


09/05/2012 11:16, Eric Botcazou:
>> I have another issue in DCE pass after changing word_mode from SImode to
>> HImode.
>> Indeed, in subreg1 pass, SI moves such as
>> ...
>> (insn 42 41 43 (set (reg:SI 85) (reg/f:SI 83))
>> (insn 46 45 47 (set (reg:SI 8 a1) (reg:SI 85))
>>
>> are split into HImode word moves:
>> ...
>> (insn 98 97 99 2 (set (subreg:HI (reg:SI 106) 0) (reg:HI 104))
>> (insn 99 98 100 2 (set (subreg:HI (reg:SI 106) 2) (reg:HI 105 [+2 ]))
>> (insn 100 99 47 2 (set (reg:SI 8 a1) (reg:SI 106))
>>
>> Looking at DCE pass in (dce_process_block), it seems that when reverse
>> parsing the block insns for dead set eliminations, the liveness of reg
>> 106 which is set when parsing insn 100, is removed when parsing insn 99.
>> So the insn 98 is deleted because the reg 106 is not seen live anymore...
>>
>> Is it a bug, or is it because it is not possible to have hardware
>> registers which are not splittable in word_mode? Any thoughts?
> 
> Yes, this looks like a bug, since the SET in insn 99 doesn't modify the high
> part of the multi-word (reg:SI 106), as per the documented rules for SUBREG.
> 

It was a backend bug...
When trying to workaround the first reload bug, I defined
REGMODE_NATURAL_SIZE to return a mode rather than a mode size, which
makes DF_REF_PARTIAL not being set for (subreg:HI (reg:SI 106) 0).

Sorry about that, and thank you for pointing the DCE bug out.
Aurélien


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]