Bug 17347 – DMD generates different (and wrong) output in -release mode
Status
RESOLVED
Resolution
DUPLICATE
Severity
enhancement
Priority
P1
Component
dmd
Product
D
Version
D2
Platform
x86_64
OS
Linux
Creation time
2017-04-24T15:57:00Z
Last change time
2017-04-24T16:26:41Z
Assigned to
nobody
Creator
alexander.breckel
Comments
Comment #0 by alexander.breckel — 2017-04-24T15:57:49Z
The following snippet correctly prints "0" when compiled with dmd (no -release) or ldc. However, adding -release prints a weird value. The value is slightly different for each run, but stays in the same number region.
DMD64 D Compiler v2.074.0 (ArchLinux)
$ dmd -release app.d && ./app
140734704773424
I was not able to further reduce the code, as changing seemingly unimportant things, like removing the "number" field from Wrapper, "fixes" the issue:
import std.stdio;
void main() {
writeln(f(Wrapper(ABCD.B, 1)).length);
}
enum ABCD { A, B, C, D }
struct Wrapper {
ABCD abcd;
uint number;
}
bool[] f(Wrapper x) {
final switch(x.abcd) {
case ABCD.A:
case ABCD.B:
case ABCD.C:
case ABCD.D:
return [];
}
}
Here's the relevant output of objdump -D, just in case it helps:
000000000043abc8 <_Dmain>:
43abc8: 55 push %rbp
43abc9: 48 8b ec mov %rsp,%rbp
43abcc: 48 83 ec 10 sub $0x10,%rsp
43abd0: c7 45 f8 01 00 00 00 movl $0x1,-0x8(%rbp)
43abd7: c7 45 fc 01 00 00 00 movl $0x1,-0x4(%rbp)
43abde: 48 8b 7d f8 mov -0x8(%rbp),%rdi
43abe2: e8 0d 00 00 00 callq 43abf4 <_D3app1fFS3app7WrapperZAb>
43abe7: 48 89 c7 mov %rax,%rdi
43abea: e8 41 00 00 00 callq 43ac30 <_D3std5stdio14__T7writelnTmZ7writelnFNfmZv>
43abef: 31 c0 xor %eax,%eax
43abf1: c9 leaveq
43abf2: c3 retq
...
000000000043abf4 <_D3app1fFS3app7WrapperZAb>:
43abf4: 55 push %rbp
43abf5: 48 8b ec mov %rsp,%rbp
43abf8: 48 83 ec 10 sub $0x10,%rsp
43abfc: 48 89 7d f8 mov %rdi,-0x8(%rbp)
43ac00: 48 83 ff 03 cmp $0x3,%rdi
43ac04: 77 26 ja 43ac2c <_D3app1fFS3app7WrapperZAb+0x38>
43ac06: 48 8d 05 33 fb 02 00 lea 0x2fb33(%rip),%rax # 46a740 <_IO_stdin_used+0x10>
43ac0d: 48 63 0c b8 movslq (%rax,%rdi,4),%rcx
43ac11: 48 8d 04 01 lea (%rcx,%rax,1),%rax
43ac15: ff e0 jmpq *%rax
43ac17: 31 f6 xor %esi,%esi
43ac19: 48 8d 3d 20 40 24 00 lea 0x244020(%rip),%rdi # 67ec40 <_D11TypeInfo_Ab6__initZ>
43ac20: e8 0f 22 00 00 callq 43ce34 <_d_arrayliteralTX>
43ac25: 48 89 c2 mov %rax,%rdx
43ac28: 31 c0 xor %eax,%eax
43ac2a: c9 leaveq
43ac2b: c3 retq
43ac2c: c9 leaveq
43ac2d: c3 retq
...
Comment #1 by ag0aep6g — 2017-04-24T16:26:41Z
For me, the code misbehaves even without -release. I get "core.exception.SwitchError@test(15): No appropriate switch clause found".
As far as I can tell, this is a duplicate of issue 15538. I'm marking this as such. Please revert if there's a difference I'm missing.
*** This issue has been marked as a duplicate of issue 15538 ***