https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105930
--- Comment #25 from Jakub Jelinek <jakub at gcc dot gnu.org> --- (In reply to Linus Torvalds from comment #23) > (In reply to Jakub Jelinek from comment #22) > > > > If the wider registers are narrowed before register allocation, it is just > > a pair like (reg:SI 123) (reg:SI 256) and it can be allowed anywhere. > > That was more what I was thinking - why is the DImode information being kept > so long? This is what is being discussed here. Some possibilities are lower these multi-word operations during expansion from GIMPLE to RTL (after all, the generic code usually does that without anything special needed on the backend side unless one declares the backend can do that better), one counter-argument to that is the x86 STV pass which uses vector operations for 2 word operations when possible and it won't really work when it is lowered during expansion. Another is splitting those before register allocation, which is what some patterns did and what other patterns didn't. Or it can be split after register allocation. My understanding was that Roger tried to change some patterns from splitting after RA to before RA and it didn't improve this testcase, so in the end changed some other patterns from splitting before RA to after RA.