https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55212
--- Comment #60 from Kazumoto Kojima <kkojima at gcc dot gnu.org> --- (In reply to Kazumoto Kojima from comment #59) > Yet another lra-assigns.c:1335 ICE when compiling nrrd/kernel.c of CSiBE/ > teem-1.6.0 test. It looks that RA fails for FPUL_REGS class. It seems that the scenario starts at insn 58 in .reload. 58: {r199:DF=float_extend(r190:SF);use :PSI;} LRA inserts a reload insn 138 before it. 138: {r261:SF=r190:SF;use :PSI;clobber scratch;0;} 58: {r199:DF=float_extend(r261:SF);use :PSI;} During inheritance/split process, LRA inserts a move insn 151 after 138 to save r190. Add save<-reg after: 151: r280:SI=r190:SF#0 where LRA assigns the hard reg fr8 to r190 and #0 means subreg:SI here. We need fpul to save the SFmode value on fr8 to SImode object and insn 58 is actually fcnvds instruction of which destination is fpul. This causes the ICE. LRA chooses SImode at insn 151 because fr8 is a caller save register and HARD_REGNO_CALLER_SAVE_MODE returns SImode for fr8 even with SFmode. SH doesn't define its specific HARD_REGNO_CALLER_SAVE_MODE and uses the default choose_hard_reg_mode (regno, nregs, false) implementation. choose_hard_reg_mode chooses mode based on HARD_REGNO_MODE_OK and returns ?Imode for float registers when sh_hard_regno_mode_ok permits integer modes on them. I guess that HARD_REGNO_CALLER_SAVE_MODE should return SFmode in this case.