https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118662
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Assignee|unassigned at gcc dot gnu.org |rguenth at gcc dot gnu.org Status|NEW |ASSIGNED --- Comment #13 from Richard Biener <rguenth at gcc dot gnu.org> --- This subreg is created via /* Check for a case where we loaded from memory in a narrow mode and then sign extended it, but we need both registers. In that case, we have a PARALLEL with both loads from the same memory location. We can split this into a load from memory followed by a register-register copy. This saves at least one insn, more if register allocation can eliminate the copy. We cannot do this if the destination of the first assignment is a condition code register. We eliminate this case by making sure the SET_DEST and SET_SRC have the same mode. We cannot do this if the destination of the second assignment is a register that we have already assumed is zero-extended. Similarly for a SUBREG of such a register. */ else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0 ... SUBST (SET_SRC (newpat), gen_lowpart (GET_MODE (SET_SRC (newpat)), ni2dest)); I have a patch.