|
Archives
D Programming
DD.gnu digitalmars.D digitalmars.D.bugs digitalmars.D.dtl digitalmars.D.dwt digitalmars.D.announce digitalmars.D.learn digitalmars.D.debugger C/C++ Programming
c++c++.announce c++.atl c++.beta c++.chat c++.command-line c++.dos c++.dos.16-bits c++.dos.32-bits c++.idde c++.mfc c++.rtl c++.stl c++.stl.hp c++.stl.port c++.stl.sgi c++.stlsoft c++.windows c++.windows.16-bits c++.windows.32-bits c++.wxwindows digitalmars.empire digitalmars.DMDScript |
c++ - Optimizer bug (+exception handling)
#include <stdio.h>
struct B
{
~B()
{ }
void h(const B &);
};
inline B operator +(const B &a, const B &b)
{
B res;
res.h(a);
res.h(b);
return res;
}
struct A
{
void f();
B s1;
B s2;
};
int main()
{
A a;
a.f();
printf("OK\n");
}
void A::f()
{
if (&(s1 + s2))
{
for (int i = 0; i < 1; i++)
{
printf("%08x\n", &s2);
}
s1 + s2;
}
}
void B::h(const B &)
{ }
Compile it with "-o+all -Ae" and the output of the program is:
00000001
OK
Of course, 1 isn't the correct address of s2...
Looking at the code:
xor EBX,EBX
lea ESI,1[EBX]
LC8: push ESI
push offset FLAT:_DATA[029h]
call near ptr _printf
Hmm, seems that the compiler assumes that EBX still contains the this
pointer (but it's also used for the loop counter)...
BTW, two of these instructions could probably be optimised away (just a few
lines before the printf):
mov dword ptr -4[EBP],0FFFFFFFFh
mov dword ptr -4[EBP],1
mov dword ptr -4[EBP],0FFFFFFFFh
bye, Christof
--
http://cmeerw.org JID: cmeerw jabber.at
mailto cmeerw at web.de
...and what have you contributed to the Net?
Jan 05 2003
|