https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85755
Segher Boessenkool <segher at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2018-05-12 Ever confirmed|0 |1 --- Comment #1 from Segher Boessenkool <segher at gcc dot gnu.org> --- Before RA it is all just fine: insn_cost 4 for 14: [++r121:DI]=r122:DI REG_INC r121:DI insn_cost 4 for 15: r122:DI=r122:DI+0x1 insn_cost 0 for 30: {pc={(r129:DI!=0x1)?L16:pc};r129:DI=r129:DI-0x1;clobber scratch;clobber scratch;} REG_BR_PROB 955630228 IRA make a good choice: Disposition: 3:r121 l0 3 0:r122 l0 9 4:r125 l0 3 2:r126 l0 4 5:r127 l0 68 1:r129 l0 66 and then LRA comes along: Choosing alt 6 in insn 14: (0) ^m (1) d {*movdi_internal64} Creating newreg=132 from oldreg=122, assigning class FLOAT_REGS to r132 14: [++r121:DI]=r132:DI REG_INC r121:DI Inserting insn reload before: 35: r132:DI=r122:DI We want to have alt 0 instead (r -> YZ), which gives 0 Non input pseudo reload: reject++ alt=0,overall=7,losers=1,rld_nregs=0 but we get alt 6 (d -> ^m), which gives alt=6,overall=6,losers=1,rld_nregs=1 Putting the disparagement on the correct operand, i.e. as ^d -> m gives alt=6,overall=12,losers=1 -- refuse and we should make that change; but yes we want an stdu, too. Should "Y" allow that? GCC 7 did this fine; GCC 8 of a month ago, too. What changed?