https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92140
--- Comment #29 from Segher Boessenkool <segher at gcc dot gnu.org> --- (In reply to Uroš Bizjak from comment #27) > FYI, these constraints were used in the past (when combine was allowed to > propagate hard registers into combined insn) to prevent reload failures, > where reload was not able to e.g. reload wrong hard reg in the place of > count reg in the shift insn pattern to %ecx. Nowadays, constraints in the > patterns of pre-reload insn_and_split are not necessary anymore, and can be > removed together with ix86_legitimate_combined_insn target hook. combine still propagates hard registers. The only thing it does not combine is single-set register-register copies from a non-fixed hard register; everything else with hard registers it still does, like if the *destination* of the move is a hard reg (e.g., in the function return value). Does it help the i386 port if we disallow a hard reg dest as well? RA should be able to handle that just fine as well. This still will not get rid of *all* (non-fixed) hard registers, you still can get them from explicit register variables, and target code (or even generic code) can still put some in non-copies, which combine will happily propagate further.