https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116398
--- Comment #4 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Part of the reason why late_combine1 fails to do anything here is: ``` // Avoid increasing the complexity of instructions that // reference allocatable hard registers. if (!REG_P (SET_SRC (set)) && !reload_completed && (accesses_include_nonfixed_hard_registers (use_insn->uses ()) || accesses_include_nonfixed_hard_registers (use_insn->defs ()))) return false; ``` The `accesses_include_nonfixed_hard_registers (use_insn->defs ())` part specifically. Though I am no sure if that is too conserative. Anyways there is some missing recog here too. Also note the code generation is worse if you have: ``` void shift_53_i_(int data, __int128_t *a) { *a = (__int128_t)data << 53; } ``` (GCC 15 is only slightly worse than GCC 14 for the above).