https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55212
--- Comment #290 from John Paul Adrian Glaubitz <glaubitz at physik dot fu-berlin.de> --- (In reply to Kazumoto Kojima from comment #263) > Created attachment 59132 [details] > a patch rewriting movsh_ie_ra > > This patch splits movsf_ie_ra into several new patterns to remove > match_scratch. Also define a new sub-pattern of movdf for constant loads. > > * gcc/config/sh/predicates.md (pc_relative_load_operand): > New predicate. > * gcc/config/sh/sh-protos.h (sh_movsf_ie_ra_split_p): Remove. > (sh_movsf_ie_y_split_p): New proto. > * gcc/config/sh/sh.cc: (sh_movsf_ie_ra_split_p): Remove. > (sh_movsf_ie_y_split_p): New function. > * gcc/config/sh/sh.md (movdf_i4_F_z): New insn pattern. > (movdf): Use it. > (movsf_ie_ra): Use define_insn instead of define_insn_and_split. > (movsf_ie_F_z): Rename from movsf_ie_const_ra. > (movsf_ie_Q_z, movsf_ie_y): New insn pattern. > (movsf): Use new patterns. > (movdf_i4_F_z+7): New splitter. > > With it, now "make check-gcc" has no new ICEs with unix/-m4/-mlra when > comparing unix/-m4. I have added this patch on top of the other patches and got an ICE when bootstrapping Ada natively: a-ngcefu.adb: In function 'Ada.Numerics.Complex_Elementary_Functions.Arccos': a-ngcefu.adb:177:8: error: unable to find a register to spill a-ngcefu.adb:177:8: error: this is the insn: (insn 105 605 587 10 (parallel [ (set (reg:SF 449 [orig:184 _24 ] [184]) (reg:SF 463)) (use (reg:SI 154 fpscr0)) ]) "a-ngcefu.adb":164:17 222 {movsf_ie_ra} (expr_list:REG_DEAD (reg:SF 463) (nil))) during RTL pass: reload