https://issues.dlang.org/show_bug.cgi?id=20126
Issue ID: 20126 Summary: bad codegen for return statement in function with asm code Product: D Version: D2 Hardware: All OS: All Status: NEW Severity: regression Priority: P1 Component: dmd Assignee: nob...@puremagic.com Reporter: turkey...@gmail.com On my local 2.087, this code works, but in master, it generates bad code: asmtest.d --------- extern(C) float floop(float* r, float x) { asm { mov EAX, x; mov RCX, r; xchg [RCX], EAX; mov x, EAX; } return x; } > dmd asmtest.d -c -m64 Dumping this emits: 0000000000000000 <floop>: 0: 55 push %rbp 1: 48 8b ec mov %rsp,%rbp 4: 48 83 ec 10 sub $0x10,%rsp 8: 48 89 7d f0 mov %rdi,-0x10(%rbp) c: f3 0f 11 45 f8 movss %xmm0,-0x8(%rbp) 11: 8b 45 f8 mov -0x8(%rbp),%eax 14: 48 8b 4d f0 mov -0x10(%rbp),%rcx 18: 87 01 xchg %eax,(%rcx) 1a: 89 45 f8 mov %eax,-0x8(%rbp) 1d: c9 leaveq 1e: c3 retq It's missing this before the return: movss 0x8(%rbp),%xmm0 You can see where it loads from the argument in xmm0 to -0x8(%rbp) to transfer to RAX in the asm code, then the asm code as written. It writes the modified value back to the stack, but the `return x;` statement should load `x` back into xmm0 to return the value, but it just skips that. I presume that it assumes xmm0 was not clobbered by the asm block and elides the return code, but the variable was written... This fails on x64 in master on both windows and linux, but it works correctly for -m32 (does emit an fld before return). It also used to work on x64 in 2.087.0 (which i'm running locally) --