summaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2011-11-02 08:39:51 +0000
committerSimon Marlow <marlowsd@gmail.com>2011-11-02 16:34:05 +0000
commitbe9e727c99b3d746c6db1c4c65f99de2e3bcd70d (patch)
treec5267f55b0c1d81af8e1402989d5c5ad2d5120a6 /compiler
parentbaa57678a7c034ff7d03339ba2e2693c105806e2 (diff)
downloadhaskell-be9e727c99b3d746c6db1c4c65f99de2e3bcd70d.tar.gz
simplTick: push type-applications and casts inside ticks.
Diffstat (limited to 'compiler')
-rw-r--r--compiler/simplCore/Simplify.lhs20
1 files changed, 15 insertions, 5 deletions
diff --git a/compiler/simplCore/Simplify.lhs b/compiler/simplCore/Simplify.lhs
index d4108d20fd..853815c2ce 100644
--- a/compiler/simplCore/Simplify.lhs
+++ b/compiler/simplCore/Simplify.lhs
@@ -1038,19 +1038,21 @@ simplTick env tickish expr cont
--
-- For breakpoints, we cannot do any floating of bindings around the
- -- tick. So
+ -- tick, because breakpoints cannot be split into tick/scope pairs.
| Breakpoint{} <- tickish
- = do { (env', expr') <- simplExprF (zapFloats env) expr mkBoringStop
+ = do { let (inc,outc) = splitCont cont
+ ; (env', expr') <- simplExprF (zapFloats env) expr inc
; let tickish' = simplTickish env tickish
- ; (env'', expr'') <- rebuild (zapFloats env') (wrapFloats env' expr') (TickIt tickish' cont)
+ ; (env'', expr'') <- rebuild (zapFloats env') (wrapFloats env' expr') (TickIt tickish' outc)
; return (env'', wrapFloats env expr'')
}
| otherwise
- = do { (env', expr') <- simplExprF (zapFloats env) expr mkBoringStop
+ = do { let (inc,outc) = splitCont cont
+ ; (env', expr') <- simplExprF (zapFloats env) expr inc
; let tickish' = simplTickish env tickish
; let env'' = addFloats env (mapFloatRhss env' (mkTick (mkNoTick tickish')))
- ; rebuild env'' expr' (TickIt tickish' cont)
+ ; rebuild env'' expr' (TickIt tickish' outc)
}
where
simplTickish env tickish
@@ -1058,6 +1060,14 @@ simplTick env tickish expr cont
= Breakpoint n (map (getDoneId . substId env) ids)
| otherwise = tickish
+ -- push type application and coercion inside a tick
+ splitCont :: SimplCont -> (SimplCont, SimplCont)
+ splitCont (ApplyTo f (Type t) env c) = (ApplyTo f (Type t) env inc, outc)
+ where (inc,outc) = splitCont c
+ splitCont (CoerceIt co c) = (CoerceIt co inc, outc)
+ where (inc,outc) = splitCont c
+ splitCont other = (mkBoringStop, other)
+
getDoneId (DoneId id) = id
getDoneId (DoneEx e) = getIdFromTrivialExpr e -- Note [substTickish] in CoreSubst
getDoneId other = pprPanic "getDoneId" (ppr other)