[Bug middle-end/59470] [4.8 Regression] libstdc++ miscompilation after r205709
vmakarov at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Dec 12 02:01:00 GMT 2013
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]
More information about the Gcc-bugs
mailing list