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?

Unfortunately I was not able to reproduce it with current head. It is only 
triggered with the
patchset I'm working on.

-Andreas-

Reply via email to