Tell the NCG that XOR foo, foo does *not* read foo
authorwolfgang.thaller@gmx.net <unknown>
Thu, 7 Dec 2006 13:17:21 +0000 (13:17 +0000)
committerwolfgang.thaller@gmx.net <unknown>
Thu, 7 Dec 2006 13:17:21 +0000 (13:17 +0000)
On x86[-64], MachCodeGen uses the old XOR trick to zero a register.
This patch makes regUsage not list the register as an input in this
case.
Listing the register as an input for the instruction could make it
appear like an unitialised value, which is bad because unitialised
values can cause the register allocator to panic (at least in the
presence of a loop).

compiler/nativeGen/RegAllocInfo.hs

index df74218..d526641 100644 (file)
@@ -156,6 +156,8 @@ regUsage instr = case instr of
     IDIV   sz op       -> mkRU (eax:edx:use_R op) [eax,edx]
     AND    sz src dst  -> usageRM src dst
     OR     sz src dst  -> usageRM src dst
+    XOR    sz (OpReg src) (OpReg dst)
+        | src == dst    -> mkRU [] [dst]
     XOR    sz src dst  -> usageRM src dst
     NOT    sz op       -> usageM op
     NEGI   sz op       -> usageM op