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).