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