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 ***