Bug 20466 – Optimizer clobbering msw register when testing it for 0
Status
RESOLVED
Resolution
FIXED
Severity
critical
Priority
P1
Component
dmd
Product
D
Version
D2
Platform
x86
OS
Linux
Creation time
2019-12-25T10:16:13Z
Last change time
2019-12-26T16:17:15Z
Keywords
pull, wrong-code
Assigned to
No Owner
Creator
Walter Bright
Comments
Comment #0 by bugzilla — 2019-12-25T10:16:13Z
Compile the following code with -O -m32 -fPIC and then
disassemble it:
-------------------------
enum STC : long {
auto_ = (1L << 8),
trusted = (1L << 34),
}
alias StorageClass = ulong;
extern (C++) final class Parameter {
StorageClass storageClass;
void* type;
}
extern (C++) final class IfStatement {
Parameter prm;
}
extern (C++) final class Visitor {
void visit(IfStatement s) {
if (Parameter p = s.prm) {
StorageClass stc = p.storageClass;
if (!p.type && !stc)
stc = STC.auto_;
assert(!(stc & STC.trusted));
}
}
}
----------------
_ZN7Visitor5visitEP11IfStatement:
push EBP
mov EBP,ESP
sub ESP,018h
mov -0Ch[EBP],EBX
mov -8[EBP],ESI
call L11
L11: pop EAX
add EAX,offset FLAT:_GLOBAL_OFFSET_TABLE_@GOTPC[2]
mov -4[EBP],EAX
mov ECX,0Ch[EBP]
mov EDX,4[ECX]
test EDX,EDX
je L4B
cmp dword ptr 0Ch[EDX],0
mov ECX,8[EDX]
mov EBX,4[EDX]
jne L3B
or ECX,EBX <=== clobbers ECX
jne L3B
mov EBX,0100h
xor ECX,ECX
L3B: mov EAX,EBX
mov EDX,ECX <=== using clobbered value here
xor EAX,EAX
and EDX,4
or EDX,EAX
jne L55
L4B: mov EBX,-0Ch[EBP]
mov ESI,-8[EBP]
mov ESP,EBP
pop EBP
ret
L55: mov dword ptr -014h[EBP],01Dh
mov EBX,-4[EBP]
lea ESI,_TMP0@GOTOFF[061h][EBX]
mov -018h[EBP],ESI
mov EBX,-4[EBP]
call _d_assertp@PLT32
mov EBX,-0Ch[EBP]
mov ESI,-8[EBP]
mov ESP,EBP
pop EBP
ret
----------------
See where the register is clobbered.
Comment #1 by dlang-bot — 2019-12-25T11:45:28Z
@WalterBright created dlang/dmd pull request #10696 "fix Issue 20466 - Optimizer clobbering msw register when testing it f…" fixing this issue:
- fix Issue 20466 - Optimizer clobbering msw register when testing it for 0
https://github.com/dlang/dmd/pull/10696
Comment #2 by dlang-bot — 2019-12-25T22:20:00Z
dlang/dmd pull request #10696 "fix Issue 20466 - Optimizer clobbering msw register when testing it f…" was merged into stable:
- 29a31b41852bde32e03c7515eb285db9e803913f by Walter Bright:
fix Issue 20466 - Optimizer clobbering msw register when testing it for 0
https://github.com/dlang/dmd/pull/10696