2 % (c) The University of Glasgow 2006
3 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
6 Utilities for desugaring
8 This module exports some utility functions of no great interest.
16 mkDsLet, mkDsLets, mkDsApp, mkDsApps,
18 MatchResult(..), CanItFail(..),
19 cantFailMatchResult, alwaysFailMatchResult,
20 extractMatchResult, combineMatchResults,
21 adjustMatchResult, adjustMatchResultDs,
22 mkCoLetMatchResult, mkViewMatchResult, mkGuardedMatchResult,
23 matchCanFail, mkEvalMatchResult,
24 mkCoPrimCaseMatchResult, mkCoAlgCaseMatchResult,
27 mkErrorAppDs, mkNilExpr, mkConsExpr, mkListExpr,
28 mkIntExpr, mkCharExpr,
29 mkStringExpr, mkStringExprFS, mkIntegerExpr,
34 mkCoreVarTup, mkCoreTup, mkCoreVarTupTy, mkCoreTupTy,
35 mkBigCoreVarTup, mkBigCoreTup, mkBigCoreVarTupTy, mkBigCoreTupTy,
38 mkLHsVarTup, mkLHsTup, mkLHsVarPatTup, mkLHsPatTup,
39 mkBigLHsVarTup, mkBigLHsTup, mkBigLHsVarPatTup, mkBigLHsPatTup,
42 mkSelectorBinds, mkTupleSelector,
43 mkSmallTupleCase, mkTupleCase,
45 dsSyntaxTable, lookupEvidence,
47 selectSimpleMatchVarL, selectMatchVars, selectMatchVar,
48 mkTickBox, mkOptTickBox, mkBinaryTickBox
51 #include "HsVersions.h"
53 import {-# SOURCE #-} Match ( matchSimply )
54 import {-# SOURCE #-} DsExpr( dsExpr )
87 infixl 4 `mkDsApp`, `mkDsApps`
92 %************************************************************************
96 %************************************************************************
99 dsSyntaxTable :: SyntaxTable Id
100 -> DsM ([CoreBind], -- Auxiliary bindings
101 [(Name,Id)]) -- Maps the standard name to its value
103 dsSyntaxTable rebound_ids = do
104 (binds_s, prs) <- mapAndUnzipM mk_bind rebound_ids
105 return (concat binds_s, prs)
107 -- The cheapo special case can happen when we
108 -- make an intermediate HsDo when desugaring a RecStmt
109 mk_bind (std_name, HsVar id) = return ([], (std_name, id))
110 mk_bind (std_name, expr) = do
112 id <- newSysLocalDs (exprType rhs)
113 return ([NonRec id rhs], (std_name, id))
115 lookupEvidence :: [(Name, Id)] -> Name -> Id
116 lookupEvidence prs std_name
117 = assocDefault (mk_panic std_name) prs std_name
119 mk_panic std_name = pprPanic "dsSyntaxTable" (ptext SLIT("Not found:") <+> ppr std_name)
123 %************************************************************************
125 \subsection{Building lets}
127 %************************************************************************
129 Use case, not let for unlifted types. The simplifier will turn some
133 mkDsLet :: CoreBind -> CoreExpr -> CoreExpr
134 mkDsLet (NonRec bndr rhs) body -- See Note [CoreSyn let/app invariant]
135 | isUnLiftedType (idType bndr) && not (exprOkForSpeculation rhs)
136 = Case rhs bndr (exprType body) [(DEFAULT,[],body)]
140 mkDsLets :: [CoreBind] -> CoreExpr -> CoreExpr
141 mkDsLets binds body = foldr mkDsLet body binds
144 mkDsApp :: CoreExpr -> CoreExpr -> CoreExpr
145 -- Check the invariant that the arg of an App is ok-for-speculation if unlifted
146 -- See CoreSyn Note [CoreSyn let/app invariant]
147 mkDsApp fun (Type ty) = App fun (Type ty)
148 mkDsApp fun arg = mk_val_app fun arg arg_ty res_ty
150 (arg_ty, res_ty) = splitFunTy (exprType fun)
153 mkDsApps :: CoreExpr -> [CoreExpr] -> CoreExpr
154 -- Slightly more efficient version of (foldl mkDsApp)
156 = go fun (exprType fun) args
159 go fun fun_ty (Type ty : args) = go (App fun (Type ty)) (applyTy fun_ty ty) args
160 go fun fun_ty (arg : args) = go (mk_val_app fun arg arg_ty res_ty) res_ty args
162 (arg_ty, res_ty) = splitFunTy fun_ty
164 mk_val_app :: CoreExpr -> CoreExpr -> Type -> Type -> CoreExpr
165 mk_val_app fun arg arg_ty _ -- See Note [CoreSyn let/app invariant]
166 | not (isUnLiftedType arg_ty) || exprOkForSpeculation arg
167 = App fun arg -- The vastly common case
169 mk_val_app (Var f `App` Type ty1 `App` Type _ `App` arg1) arg2 _ res_ty
170 | f == seqId -- Note [Desugaring seq]
171 = Case arg1 (mkWildId ty1) res_ty [(DEFAULT,[],arg2)]
173 mk_val_app fun arg arg_ty res_ty
174 = Case arg (mkWildId arg_ty) res_ty [(DEFAULT,[],App fun (Var arg_id))]
176 arg_id = mkWildId arg_ty -- Lots of shadowing, but it doesn't matter,
177 -- because 'fun ' should not have a free wild-id
180 Note [Desugaring seq] cf Trac #1031
181 ~~~~~~~~~~~~~~~~~~~~~
182 f x y = x `seq` (y `seq` (# x,y #))
184 The [CoreSyn let/app invariant] means that, other things being equal, because
185 the argument to the outer 'seq' has an unlifted type, we'll use call-by-value thus:
187 f x y = case (y `seq` (# x,y #)) of v -> x `seq` v
189 But that is bad for two reasons:
190 (a) we now evaluate y before x, and
191 (b) we can't bind v to an unboxed pair
193 Seq is very, very special! So we recognise it right here, and desugar to
194 case x of _ -> case y of _ -> (# x,y #)
196 The special case would be valid for all calls to 'seq', but it's only *necessary*
197 for ones whose second argument has an unlifted type. So we only catch the latter
198 case here, to avoid unnecessary tests.
201 %************************************************************************
203 \subsection{ Selecting match variables}
205 %************************************************************************
207 We're about to match against some patterns. We want to make some
208 @Ids@ to use as match variables. If a pattern has an @Id@ readily at
209 hand, which should indeed be bound to the pattern as a whole, then use it;
210 otherwise, make one up.
213 selectSimpleMatchVarL :: LPat Id -> DsM Id
214 selectSimpleMatchVarL pat = selectMatchVar (unLoc pat)
216 -- (selectMatchVars ps tys) chooses variables of type tys
217 -- to use for matching ps against. If the pattern is a variable,
218 -- we try to use that, to save inventing lots of fresh variables.
220 -- OLD, but interesting note:
221 -- But even if it is a variable, its type might not match. Consider
223 -- T1 :: Int -> T Int
226 -- f :: T a -> a -> Int
227 -- f (T1 i) (x::Int) = x
228 -- f (T2 i) (y::a) = 0
229 -- Then we must not choose (x::Int) as the matching variable!
230 -- And nowadays we won't, because the (x::Int) will be wrapped in a CoPat
232 selectMatchVars :: [Pat Id] -> DsM [Id]
233 selectMatchVars ps = mapM selectMatchVar ps
235 selectMatchVar :: Pat Id -> DsM Id
236 selectMatchVar (BangPat pat) = selectMatchVar (unLoc pat)
237 selectMatchVar (LazyPat pat) = selectMatchVar (unLoc pat)
238 selectMatchVar (ParPat pat) = selectMatchVar (unLoc pat)
239 selectMatchVar (VarPat var) = return var
240 selectMatchVar (AsPat var _) = return (unLoc var)
241 selectMatchVar other_pat = newSysLocalDs (hsPatType other_pat)
242 -- OK, better make up one...
246 %************************************************************************
248 %* type synonym EquationInfo and access functions for its pieces *
250 %************************************************************************
251 \subsection[EquationInfo-synonym]{@EquationInfo@: a useful synonym}
253 The ``equation info'' used by @match@ is relatively complicated and
254 worthy of a type synonym and a few handy functions.
257 firstPat :: EquationInfo -> Pat Id
258 firstPat eqn = ASSERT( notNull (eqn_pats eqn) ) head (eqn_pats eqn)
260 shiftEqns :: [EquationInfo] -> [EquationInfo]
261 -- Drop the first pattern in each equation
262 shiftEqns eqns = [ eqn { eqn_pats = tail (eqn_pats eqn) } | eqn <- eqns ]
265 Functions on MatchResults
268 matchCanFail :: MatchResult -> Bool
269 matchCanFail (MatchResult CanFail _) = True
270 matchCanFail (MatchResult CantFail _) = False
272 alwaysFailMatchResult :: MatchResult
273 alwaysFailMatchResult = MatchResult CanFail (\fail -> return fail)
275 cantFailMatchResult :: CoreExpr -> MatchResult
276 cantFailMatchResult expr = MatchResult CantFail (\_ -> return expr)
278 extractMatchResult :: MatchResult -> CoreExpr -> DsM CoreExpr
279 extractMatchResult (MatchResult CantFail match_fn) _
280 = match_fn (error "It can't fail!")
282 extractMatchResult (MatchResult CanFail match_fn) fail_expr = do
283 (fail_bind, if_it_fails) <- mkFailurePair fail_expr
284 body <- match_fn if_it_fails
285 return (mkDsLet fail_bind body)
288 combineMatchResults :: MatchResult -> MatchResult -> MatchResult
289 combineMatchResults (MatchResult CanFail body_fn1)
290 (MatchResult can_it_fail2 body_fn2)
291 = MatchResult can_it_fail2 body_fn
293 body_fn fail = do body2 <- body_fn2 fail
294 (fail_bind, duplicatable_expr) <- mkFailurePair body2
295 body1 <- body_fn1 duplicatable_expr
296 return (Let fail_bind body1)
298 combineMatchResults match_result1@(MatchResult CantFail _) _
301 adjustMatchResult :: DsWrapper -> MatchResult -> MatchResult
302 adjustMatchResult encl_fn (MatchResult can_it_fail body_fn)
303 = MatchResult can_it_fail (\fail -> encl_fn <$> body_fn fail)
305 adjustMatchResultDs :: (CoreExpr -> DsM CoreExpr) -> MatchResult -> MatchResult
306 adjustMatchResultDs encl_fn (MatchResult can_it_fail body_fn)
307 = MatchResult can_it_fail (\fail -> encl_fn =<< body_fn fail)
309 wrapBinds :: [(Var,Var)] -> CoreExpr -> CoreExpr
311 wrapBinds ((new,old):prs) e = wrapBind new old (wrapBinds prs e)
313 wrapBind :: Var -> Var -> CoreExpr -> CoreExpr
314 wrapBind new old body
316 | isTyVar new = App (Lam new body) (Type (mkTyVarTy old))
317 | otherwise = Let (NonRec new (Var old)) body
319 seqVar :: Var -> CoreExpr -> CoreExpr
320 seqVar var body = Case (Var var) var (exprType body)
321 [(DEFAULT, [], body)]
323 mkCoLetMatchResult :: CoreBind -> MatchResult -> MatchResult
324 mkCoLetMatchResult bind = adjustMatchResult (mkDsLet bind)
326 -- (mkViewMatchResult var' viewExpr var mr) makes the expression
327 -- let var' = viewExpr var in mr
328 mkViewMatchResult :: Id -> CoreExpr -> Id -> MatchResult -> MatchResult
329 mkViewMatchResult var' viewExpr var =
330 adjustMatchResult (mkDsLet (NonRec var' (mkDsApp viewExpr (Var var))))
332 mkEvalMatchResult :: Id -> Type -> MatchResult -> MatchResult
333 mkEvalMatchResult var ty
334 = adjustMatchResult (\e -> Case (Var var) var ty [(DEFAULT, [], e)])
336 mkGuardedMatchResult :: CoreExpr -> MatchResult -> MatchResult
337 mkGuardedMatchResult pred_expr (MatchResult _ body_fn)
338 = MatchResult CanFail (\fail -> do body <- body_fn fail
339 return (mkIfThenElse pred_expr body fail))
341 mkCoPrimCaseMatchResult :: Id -- Scrutinee
342 -> Type -- Type of the case
343 -> [(Literal, MatchResult)] -- Alternatives
345 mkCoPrimCaseMatchResult var ty match_alts
346 = MatchResult CanFail mk_case
349 alts <- mapM (mk_alt fail) sorted_alts
350 return (Case (Var var) var ty ((DEFAULT, [], fail) : alts))
352 sorted_alts = sortWith fst match_alts -- Right order for a Case
353 mk_alt fail (lit, MatchResult _ body_fn) = do body <- body_fn fail
354 return (LitAlt lit, [], body)
357 mkCoAlgCaseMatchResult :: Id -- Scrutinee
358 -> Type -- Type of exp
359 -> [(DataCon, [CoreBndr], MatchResult)] -- Alternatives
361 mkCoAlgCaseMatchResult var ty match_alts
362 | isNewTyCon tycon -- Newtype case; use a let
363 = ASSERT( null (tail match_alts) && null (tail arg_ids1) )
364 mkCoLetMatchResult (NonRec arg_id1 newtype_rhs) match_result1
366 | isPArrFakeAlts match_alts -- Sugared parallel array; use a literal case
367 = MatchResult CanFail mk_parrCase
369 | otherwise -- Datatype case; use a case
370 = MatchResult fail_flag mk_case
372 tycon = dataConTyCon con1
373 -- [Interesting: becuase of GADTs, we can't rely on the type of
374 -- the scrutinised Id to be sufficiently refined to have a TyCon in it]
377 (con1, arg_ids1, match_result1) = ASSERT( notNull match_alts ) head match_alts
378 arg_id1 = ASSERT( notNull arg_ids1 ) head arg_ids1
380 (tc, ty_args) = splitNewTyConApp var_ty
381 newtype_rhs = unwrapNewTypeBody tc ty_args (Var var)
383 -- Stuff for data types
384 data_cons = tyConDataCons tycon
385 match_results = [match_result | (_,_,match_result) <- match_alts]
387 fail_flag | exhaustive_case
388 = foldr1 orFail [can_it_fail | MatchResult can_it_fail _ <- match_results]
392 wild_var = mkWildId (idType var)
393 sorted_alts = sortWith get_tag match_alts
394 get_tag (con, _, _) = dataConTag con
395 mk_case fail = do alts <- mapM (mk_alt fail) sorted_alts
396 return (Case (Var var) wild_var ty (mk_default fail ++ alts))
398 mk_alt fail (con, args, MatchResult _ body_fn) = do
400 us <- newUniqueSupply
401 return (mkReboxingAlt (uniqsFromSupply us) con args body)
403 mk_default fail | exhaustive_case = []
404 | otherwise = [(DEFAULT, [], fail)]
406 un_mentioned_constructors
407 = mkUniqSet data_cons `minusUniqSet` mkUniqSet [ con | (con, _, _) <- match_alts]
408 exhaustive_case = isEmptyUniqSet un_mentioned_constructors
410 -- Stuff for parallel arrays
412 -- * the following is to desugar cases over fake constructors for
413 -- parallel arrays, which are introduced by `tidy1' in the `PArrPat'
416 -- Concerning `isPArrFakeAlts':
418 -- * it is *not* sufficient to just check the type of the type
419 -- constructor, as we have to be careful not to confuse the real
420 -- representation of parallel arrays with the fake constructors;
421 -- moreover, a list of alternatives must not mix fake and real
422 -- constructors (this is checked earlier on)
424 -- FIXME: We actually go through the whole list and make sure that
425 -- either all or none of the constructors are fake parallel
426 -- array constructors. This is to spot equations that mix fake
427 -- constructors with the real representation defined in
428 -- `PrelPArr'. It would be nicer to spot this situation
429 -- earlier and raise a proper error message, but it can really
430 -- only happen in `PrelPArr' anyway.
432 isPArrFakeAlts [(dcon, _, _)] = isPArrFakeCon dcon
433 isPArrFakeAlts ((dcon, _, _):alts) =
434 case (isPArrFakeCon dcon, isPArrFakeAlts alts) of
435 (True , True ) -> True
436 (False, False) -> False
437 _ -> panic "DsUtils: you may not mix `[:...:]' with `PArr' patterns"
438 isPArrFakeAlts [] = panic "DsUtils: unexpectedly found an empty list of PArr fake alternatives"
440 mk_parrCase fail = do
441 lengthP <- dsLookupGlobalId lengthPName
443 return (Case (len lengthP) (mkWildId intTy) ty [alt])
445 elemTy = case splitTyConApp (idType var) of
446 (_, [elemTy]) -> elemTy
448 panicMsg = "DsUtils.mkCoAlgCaseMatchResult: not a parallel array?"
449 len lengthP = mkApps (Var lengthP) [Type elemTy, Var var]
452 l <- newSysLocalDs intPrimTy
453 indexP <- dsLookupGlobalId indexPName
454 alts <- mapM (mkAlt indexP) sorted_alts
455 return (DataAlt intDataCon, [l], (Case (Var l) wild ty (dft : alts)))
457 wild = mkWildId intPrimTy
458 dft = (DEFAULT, [], fail)
460 -- each alternative matches one array length (corresponding to one
461 -- fake array constructor), so the match is on a literal; each
462 -- alternative's body is extended by a local binding for each
463 -- constructor argument, which are bound to array elements starting
466 mkAlt indexP (con, args, MatchResult _ bodyFun) = do
468 return (LitAlt lit, [], mkDsLets binds body)
470 lit = MachInt $ toInteger (dataConSourceArity con)
471 binds = [NonRec arg (indexExpr i) | (i, arg) <- zip [1..] args]
473 indexExpr i = mkApps (Var indexP) [Type elemTy, Var var, mkIntExpr i]
477 %************************************************************************
479 \subsection{Desugarer's versions of some Core functions}
481 %************************************************************************
484 mkErrorAppDs :: Id -- The error function
485 -> Type -- Type to which it should be applied
486 -> String -- The error message string to pass
489 mkErrorAppDs err_id ty msg = do
490 src_loc <- getSrcSpanDs
492 full_msg = showSDoc (hcat [ppr src_loc, text "|", text msg])
493 core_msg = Lit (mkStringLit full_msg)
494 -- mkStringLit returns a result of type String#
495 return (mkApps (Var err_id) [Type ty, core_msg])
499 *************************************************************
501 \subsection{Making literals}
503 %************************************************************************
506 mkCharExpr :: Char -> CoreExpr -- Returns C# c :: Int
507 mkIntExpr :: Integer -> CoreExpr -- Returns I# i :: Int
508 mkIntegerExpr :: Integer -> DsM CoreExpr -- Result :: Integer
509 mkStringExpr :: String -> DsM CoreExpr -- Result :: String
510 mkStringExprFS :: FastString -> DsM CoreExpr -- Result :: String
512 mkIntExpr i = mkConApp intDataCon [mkIntLit i]
513 mkCharExpr c = mkConApp charDataCon [mkLit (MachChar c)]
516 | inIntRange i -- Small enough, so start from an Int
517 = do integer_dc <- dsLookupDataCon smallIntegerDataConName
518 return (mkSmallIntegerLit integer_dc i)
520 -- Special case for integral literals with a large magnitude:
521 -- They are transformed into an expression involving only smaller
522 -- integral literals. This improves constant folding.
524 | otherwise = do -- Big, so start from a string
525 plus_id <- dsLookupGlobalId plusIntegerName
526 times_id <- dsLookupGlobalId timesIntegerName
527 integer_dc <- dsLookupDataCon smallIntegerDataConName
529 lit i = mkSmallIntegerLit integer_dc i
530 plus a b = Var plus_id `App` a `App` b
531 times a b = Var times_id `App` a `App` b
533 -- Transform i into (x1 + (x2 + (x3 + (...) * b) * b) * b) with abs xi <= b
534 horner :: Integer -> Integer -> CoreExpr
535 horner b i | abs q <= 1 = if r == 0 || r == i
537 else lit r `plus` lit (i-r)
538 | r == 0 = horner b q `times` lit b
539 | otherwise = lit r `plus` (horner b q `times` lit b)
541 (q,r) = i `quotRem` b
543 return (horner tARGET_MAX_INT i)
545 mkSmallIntegerLit :: DataCon -> Integer -> CoreExpr
546 mkSmallIntegerLit small_integer_data_con i = mkConApp small_integer_data_con [mkIntLit i]
548 mkStringExpr str = mkStringExprFS (mkFastString str)
552 = return (mkNilExpr charTy)
555 = do let the_char = mkCharExpr (headFS str)
556 return (mkConsExpr charTy the_char (mkNilExpr charTy))
559 = do unpack_id <- dsLookupGlobalId unpackCStringName
560 return (App (Var unpack_id) (Lit (MachStr str)))
563 = do unpack_id <- dsLookupGlobalId unpackCStringUtf8Name
564 return (App (Var unpack_id) (Lit (MachStr str)))
568 safeChar c = ord c >= 1 && ord c <= 0x7F
572 %************************************************************************
574 \subsection[mkSelectorBind]{Make a selector bind}
576 %************************************************************************
578 This is used in various places to do with lazy patterns.
579 For each binder $b$ in the pattern, we create a binding:
581 b = case v of pat' -> b'
583 where @pat'@ is @pat@ with each binder @b@ cloned into @b'@.
585 ToDo: making these bindings should really depend on whether there's
586 much work to be done per binding. If the pattern is complex, it
587 should be de-mangled once, into a tuple (and then selected from).
588 Otherwise the demangling can be in-line in the bindings (as here).
590 Boring! Boring! One error message per binder. The above ToDo is
591 even more helpful. Something very similar happens for pattern-bound
595 mkSelectorBinds :: LPat Id -- The pattern
596 -> CoreExpr -- Expression to which the pattern is bound
597 -> DsM [(Id,CoreExpr)]
599 mkSelectorBinds (L _ (VarPat v)) val_expr
600 = return [(v, val_expr)]
602 mkSelectorBinds pat val_expr
603 | isSingleton binders || is_simple_lpat pat = do
604 -- Given p = e, where p binds x,y
605 -- we are going to make
606 -- v = p (where v is fresh)
607 -- x = case v of p -> x
608 -- y = case v of p -> x
611 -- NB: give it the type of *pattern* p, not the type of the *rhs* e.
612 -- This does not matter after desugaring, but there's a subtle
613 -- issue with implicit parameters. Consider
615 -- Then, ?i is given type {?i :: Int}, a PredType, which is opaque
616 -- to the desugarer. (Why opaque? Because newtypes have to be. Why
617 -- does it get that type? So that when we abstract over it we get the
618 -- right top-level type (?i::Int) => ...)
620 -- So to get the type of 'v', use the pattern not the rhs. Often more
622 val_var <- newSysLocalDs (hsLPatType pat)
624 -- For the error message we make one error-app, to avoid duplication.
625 -- But we need it at different types... so we use coerce for that
626 err_expr <- mkErrorAppDs iRREFUT_PAT_ERROR_ID unitTy (showSDoc (ppr pat))
627 err_var <- newSysLocalDs unitTy
628 binds <- mapM (mk_bind val_var err_var) binders
629 return ( (val_var, val_expr) :
630 (err_var, err_expr) :
635 error_expr <- mkErrorAppDs iRREFUT_PAT_ERROR_ID tuple_ty (showSDoc (ppr pat))
636 tuple_expr <- matchSimply val_expr PatBindRhs pat local_tuple error_expr
637 tuple_var <- newSysLocalDs tuple_ty
640 = (binder, mkTupleSelector binders binder tuple_var (Var tuple_var))
641 return ( (tuple_var, tuple_expr) : map mk_tup_bind binders )
643 binders = collectPatBinders pat
644 local_tuple = mkBigCoreVarTup binders
645 tuple_ty = exprType local_tuple
647 mk_bind scrut_var err_var bndr_var = do
648 -- (mk_bind sv err_var) generates
649 -- bv = case sv of { pat -> bv; other -> coerce (type-of-bv) err_var }
650 -- Remember, pat binds bv
651 rhs_expr <- matchSimply (Var scrut_var) PatBindRhs pat
652 (Var bndr_var) error_expr
653 return (bndr_var, rhs_expr)
655 error_expr = mkCoerce co (Var err_var)
656 co = mkUnsafeCoercion (exprType (Var err_var)) (idType bndr_var)
658 is_simple_lpat p = is_simple_pat (unLoc p)
660 is_simple_pat (TuplePat ps Boxed _) = all is_triv_lpat ps
661 is_simple_pat (ConPatOut{ pat_args = ps }) = all is_triv_lpat (hsConPatArgs ps)
662 is_simple_pat (VarPat _) = True
663 is_simple_pat (ParPat p) = is_simple_lpat p
664 is_simple_pat _ = False
666 is_triv_lpat p = is_triv_pat (unLoc p)
668 is_triv_pat (VarPat _) = True
669 is_triv_pat (WildPat _) = True
670 is_triv_pat (ParPat p) = is_triv_lpat p
671 is_triv_pat _ = False
675 %************************************************************************
679 %************************************************************************
681 Nesting policy. Better a 2-tuple of 10-tuples (3 objects) than
682 a 10-tuple of 2-tuples (11 objects). So we want the leaves to be big.
686 mkBigTuple :: ([a] -> a) -> [a] -> a
687 mkBigTuple small_tuple as = mk_big_tuple (chunkify as)
689 -- Each sub-list is short enough to fit in a tuple
690 mk_big_tuple [as] = small_tuple as
691 mk_big_tuple as_s = mk_big_tuple (chunkify (map small_tuple as_s))
693 chunkify :: [a] -> [[a]]
694 -- The sub-lists of the result all have length <= mAX_TUPLE_SIZE
695 -- But there may be more than mAX_TUPLE_SIZE sub-lists
697 | n_xs <= mAX_TUPLE_SIZE = {- pprTrace "Small" (ppr n_xs) -} [xs]
698 | otherwise = {- pprTrace "Big" (ppr n_xs) -} (split xs)
702 split xs = take mAX_TUPLE_SIZE xs : split (drop mAX_TUPLE_SIZE xs)
706 Creating tuples and their types for Core expressions
708 @mkBigCoreVarTup@ builds a tuple; the inverse to @mkTupleSelector@.
710 * If it has only one element, it is the identity function.
712 * If there are more elements than a big tuple can have, it nests
717 -- Small tuples: build exactly the specified tuple
718 mkCoreVarTup :: [Id] -> CoreExpr
719 mkCoreVarTup ids = mkCoreTup (map Var ids)
721 mkCoreVarTupTy :: [Id] -> Type
722 mkCoreVarTupTy ids = mkCoreTupTy (map idType ids)
725 mkCoreTup :: [CoreExpr] -> CoreExpr
726 mkCoreTup [] = Var unitDataConId
728 mkCoreTup cs = mkConApp (tupleCon Boxed (length cs))
729 (map (Type . exprType) cs ++ cs)
731 mkCoreTupTy :: [Type] -> Type
732 mkCoreTupTy [ty] = ty
733 mkCoreTupTy tys = mkTupleTy Boxed (length tys) tys
738 mkBigCoreVarTup :: [Id] -> CoreExpr
739 mkBigCoreVarTup ids = mkBigCoreTup (map Var ids)
741 mkBigCoreVarTupTy :: [Id] -> Type
742 mkBigCoreVarTupTy ids = mkBigCoreTupTy (map idType ids)
745 mkBigCoreTup :: [CoreExpr] -> CoreExpr
746 mkBigCoreTup = mkBigTuple mkCoreTup
748 mkBigCoreTupTy :: [Type] -> Type
749 mkBigCoreTupTy = mkBigTuple mkCoreTupTy
753 Creating tuples and their types for full Haskell expressions
757 -- Smart constructors for source tuple expressions
758 mkLHsVarTup :: [Id] -> LHsExpr Id
759 mkLHsVarTup ids = mkLHsTup (map nlHsVar ids)
761 mkLHsTup :: [LHsExpr Id] -> LHsExpr Id
762 mkLHsTup [] = nlHsVar unitDataConId
763 mkLHsTup [lexp] = lexp
764 mkLHsTup lexps = noLoc $ ExplicitTuple lexps Boxed
767 -- Smart constructors for source tuple patterns
768 mkLHsVarPatTup :: [Id] -> LPat Id
769 mkLHsVarPatTup bs = mkLHsPatTup (map nlVarPat bs)
771 mkLHsPatTup :: [LPat Id] -> LPat Id
772 mkLHsPatTup [lpat] = lpat
773 mkLHsPatTup lpats = noLoc $ mkVanillaTuplePat lpats Boxed -- Handles the case where lpats = [] gracefully
776 -- The Big equivalents for the source tuple expressions
777 mkBigLHsVarTup :: [Id] -> LHsExpr Id
778 mkBigLHsVarTup ids = mkBigLHsTup (map nlHsVar ids)
780 mkBigLHsTup :: [LHsExpr Id] -> LHsExpr Id
781 mkBigLHsTup = mkBigTuple mkLHsTup
784 -- The Big equivalents for the source tuple patterns
785 mkBigLHsVarPatTup :: [Id] -> LPat Id
786 mkBigLHsVarPatTup bs = mkBigLHsPatTup (map nlVarPat bs)
788 mkBigLHsPatTup :: [LPat Id] -> LPat Id
789 mkBigLHsPatTup = mkBigTuple mkLHsPatTup
794 @mkTupleSelector@ builds a selector which scrutises the given
795 expression and extracts the one name from the list given.
796 If you want the no-shadowing rule to apply, the caller
797 is responsible for making sure that none of these names
800 If there is just one id in the ``tuple'', then the selector is
803 If it's big, it does nesting
804 mkTupleSelector [a,b,c,d] b v e
806 (p,q) -> case p of p {
808 We use 'tpl' vars for the p,q, since shadowing does not matter.
810 In fact, it's more convenient to generate it innermost first, getting
817 mkTupleSelector :: [Id] -- The tuple args
818 -> Id -- The selected one
819 -> Id -- A variable of the same type as the scrutinee
820 -> CoreExpr -- Scrutinee
823 mkTupleSelector vars the_var scrut_var scrut
824 = mk_tup_sel (chunkify vars) the_var
826 mk_tup_sel [vars] the_var = mkCoreSel vars the_var scrut_var scrut
827 mk_tup_sel vars_s the_var = mkCoreSel group the_var tpl_v $
828 mk_tup_sel (chunkify tpl_vs) tpl_v
830 tpl_tys = [mkCoreTupTy (map idType gp) | gp <- vars_s]
831 tpl_vs = mkTemplateLocals tpl_tys
832 [(tpl_v, group)] = [(tpl,gp) | (tpl,gp) <- zipEqual "mkTupleSelector" tpl_vs vars_s,
836 A generalization of @mkTupleSelector@, allowing the body
837 of the case to be an arbitrary expression.
839 If the tuple is big, it is nested:
841 mkTupleCase uniqs [a,b,c,d] body v e
842 = case e of v { (p,q) ->
843 case p of p { (a,b) ->
844 case q of q { (c,d) ->
847 To avoid shadowing, we use uniqs to invent new variables p,q.
849 ToDo: eliminate cases where none of the variables are needed.
853 :: UniqSupply -- for inventing names of intermediate variables
854 -> [Id] -- the tuple args
855 -> CoreExpr -- body of the case
856 -> Id -- a variable of the same type as the scrutinee
857 -> CoreExpr -- scrutinee
860 mkTupleCase uniqs vars body scrut_var scrut
861 = mk_tuple_case uniqs (chunkify vars) body
863 -- This is the case where don't need any nesting
864 mk_tuple_case _ [vars] body
865 = mkSmallTupleCase vars body scrut_var scrut
867 -- This is the case where we must make nest tuples at least once
868 mk_tuple_case us vars_s body
869 = let (us', vars', body') = foldr one_tuple_case (us, [], body) vars_s
870 in mk_tuple_case us' (chunkify vars') body'
872 one_tuple_case chunk_vars (us, vs, body)
873 = let (us1, us2) = splitUniqSupply us
874 scrut_var = mkSysLocal FSLIT("ds") (uniqFromSupply us1)
875 (mkCoreTupTy (map idType chunk_vars))
876 body' = mkSmallTupleCase chunk_vars body scrut_var (Var scrut_var)
877 in (us2, scrut_var:vs, body')
880 The same, but with a tuple small enough not to need nesting.
884 :: [Id] -- the tuple args
885 -> CoreExpr -- body of the case
886 -> Id -- a variable of the same type as the scrutinee
887 -> CoreExpr -- scrutinee
890 mkSmallTupleCase [var] body _scrut_var scrut
891 = bindNonRec var scrut body
892 mkSmallTupleCase vars body scrut_var scrut
893 -- One branch no refinement?
894 = Case scrut scrut_var (exprType body) [(DataAlt (tupleCon Boxed (length vars)), vars, body)]
897 %************************************************************************
899 \subsection[mkFailurePair]{Code for pattern-matching and other failures}
901 %************************************************************************
903 Call the constructor Ids when building explicit lists, so that they
904 interact well with rules.
907 mkNilExpr :: Type -> CoreExpr
908 mkNilExpr ty = mkConApp nilDataCon [Type ty]
910 mkConsExpr :: Type -> CoreExpr -> CoreExpr -> CoreExpr
911 mkConsExpr ty hd tl = mkConApp consDataCon [Type ty, hd, tl]
913 mkListExpr :: Type -> [CoreExpr] -> CoreExpr
914 mkListExpr ty xs = foldr (mkConsExpr ty) (mkNilExpr ty) xs
916 mkCoreSel :: [Id] -- The tuple args
917 -> Id -- The selected one
918 -> Id -- A variable of the same type as the scrutinee
919 -> CoreExpr -- Scrutinee
922 -- mkCoreSel [x] x v e
924 mkCoreSel [var] should_be_the_same_var _ scrut
925 = ASSERT(var == should_be_the_same_var)
928 -- mkCoreSel [x,y,z] x v e
929 -- ===> case e of v { (x,y,z) -> x
930 mkCoreSel vars the_var scrut_var scrut
931 = ASSERT( notNull vars )
932 Case scrut scrut_var (idType the_var)
933 [(DataAlt (tupleCon Boxed (length vars)), vars, Var the_var)]
936 %************************************************************************
938 \subsection[mkFailurePair]{Code for pattern-matching and other failures}
940 %************************************************************************
942 Generally, we handle pattern matching failure like this: let-bind a
943 fail-variable, and use that variable if the thing fails:
945 let fail.33 = error "Help"
956 If the case can't fail, then there'll be no mention of @fail.33@, and the
957 simplifier will later discard it.
960 If it can fail in only one way, then the simplifier will inline it.
963 Only if it is used more than once will the let-binding remain.
966 There's a problem when the result of the case expression is of
967 unboxed type. Then the type of @fail.33@ is unboxed too, and
968 there is every chance that someone will change the let into a case:
974 which is of course utterly wrong. Rather than drop the condition that
975 only boxed types can be let-bound, we just turn the fail into a function
976 for the primitive case:
978 let fail.33 :: Void -> Int#
979 fail.33 = \_ -> error "Help"
988 Now @fail.33@ is a function, so it can be let-bound.
991 mkFailurePair :: CoreExpr -- Result type of the whole case expression
992 -> DsM (CoreBind, -- Binds the newly-created fail variable
993 -- to either the expression or \ _ -> expression
994 CoreExpr) -- Either the fail variable, or fail variable
995 -- applied to unit tuple
997 | isUnLiftedType ty = do
998 fail_fun_var <- newFailLocalDs (unitTy `mkFunTy` ty)
999 fail_fun_arg <- newSysLocalDs unitTy
1000 return (NonRec fail_fun_var (Lam fail_fun_arg expr),
1001 App (Var fail_fun_var) (Var unitDataConId))
1004 fail_var <- newFailLocalDs ty
1005 return (NonRec fail_var expr, Var fail_var)
1011 mkOptTickBox :: Maybe (Int,[Id]) -> CoreExpr -> DsM CoreExpr
1012 mkOptTickBox Nothing e = return e
1013 mkOptTickBox (Just (ix,ids)) e = mkTickBox ix ids e
1015 mkTickBox :: Int -> [Id] -> CoreExpr -> DsM CoreExpr
1016 mkTickBox ix vars e = do
1019 let tick | opt_Hpc = mkTickBoxOpId uq mod ix
1020 | otherwise = mkBreakPointOpId uq mod ix
1022 let occName = mkVarOcc "tick"
1023 let name = mkInternalName uq2 occName noSrcSpan -- use mkSysLocal?
1024 let var = Id.mkLocalId name realWorldStatePrimTy
1027 then return (Var tick)
1029 let tickVar = Var tick
1030 let tickType = mkFunTys (map idType vars) realWorldStatePrimTy
1031 let scrutApTy = App tickVar (Type tickType)
1032 return (mkApps scrutApTy (map Var vars) :: Expr Id)
1033 return $ Case scrut var ty [(DEFAULT,[],e)]
1037 mkBinaryTickBox :: Int -> Int -> CoreExpr -> DsM CoreExpr
1038 mkBinaryTickBox ixT ixF e = do
1040 let bndr1 = mkSysLocal FSLIT("t1") uq boolTy
1041 falseBox <- mkTickBox ixF [] $ Var falseDataConId
1042 trueBox <- mkTickBox ixT [] $ Var trueDataConId
1043 return $ Case e bndr1 boolTy
1044 [ (DataAlt falseDataCon, [], falseBox)
1045 , (DataAlt trueDataCon, [], trueBox)