http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59477
--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> --- (In reply to Eric Botcazou from comment #4) > > Usually combiner will reject such combination on i?86/x86_64 in the fn > > argument hard reg setup insns because of cant_combine_insn_p, but here r8 > > isn't likely spilled. Also, typically cx is initialized after r8, because > > hard register arguments are initialized from last argument to first. But in > > this case there is one argument passed in rcx/r8 pair and within a single > > argument we typically initialize the first half before the second one. > > Is rcx likely spilled? If so, the situation looks similar to the one dealt > with by likely_spilled_retval_p so maybe the machinery could be extended to > argument registers. Yes, rcx is likely spilled, just r8 isn't and there is rcx = 0; r8 = pseudo1; in that order before combine and combine is changing it to rcx = 0; r8 = pseudo2 << pseudo3;