digitalmars.D.bugs - invalid codegen with -O
- "Kris" <fu bar.com> Nov 29 2005
- "Walter Bright" <newshound digitalmars.com> Dec 01 2005
- "Kris" <fu bar.com> Dec 01 2005
- Tom S <h3r3tic remove.mat.uni.torun.pl> Dec 02 2005
- "Walter Bright" <newshound digitalmars.com> Dec 02 2005
- Tiago Gasiba <tiago.gasiba gmail.com> Dec 02 2005
- "Walter Bright" <newshound digitalmars.com> Dec 02 2005
- "Walter Bright" <newshound digitalmars.com> Dec 02 2005
There's a bug in the optimizer whereby it can fail to correctly execute
loops like this:
for (int i=1; --i) {}
The problem appears to be in the code-scheduling, whereby the assignment to
'i' and the subsequent test for zero are seperated by instructions that
alter the outcome of the assignment (the Z flag, in this instance).
Here's a sample, with the important parts highlighted:
00402E64 push ebp
00402E65 mov ebp,esp
00402E67 mov edx,0Ah
00402E6C sub esp,1000h
00402E72 test dword ptr [esp],esp
00402E75 dec edx
00402E76 jne _Dmain+8 (00402e6c)
00402E78 sub esp,47Ch
00402E7E mov ecx,2710h
00402E83 mov eax,0FFFFFFFFh
27: char[40000] output;
00402E88 push ebx
00402E89 push esi
00402E8A push edi
22: {
23: //auto f = new Foo;
24: // f + new Bar(1);
25:
26: uint x;
00402E8B lea edi,[output]
00402E91 mov dword ptr [x],0
00402E9B rep stos dword ptr [edi]
28: wchar[1000] input = ' ';
00402E9D lea ecx,[input]
00402EA3 push 3E8h
00402EA8 push 20h
00402EAA push ecx
00402EAB call __memset16 (00408408)
29: ulong ms = System.getMillisecs();
00402EB0 call _D5mango3sys6System6System12getMillisecsFZm
(00405b1c)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
00402EB5 xor ebx,ebx ** assignment to i
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
00402EB7 mov dword ptr [ms],eax
00402EBA mov dword ptr [ebp-54h],edx
30: for (int i=1; --i;)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
00402EBD add esp,0Ch ** resets the Z flag! *BOGUS*
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
00402EC0 je _Dmain+9Bh (00402eff) ** testing for ebx == 0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
31: Utf.toUtf8 (input, output, &x);
00402EC2 mov esi,9C40h
00402EC7 lea edx,[output]
00402ECD mov dword ptr [ebp-0A478h],esi
00402ED3 mov dword ptr [ebp-0A474h],edx
00402ED9 lea eax,[input]
00402EDF push eax
00402EE0 lea eax,[x]
00402EE6 push 3E8h
00402EEB push dword ptr [ebp-0A474h]
00402EF1 push dword ptr [ebp-0A478h]
00402EF7 call _D5mango7convert3Utf3Utf6toUtf8FAuAaPkZAa (00403498)
00402EFC dec ebx
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
00402EFD jne _Dmain+75h (00402ed9) ** unit.max iterations
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This is very similar to a codegen problem reported last year. Is it the same
one?
Nov 29 2005
I need a reproducible code example so I can fix it. -Walter
Dec 01 2005
I did try to,Walter, but couldn't get a small self-contained example to exhibit the bug. Having said that, you can see quite plainly there's a codegen issue there in the disassembly. The only example I have is using Mango and Ares ~ would you like that one? "Walter Bright" <newshound digitalmars.com> wrote in message news:dmohvf$34a$1 digitaldaemon.com...I need a reproducible code example so I can fix it. -Walter
Dec 01 2005
I've also had problems with -O. My programs exhibit really weird behaviour when compiled with -O. I guess in my case it might be related to tons of floating point calculations. Kris wrote:I did try to,Walter, but couldn't get a small self-contained example to exhibit the bug. Having said that, you can see quite plainly there's a codegen issue there in the disassembly. The only example I have is using Mango and Ares ~ would you like that one? "Walter Bright" <newshound digitalmars.com> wrote in message news:dmohvf$34a$1 digitaldaemon.com...I need a reproducible code example so I can fix it. -Walter
-- Tomasz Stachowiak /+ a.k.a. h3r3tic +/
Dec 02 2005
"Tom S" <h3r3tic remove.mat.uni.torun.pl> wrote in message news:dmpr0v$1uh7$1 digitaldaemon.com...I've also had problems with -O. My programs exhibit really weird behaviour when compiled with -O. I guess in my case it might be related to tons of floating point calculations.
I can't fix it without a reproducible sample.
Dec 02 2005
Walter Bright schrieb:I can't fix it without a reproducible sample.
-- Tiago Gasiba (M.Sc.) - http://www.gasiba.de Everything should be made as simple as possible, but not simpler.
Dec 02 2005
"Tiago Gasiba" <tiago.gasiba gmail.com> wrote in message news:dmpug5$245d$1 digitaldaemon.com...This might help: digitalmars.D.bugs/5643
And that's a bug report I can deal with! Thanks.
Dec 02 2005
"Kris" <fu bar.com> wrote in message news:dmoru6$aqs$1 digitaldaemon.com...I did try to,Walter, but couldn't get a small self-contained example to exhibit the bug.
The first thing to try is delete all the function bodies but the one in question, replacing them with declarations.
Dec 02 2005









"Walter Bright" <newshound digitalmars.com> 