https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70245
--- Comment #10 from Jakub Jelinek <jakub at gcc dot gnu.org> --- (In reply to Uroš Bizjak from comment #9) > Please disable the pattern for gcc-6, and let's fix replace_rtx for gcc-7. Disabling the peephole2 entirely would be too aggressive, if we want to avoid the problems with that, we could as well just guard it with && !reg_overlap_mentioned_p (operands[0], operands[2]) or perhaps even allow simple cases like: && (!reg_overlap_mentioned_p (operands[0], operands[2]) || rtx_equal_p (operands[0], XEXP (operands[2], 0))) and in that case of simple REG just replace_equiv_address. But, the simplify_replace_rtx patch I've attached will do pretty much the same, it will try to do the peephole2, and punt if the result is not valid address. simplify_replace_rtx doesn't simplify anything if there is no change, so e.g. the !reg_overlap_mentioned_p (operands[0], operands[2]) case would always work as it used to. Though, I'm worried about all the other replace_rtx uses in the backends: config/epiphany/epiphany.md: replace_rtx (operands[2], operands[9], operands[3]); config/epiphany/epiphany.md: replace_rtx (operands[2], operands[0], operands[10]); config/i386/i386.c: replace_rtx (DF_REF_INSN (ref), reg, scopy); config/rl78/rl78.c: OP (op) = replace_rtx (OP (op), gen_rtx_REG (HImode, SP_REG), HL); config/rs6000/rs6000.c: real = replace_rtx (real, reg2, rreg); config/rs6000/rs6000.c: real = replace_rtx (real, reg, config/sh/sh.md: replace_rtx (operands[4], operands[0], operands[1]); config/xtensa/xtensa.c: PATTERN (insn) = replace_rtx (copy_rtx (PATTERN (insn)), The i386.c one is fine, reg is a pseudo, and there should be pointer equivalency for pseudos I think. What about all the others?