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


Le 03/05/2012 14:14, Aurelien Buhrig a écrit :
> 02/05/2012 21:36, Eric Botcazou :
>>> I have an issue (gcc 4.6.3, private bacakend) when reloading operands of
>>> this insn:
>>> (set (subreg:SI (reg:QI 21 [ iftmp.1 ]) 0)
>>>      (lshiftrt:SI (reg/v:SI 24 [ w ]) (const_int 31 [0x1f]))
>>>
>>> The register 21 is reloaded into
>>> (reg:QI 0 r0 [orig:21 iftmp.1 ] [21]), which is a HI-wide hw register.
>>> Since it is a BIG_ENDIAN target, the SI subreg regno is then -1.
>>>
>>> Note that word_mode is SImode, whereas the class r0 belongs to is
>>> HI-wide. I don't know if this matters when reloading.
>>>
>>> I have no idea how to debug this, if it is a backend or a reload bug.
>>
>> RA/reload is known to have issues with word-mode paradoxical subregs on 
>> big-endian machines.  For example, on SPARC 64-bit, we run into similar 
>> problems for FP regs, which are 32-bit.  Likewise on HP-PA 64-bit I think.
>>
>> So we have kludges in the back-end:
>>
>> /* Defines invalid mode changes.  Borrowed from the PA port.
>>
>>    SImode loads to floating-point registers are not zero-extended.
>>    The definition for LOAD_EXTEND_OP specifies that integer loads
>>    narrower than BITS_PER_WORD will be zero-extended.  As a result,
>>    we inhibit changes from SImode unless they are to a mode that is
>>    identical in size.
>>
>>    Likewise for SFmode, since word-mode paradoxical subregs are
>>    problematic on big-endian architectures.  */
>>
>> #define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS)		\
>>   (TARGET_ARCH64						\
>>    && GET_MODE_SIZE (FROM) == 4					\
>>    && GET_MODE_SIZE (TO) != 4					\
>>    ? reg_classes_intersect_p (CLASS, FP_REGS) : 0)
>>
> 
> 
> I modified CANNOT_CHANGE_MODE_CLASS as you suggested. But strange as it
> may seem, it has no effect on such a reload, and I can't find a way to
> make it work...
> 
> BTW, has this bug already been filed?
> Do you have an idea how deep is this bug in the reload, how complex it
> is and which part in the reload it is related to?
> 
> Thanks,
> Aurélien


It seems the paradoxical subreg information is not available from
ira_allocno_t nor ira_object_t when choosing the hw reg.

I finally changed word_mode to the smallest hw reg size (HImode) to work
around this bug.

Aurélien


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