http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59470
--- Comment #12 from Vladimir Makarov <vmakarov at gcc dot gnu.org> --- (In reply to Jakub Jelinek from comment #9) > In -fdump-rtl-reload-slim we have incorrect: > > 92: {sp:SI=sp:SI-0x30;clobber flags:CC;} > 94: {dx:SI=sp:SI+0x2f;clobber flags:CC;} > 95: NOTE_INSN_DELETED > 96: {dx:SI=dx:SI&0xfffffffffffffff0;clobber flags:CC;} > ... > 441: [bp:SI-0x2c]=dx:SI > REG_DEAD dx:SI > ... > 442: dx:SI=[bp:SI-0x2c] > 152: {dx:SI=dx:SI-cx:SI;clobber flags:CC;} > REG_DEAD dx:SI > 153: ax:SI=dx:SI+0x14 > REG_DEAD dx:SI > 461: [bp:SI-0x2c]=ax:SI > REG_DEAD ax:SI > ... > 164: {sp:SI=sp:SI-ax:SI;clobber flags:CC;} > REG_DEAD ax:SI > 166: {ax:SI=sp:SI+0x2f;clobber flags:CC;} > 167: NOTE_INSN_DELETED > 168: {ax:SI=ax:SI&0xfffffffffffffff0;clobber flags:CC;} > 170: {ax:SI=ax:SI+0x2;clobber flags:CC;} > REG_DEAD ax:SI > 423: dx:SI=ax:SI > REG_DEAD ax:SI > ... > 174: [sp:SI+0x1c]=cx:SI > REG_DEAD cx:SI > REG_EQUAL frame:SI-0x8 > 460: dx:SI=[bp:SI-0x2c] > 175: [sp:SI+0x18]=dx:SI > REG_DEAD dx:SI > 444: [bp:SI-0x2c]=dx:SI > 425: dx:SI=dx:SI > REG_DEAD dx:SI > 176: [sp:SI+0x14]=dx:SI > REG_DEAD dx:SI > 177: [sp:SI+0x10]=si:SI > 178: dx:SI=sign_extend([di:SI+0x25]) > REG_EQUIV [sp:SI+0xc] > 179: [sp:SI+0xc]=dx:SI > REG_DEAD dx:SI > 180: [sp:SI+0x8]=ax:SI > REG_DEAD ax:SI > 426: cx:SI=[bp:SI-0x54] > 181: [sp:SI+0x4]=cx:SI > REG_DEAD cx:SI > 427: cx:SI=[bp:SI-0x48] > 182: [sp:SI]=cx:SI > REG_DEAD cx:SI > 183: call > [`_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE12_M_group_int > EPKcjcRSt8ios_basePcS9_Ri'] argc:0x20 > > The bug I see is in the 460/444 reloads for insn 175. The correct value > that insn 176 is supposed to store is live in edx register iup to insn 174, > but LRA? decides to throw away it's value when reloading insn 175 and loads > there the value of former pseudo r59 from [bp-0x2c], stores that correctly > into [sp+0x18] and saves to [bp-0x2c] again (why? the value hasn't really > changed). But the old edx (pseudo r82) is lost. Vlad, can you please have > a look? The generated code is wrong. The added patch fixes it but it does not fix libstdc++11 regressions. The path results in the following code generation: 170: {ax:SI=ax:SI+0x2;clobber flags:CC;} REG_DEAD ax:SI 423: dx:SI=ax:SI REG_DEAD ax:SI 446: NOTE_INSN_DELETED 171: ax:SI=[di:SI+0xc] 172: cx:SI=[di:SI+0x8] 424: [bp:SI-0x54]=cx:SI REG_DEAD cx:SI 470: NOTE_INSN_DELETED 445: NOTE_INSN_DELETED 173: {cx:SI=bp:SI-0x20;clobber flags:CC;} REG_EQUIV frame:SI-0x8 174: [sp:SI+0x1c]=cx:SI REG_DEAD cx:SI REG_EQUAL frame:SI-0x8 460: cx:SI=[bp:SI-0x2c] 175: [sp:SI+0x18]=cx:SI REG_DEAD cx:SI 444: [bp:SI-0x2c]=dx:SI 425: dx:SI=dx:SI REG_DEAD dx:SI 176: [sp:SI+0x14]=dx:SI REG_DEAD dx:SI 177: [sp:SI+0x10]=si:SI 178: dx:SI=sign_extend([di:SI+0x25]) REG_EQUIV [sp:SI+0xc] 179: [sp:SI+0xc]=dx:SI REG_DEAD dx:SI 180: [sp:SI+0x8]=ax:SI REG_DEAD ax:SI 426: cx:SI=[bp:SI-0x54] 181: [sp:SI+0x4]=cx:SI REG_DEAD cx:SI 427: cx:SI=[bp:SI-0x48] 182: [sp:SI]=cx:SI REG_DEAD cx:SI 183: call [`_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE12_M_group_intEPKcjcRSt8ios_basePcS9_Ri'] argc:0x20 184: cx:SI=[bp:SI-0x20]