[commit: ghc] wip/T12618: ConApp: incomplete bytecode support (a184113)
git at git.haskell.org
git at git.haskell.org
Sat Oct 1 21:52:42 UTC 2016
Repository : ssh://git@git.haskell.org/ghc
On branch : wip/T12618
Link : http://ghc.haskell.org/trac/ghc/changeset/a184113d96e7e2315c5cf3f800bba3dc2073681e/ghc
>---------------------------------------------------------------
commit a184113d96e7e2315c5cf3f800bba3dc2073681e
Author: Joachim Breitner <mail at joachim-breitner.de>
Date: Fri Sep 30 00:10:39 2016 -0400
ConApp: incomplete bytecode support
>---------------------------------------------------------------
a184113d96e7e2315c5cf3f800bba3dc2073681e
compiler/ghci/ByteCodeGen.hs | 27 +++++++++++++++++++++++++++
1 file changed, 27 insertions(+)
diff --git a/compiler/ghci/ByteCodeGen.hs b/compiler/ghci/ByteCodeGen.hs
index 90e2174..33607bd 100644
--- a/compiler/ghci/ByteCodeGen.hs
+++ b/compiler/ghci/ByteCodeGen.hs
@@ -157,6 +157,7 @@ simpleFreeVars = go . freeVars
go' (AnnLit lit) = AnnLit lit
go' (AnnLam bndr body) = AnnLam bndr (go body)
go' (AnnApp fun arg) = AnnApp (go fun) (go arg)
+ go' (AnnConApp dc args) = AnnConApp dc (map go args)
go' (AnnCase scrut bndr ty alts) = AnnCase (go scrut) bndr ty (map go_alt alts)
go' (AnnLet bind body) = AnnLet (go_bind bind) (go body)
go' (AnnCast expr (ann, co)) = AnnCast (go expr) (freeVarsOfAnn ann, co)
@@ -420,6 +421,7 @@ schemeE d s p e
-- Delegate tail-calls to schemeT.
schemeE d s p e@(AnnApp _ _) = schemeT d s p e
+schemeE d s p e@(AnnConApp _ _) = schemeT d s p e
schemeE d s p e@(AnnLit lit) = returnUnboxedAtom d s p e (typeArgRep (literalType lit))
schemeE d s p e@(AnnCoercion {}) = returnUnboxedAtom d s p e V
@@ -432,6 +434,7 @@ schemeE d s p (AnnLet (AnnNonRec x (_,rhs)) (_,body))
| (AnnVar v, args_r_to_l) <- splitApp rhs,
Just data_con <- isDataConWorkId_maybe v,
dataConRepArity data_con == length args_r_to_l
+ -- TODO #12618 remove eventually
= do -- Special case for a non-recursive let whose RHS is a
-- saturatred constructor application.
-- Just allocate the constructor and carry on
@@ -439,6 +442,14 @@ schemeE d s p (AnnLet (AnnNonRec x (_,rhs)) (_,body))
body_code <- schemeE (d+1) s (Map.insert x d p) body
return (alloc_code `appOL` body_code)
+schemeE d s p (AnnLet (AnnNonRec x (_,AnnConApp dc args)) (_,body))
+ = do -- Special case for a non-recursive let whose RHS is a
+ -- saturatred constructor application.
+ -- Just allocate the constructor and carry on
+ alloc_code <- mkConAppCode d s p dc (map snd (reverse args))
+ body_code <- schemeE (d+1) s (Map.insert x d p) body
+ return (alloc_code `appOL` body_code)
+
-- General case for let. Generates correct, if inefficient, code in
-- all situations.
schemeE d s p (AnnLet binds (_,body)) = do
@@ -624,6 +635,21 @@ schemeT :: Word -- Stack depth
-> AnnExpr' Id DVarSet
-> BcM BCInstrList
+schemeT d s p (AnnConApp dc args')
+ | isUnboxedTupleCon dc
+ = case args of
+ [_,_,arg2,arg1] | isVAtom arg1 ->
+ unboxedTupleReturn d s p arg2
+ [_,_,arg2,arg1] | isVAtom arg2 ->
+ unboxedTupleReturn d s p arg1
+ _other -> multiValException
+ | otherwise
+ = do alloc_con <- mkConAppCode d s p dc (reverse args)
+ return (alloc_con `appOL`
+ mkSLIDE 1 (d - s) `snocOL`
+ ENTER)
+ where args = map snd args'
+
schemeT d s p app
-- | trace ("schemeT: env in = \n" ++ showSDocDebug (ppBCEnv p)) False
@@ -1605,6 +1631,7 @@ bcView :: AnnExpr' Var ann -> Maybe (AnnExpr' Var ann)
-- d) ticks (but not breakpoints)
-- Type lambdas *can* occur in random expressions,
-- whereas value lambdas cannot; that is why they are nuked here
+-- TODO #12618: what to do with data con apps here? Keep types or not?
bcView (AnnCast (_,e) _) = Just e
bcView (AnnLam v (_,e)) | isTyVar v = Just e
bcView (AnnApp (_,e) (_, AnnType _)) = Just e
More information about the ghc-commits
mailing list