http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56195
--- Comment #7 from Vladimir Makarov <vmakarov at redhat dot com> 2013-02-07 20:08:47 UTC --- (In reply to comment #6) > Actually, that one doesn't really work, because we have pseudo rather than > hard > reg at that point, which will never simplify. > > With this: > > --- lra-constraints.c.jj 2013-02-07 18:34:39.000000000 +0100 > +++ lra-constraints.c 2013-02-07 20:58:25.558920536 +0100 > @@ -421,8 +421,20 @@ get_reload_reg (enum op_type type, enum > if (rtx_equal_p (curr_insn_input_reloads[i].input, original) > && in_class_p (curr_insn_input_reloads[i].reg, rclass, &new_class)) > { > - *result_reg = curr_insn_input_reloads[i].reg; > - regno = REGNO (*result_reg); > + rtx reg = curr_insn_input_reloads[i].reg; > + regno = REGNO (reg); > + /* If input is equal to original and both are VOIDmode, > + GET_MODE (reg) might be still different from mode. > + Ensure we don't return *result_reg with wrong mode. */ > + if (GET_MODE (reg) != mode) > + { > + if (GET_MODE_SIZE (GET_MODE (reg)) < GET_MODE_SIZE (mode)) > + continue; > + reg = lowpart_subreg (mode, reg, GET_MODE (reg)); > + if (reg == NULL_RTX || GET_CODE (reg) != SUBREG) > + continue; > + } > + *result_reg = reg; > if (lra_dump_file != NULL) > { > fprintf (lra_dump_file, " Reuse r%d for reload ", regno); > > the assembly difference is: > > - cmpl (%rdi), %rdi > + cmpl (%rdi), %edi > > which is desirable in this case, but not sure if all get_reload_reg callers > will grok a SUBREG instead of REG returned in *result_reg. This version of patch looks ok for me. I have no worry about get_reload_reg callers. It should work fine (that is a difference from reload pass when you should care about secondary reloads etc). Thanks for working on this, Jakub,