https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88856
--- Comment #22 from Jakub Jelinek <jakub at gcc dot gnu.org> --- What we could do there is remove the first of those two splitters, remove the && !dead_or_set_p (insn, operands[1]) test from the second, and add peephole2 that would transform (set (access part 1) (subreg:SI (match_dup 1) low)) (set (match_dup 1) (rotate:DI (match_dup 1) (const_int 32))) (set (access part 2) (subreg:SI (match_dup 1) low)) with a lshiftrt instead of rotate if reg 1 is dead after the third insn (assuming rotate is more expensive as right shift, if it is the same expensive/same size, then having the two splitters makes no sense). The last rotate should have been removed by DCE already if it was truly dead (though, of course, if it for some reason isn't yet, you could have another peephole2 for that too).