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-