summaryrefslogtreecommitdiff
path: root/compiler/GHC/Platform/Reg.hs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/GHC/Platform/Reg.hs')
-rw-r--r--compiler/GHC/Platform/Reg.hs14
1 files changed, 11 insertions, 3 deletions
diff --git a/compiler/GHC/Platform/Reg.hs b/compiler/GHC/Platform/Reg.hs
index 5edd39df51..8203b9bbea 100644
--- a/compiler/GHC/Platform/Reg.hs
+++ b/compiler/GHC/Platform/Reg.hs
@@ -34,7 +34,6 @@ import GHC.Utils.Panic
import GHC.Types.Unique
import GHC.Builtin.Uniques
import GHC.Platform.Reg.Class
-import Data.List (intersect)
-- | An identifier for a primitive real machine register.
type RegNo
@@ -173,8 +172,17 @@ regNosOfRealReg rr
realRegsAlias :: RealReg -> RealReg -> Bool
-realRegsAlias rr1 rr2
- = not $ null $ intersect (regNosOfRealReg rr1) (regNosOfRealReg rr2)
+realRegsAlias rr1 rr2 =
+ -- used to be `not $ null $ intersect (regNosOfRealReg rr1) (regNosOfRealReg rr2)`
+ -- but that resulted in some gnarly, gnarly, allocating code. So we manually
+ -- write out all the cases which gives us nice non-allocating code.
+ case rr1 of
+ RealRegSingle r1 ->
+ case rr2 of RealRegPair r2 r3 -> r1 == r2 || r1 == r3
+ RealRegSingle r2 -> r1 == r2
+ RealRegPair r1 r2 ->
+ case rr2 of RealRegPair r3 r4 -> r1 == r3 || r1 == r4 || r2 == r3 || r2 == r4
+ RealRegSingle r3 -> r1 == r3 || r2 == r3
--------------------------------------------------------------------------------
-- | A register, either virtual or real