summaryrefslogtreecommitdiff
path: root/compiler/cmm
diff options
context:
space:
mode:
authordias@cs.tufts.edu <unknown>2009-09-18 19:07:53 +0000
committerdias@cs.tufts.edu <unknown>2009-09-18 19:07:53 +0000
commit787b08bdea84cca4bf9490d87c059453bffc5ad2 (patch)
tree2716161b7fc6c951e6d572c6356defae08073f72 /compiler/cmm
parente4caa74b6c809cd17c5d1f7d472b9a47b2ea6f1c (diff)
downloadhaskell-787b08bdea84cca4bf9490d87c059453bffc5ad2.tar.gz
Keep Touch'd variables live through the back end
When we used derived pointers into the middle of an object, we need to keep the pointer to the start of the object live. We use a "fat machine instruction" with the primitive MO_Touch to propagate this information through the back end.
Diffstat (limited to 'compiler/cmm')
-rw-r--r--compiler/cmm/Cmm.hs1
-rw-r--r--compiler/cmm/CmmCvt.hs1
-rw-r--r--compiler/cmm/ZipCfgCmmRep.hs14
3 files changed, 9 insertions, 7 deletions
diff --git a/compiler/cmm/Cmm.hs b/compiler/cmm/Cmm.hs
index 4b18e46cdf..c48269ecf5 100644
--- a/compiler/cmm/Cmm.hs
+++ b/compiler/cmm/Cmm.hs
@@ -384,6 +384,7 @@ data CallishMachOp
| MO_F32_Exp
| MO_F32_Sqrt
| MO_WriteBarrier
+ | MO_Touch -- Keep variables live (when using interior pointers)
deriving (Eq, Show)
pprCallishMachOp :: CallishMachOp -> SDoc
diff --git a/compiler/cmm/CmmCvt.hs b/compiler/cmm/CmmCvt.hs
index 7f5de60f99..4d413257be 100644
--- a/compiler/cmm/CmmCvt.hs
+++ b/compiler/cmm/CmmCvt.hs
@@ -115,6 +115,7 @@ ofZgraph g = ListGraph $ swallow blocks
mid (MidComment s) = CmmComment s
mid (MidAssign l r) = CmmAssign l r
mid (MidStore l r) = CmmStore l r
+ mid (MidForeignCall _ (PrimTarget MO_Touch) _ _) = CmmNop
mid (MidForeignCall _ target ress args)
= CmmCall (cmm_target target)
(add_hints conv Results ress)
diff --git a/compiler/cmm/ZipCfgCmmRep.hs b/compiler/cmm/ZipCfgCmmRep.hs
index 451450e6f0..a061be8a55 100644
--- a/compiler/cmm/ZipCfgCmmRep.hs
+++ b/compiler/cmm/ZipCfgCmmRep.hs
@@ -114,13 +114,13 @@ data Last
-- the call goes into a loop.
}
-data MidCallTarget -- The target of a MidUnsafeCall
- = ForeignTarget -- A foreign procedure
- CmmExpr -- Its address
- ForeignConvention -- Its calling convention
+data MidCallTarget -- The target of a MidUnsafeCall
+ = ForeignTarget -- A foreign procedure
+ CmmExpr -- Its address
+ ForeignConvention -- Its calling convention
- | PrimTarget -- A possibly-side-effecting machine operation
- CallishMachOp -- Which one
+ | PrimTarget -- A possibly-side-effecting machine operation
+ CallishMachOp -- Which one
deriving Eq
data Convention
@@ -277,8 +277,8 @@ instance UserOfLocalRegs MidCallTarget where
foldRegsUsed f z (ForeignTarget e _) = foldRegsUsed f z e
instance UserOfSlots MidCallTarget where
+ foldSlotsUsed f z (ForeignTarget e _) = foldSlotsUsed f z e
foldSlotsUsed _f z (PrimTarget _) = z
- foldSlotsUsed f z (ForeignTarget e _) = foldSlotsUsed f z e
instance (UserOfLocalRegs a) => UserOfLocalRegs (Maybe a) where
foldRegsUsed f z (Just x) = foldRegsUsed f z x