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