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: LRA and CANNOT_CHANGE_MODE_CLASS


On 01/16/2015 06:47 PM, Vladimir Makarov wrote:
> 
> On 2015-01-16 12:30 PM, Andreas Krebbel wrote:
>> Hi,
>>
>> on S/390 I see invalid subregs being generated by LRA although CANNOT_CHANGE_MODE_CLASS is supposed
>> to prevent these.  The reason appears to be the code you've added with:
>>
>> commit c6a6cdaaea571860c94f9a9fe0f98c597fef7c81
>> Author: vmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>
>> Date: Tue Oct 23 15:51:41 2012 +0000
>>
>> ...
>> int
>> simplify_subreg_regno (unsigned int xregno, machine_mode xmode,
>> unsigned int offset, machine_mode ymode)
>> {
>> struct subreg_info info;
>> unsigned int yregno;
>>
>> #ifdef CANNOT_CHANGE_MODE_CLASS
>> /* Give the backend a chance to disallow the mode change. */
>> if (GET_MODE_CLASS (xmode) != MODE_COMPLEX_INT
>> && GET_MODE_CLASS (xmode) != MODE_COMPLEX_FLOAT
>> && REG_CANNOT_CHANGE_MODE_P (xregno, xmode, ymode)
>> /* We can use mode change in LRA for some transformations. */    <---
>> && ! lra_in_progress)                                            <---
>> return -1;
>>
>> ...
>>
>> In my testcase it is a subreg which is wrapped into a strict_low_part:
>>
>> ira:
>> (insn 295 294 296 39 (set (strict_low_part (subreg:SI (reg/v:TI 252 [ g ]) 4))
>> (reg:SI 108 [ D.99773 ])) /home3/andreas/patched/../gcc/gcc/ipa-icf.h:391 882 {movstrictsi}
>> (nil))
>>
>> reload:
>> (insn 295 930 931 39 (set (strict_low_part (reg:SI 16 %f0 [ g+4 ]))
>> (reg:SI 0 %r0 [orig:108 D.99773 ] [108])) /home3/andreas/patched/../gcc/gcc/ipa-icf.h:391 882
>> {movstrictsi}
>> (nil))
>>
>> Assigning an FPR here is wrong due to the differing endianess of GPRs vs FRPs.
>>
>>  From what I've seen there does not seem to be code after that in LRA which would repair this. Do you
>> have a hint how I can get this working again?
> Originally the condition ! lra_in_progress was added to deal with 
> situation of matching reloads of operands with different modes for x86.  
> LRA temporarily generates illegal subregs of pseudos to deal with such 
> situation.  Later such subregs started to be marked by LRA_SUBREG_P.
> 
> You could try to change condition !lra_in_progress to (!lra_in_progress 
> || ! LRA_SUBREG_P (original_pseudo)).  You need to pass original_pseudo 
> somehow too.  Let me know if it does not work.
> 
Looks like it was my own code which caused the problem. I've provided a movstrict pattern using a
subreg which I've otherwise suppressed by cannot_change_mode_class. LRA correctly assumed that the
subreg is allowed when accepted by the pattern. The failure is gone after removing the pattern.

Thanks for your help!

-Andreas-


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