209b0179e70ef9e38c194c448321059351ef48b9
[ghc-hetmet.git] / compiler / deSugar / DsUtils.lhs
1 %
2 % (c) The University of Glasgow 2006
3 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 %
5
6 Utilities for desugaring
7
8 This module exports some utility functions of no great interest.
9
10 \begin{code}
11 {-# OPTIONS -w #-}
12 -- The above warning supression flag is a temporary kludge.
13 -- While working on this module you are encouraged to remove it and fix
14 -- any warnings in the module. See
15 --     http://hackage.haskell.org/trac/ghc/wiki/CodingStyle#Warnings
16 -- for details
17
18 module DsUtils (
19         EquationInfo(..), 
20         firstPat, shiftEqns,
21         
22         mkDsLet, mkDsLets, mkDsApp, mkDsApps,
23
24         MatchResult(..), CanItFail(..), 
25         cantFailMatchResult, alwaysFailMatchResult,
26         extractMatchResult, combineMatchResults, 
27         adjustMatchResult,  adjustMatchResultDs,
28         mkCoLetMatchResult, mkGuardedMatchResult, 
29         matchCanFail, mkEvalMatchResult,
30         mkCoPrimCaseMatchResult, mkCoAlgCaseMatchResult,
31         wrapBind, wrapBinds,
32
33         mkErrorAppDs, mkNilExpr, mkConsExpr, mkListExpr,
34         mkIntExpr, mkCharExpr,
35         mkStringExpr, mkStringExprFS, mkIntegerExpr, 
36
37         mkSelectorBinds, mkTupleExpr, mkTupleSelector, 
38         mkTupleType, mkTupleCase, mkBigCoreTup,
39         mkCoreTup, mkCoreTupTy, seqVar,
40         
41         dsSyntaxTable, lookupEvidence,
42
43         selectSimpleMatchVarL, selectMatchVars, selectMatchVar,
44         mkTickBox, mkOptTickBox, mkBinaryTickBox
45     ) where
46
47 #include "HsVersions.h"
48
49 import {-# SOURCE #-}   Match ( matchSimply )
50 import {-# SOURCE #-}   DsExpr( dsExpr )
51
52 import HsSyn
53 import TcHsSyn
54 import CoreSyn
55 import Constants
56 import DsMonad
57
58 import CoreUtils
59 import MkId
60 import Id
61 import Var
62 import Name
63 import Literal
64 import TyCon
65 import DataCon
66 import Type
67 import Coercion
68 import TysPrim
69 import TysWiredIn
70 import BasicTypes
71 import UniqSet
72 import UniqSupply
73 import PrelNames
74 import Outputable
75 import SrcLoc
76 import Util
77 import ListSetOps
78 import FastString
79 import StaticFlags
80
81 import Data.Char
82
83 infixl 4 `mkDsApp`, `mkDsApps`
84 \end{code}
85
86
87
88 %************************************************************************
89 %*                                                                      *
90                 Rebindable syntax
91 %*                                                                      *
92 %************************************************************************
93
94 \begin{code}
95 dsSyntaxTable :: SyntaxTable Id 
96                -> DsM ([CoreBind],      -- Auxiliary bindings
97                        [(Name,Id)])     -- Maps the standard name to its value
98
99 dsSyntaxTable rebound_ids
100   = mapAndUnzipDs mk_bind rebound_ids   `thenDs` \ (binds_s, prs) ->
101     return (concat binds_s, prs)
102   where
103         -- The cheapo special case can happen when we 
104         -- make an intermediate HsDo when desugaring a RecStmt
105     mk_bind (std_name, HsVar id) = return ([], (std_name, id))
106     mk_bind (std_name, expr)
107          = dsExpr expr                          `thenDs` \ rhs ->
108            newSysLocalDs (exprType rhs)         `thenDs` \ id ->
109            return ([NonRec id rhs], (std_name, id))
110
111 lookupEvidence :: [(Name, Id)] -> Name -> Id
112 lookupEvidence prs std_name
113   = assocDefault (mk_panic std_name) prs std_name
114   where
115     mk_panic std_name = pprPanic "dsSyntaxTable" (ptext SLIT("Not found:") <+> ppr std_name)
116 \end{code}
117
118
119 %************************************************************************
120 %*                                                                      *
121 \subsection{Building lets}
122 %*                                                                      *
123 %************************************************************************
124
125 Use case, not let for unlifted types.  The simplifier will turn some
126 back again.
127
128 \begin{code}
129 mkDsLet :: CoreBind -> CoreExpr -> CoreExpr
130 mkDsLet (NonRec bndr rhs) body  -- See Note [CoreSyn let/app invariant]
131   | isUnLiftedType (idType bndr) && not (exprOkForSpeculation rhs)
132   = Case rhs bndr (exprType body) [(DEFAULT,[],body)]
133 mkDsLet bind body
134   = Let bind body
135
136 mkDsLets :: [CoreBind] -> CoreExpr -> CoreExpr
137 mkDsLets binds body = foldr mkDsLet body binds
138
139 -----------
140 mkDsApp :: CoreExpr -> CoreExpr -> CoreExpr
141 -- Check the invariant that the arg of an App is ok-for-speculation if unlifted
142 -- See CoreSyn Note [CoreSyn let/app invariant]
143 mkDsApp fun (Type ty) = App fun (Type ty)
144 mkDsApp fun arg       = mk_val_app fun arg arg_ty res_ty
145                       where
146                         (arg_ty, res_ty) = splitFunTy (exprType fun)
147
148 -----------
149 mkDsApps :: CoreExpr -> [CoreExpr] -> CoreExpr
150 -- Slightly more efficient version of (foldl mkDsApp)
151 mkDsApps fun args
152   = go fun (exprType fun) args
153   where
154     go fun fun_ty []               = fun
155     go fun fun_ty (Type ty : args) = go (App fun (Type ty)) (applyTy fun_ty ty) args
156     go fun fun_ty (arg     : args) = go (mk_val_app fun arg arg_ty res_ty) res_ty args
157                                    where
158                                      (arg_ty, res_ty) = splitFunTy fun_ty
159 -----------
160 mk_val_app fun arg arg_ty res_ty        -- See Note [CoreSyn let/app invariant]
161   | not (isUnLiftedType arg_ty) || exprOkForSpeculation arg
162   = App fun arg         -- The vastly common case
163
164 mk_val_app (Var f `App` Type ty1 `App` Type ty2 `App` arg1) arg2 _ res_ty
165   | f == seqId          -- Note [Desugaring seq]
166   = Case arg1 (mkWildId ty1) res_ty [(DEFAULT,[],arg2)]
167
168 mk_val_app fun arg arg_ty res_ty
169   = Case arg (mkWildId arg_ty) res_ty [(DEFAULT,[],App fun (Var arg_id))]
170   where
171     arg_id = mkWildId arg_ty    -- Lots of shadowing, but it doesn't matter,
172                                 -- because 'fun ' should not have a free wild-id
173 \end{code}
174
175 Note [Desugaring seq]  cf Trac #1031
176 ~~~~~~~~~~~~~~~~~~~~~
177    f x y = x `seq` (y `seq` (# x,y #))
178
179 The [CoreSyn let/app invariant] means that, other things being equal, because 
180 the argument to the outer 'seq' has an unlifted type, we'll use call-by-value thus:
181
182    f x y = case (y `seq` (# x,y #)) of v -> x `seq` v
183
184 But that is bad for two reasons: 
185   (a) we now evaluate y before x, and 
186   (b) we can't bind v to an unboxed pair
187
188 Seq is very, very special!  So we recognise it right here, and desugar to
189         case x of _ -> case y of _ -> (# x,y #)
190
191 The special case would be valid for all calls to 'seq', but it's only *necessary*
192 for ones whose second argument has an unlifted type. So we only catch the latter
193 case here, to avoid unnecessary tests.
194
195
196 %************************************************************************
197 %*                                                                      *
198 \subsection{ Selecting match variables}
199 %*                                                                      *
200 %************************************************************************
201
202 We're about to match against some patterns.  We want to make some
203 @Ids@ to use as match variables.  If a pattern has an @Id@ readily at
204 hand, which should indeed be bound to the pattern as a whole, then use it;
205 otherwise, make one up.
206
207 \begin{code}
208 selectSimpleMatchVarL :: LPat Id -> DsM Id
209 selectSimpleMatchVarL pat = selectMatchVar (unLoc pat)
210
211 -- (selectMatchVars ps tys) chooses variables of type tys
212 -- to use for matching ps against.  If the pattern is a variable,
213 -- we try to use that, to save inventing lots of fresh variables.
214 --
215 -- OLD, but interesting note:
216 --    But even if it is a variable, its type might not match.  Consider
217 --      data T a where
218 --        T1 :: Int -> T Int
219 --        T2 :: a   -> T a
220 --
221 --      f :: T a -> a -> Int
222 --      f (T1 i) (x::Int) = x
223 --      f (T2 i) (y::a)   = 0
224 --    Then we must not choose (x::Int) as the matching variable!
225 -- And nowadays we won't, because the (x::Int) will be wrapped in a CoPat
226
227 selectMatchVars :: [Pat Id] -> DsM [Id]
228 selectMatchVars ps = mapM selectMatchVar ps
229
230 selectMatchVar (BangPat pat)   = selectMatchVar (unLoc pat)
231 selectMatchVar (LazyPat pat)   = selectMatchVar (unLoc pat)
232 selectMatchVar (ParPat pat)    = selectMatchVar (unLoc pat)
233 selectMatchVar (VarPat var)    = return var
234 selectMatchVar (AsPat var pat) = return (unLoc var)
235 selectMatchVar other_pat       = newSysLocalDs (hsPatType other_pat)
236                                   -- OK, better make up one...
237 \end{code}
238
239
240 %************************************************************************
241 %*                                                                      *
242 %* type synonym EquationInfo and access functions for its pieces        *
243 %*                                                                      *
244 %************************************************************************
245 \subsection[EquationInfo-synonym]{@EquationInfo@: a useful synonym}
246
247 The ``equation info'' used by @match@ is relatively complicated and
248 worthy of a type synonym and a few handy functions.
249
250 \begin{code}
251 firstPat :: EquationInfo -> Pat Id
252 firstPat eqn = ASSERT( notNull (eqn_pats eqn) ) head (eqn_pats eqn)
253
254 shiftEqns :: [EquationInfo] -> [EquationInfo]
255 -- Drop the first pattern in each equation
256 shiftEqns eqns = [ eqn { eqn_pats = tail (eqn_pats eqn) } | eqn <- eqns ]
257 \end{code}
258
259 Functions on MatchResults
260
261 \begin{code}
262 matchCanFail :: MatchResult -> Bool
263 matchCanFail (MatchResult CanFail _)  = True
264 matchCanFail (MatchResult CantFail _) = False
265
266 alwaysFailMatchResult :: MatchResult
267 alwaysFailMatchResult = MatchResult CanFail (\fail -> returnDs fail)
268
269 cantFailMatchResult :: CoreExpr -> MatchResult
270 cantFailMatchResult expr = MatchResult CantFail (\ ignore -> returnDs expr)
271
272 extractMatchResult :: MatchResult -> CoreExpr -> DsM CoreExpr
273 extractMatchResult (MatchResult CantFail match_fn) fail_expr
274   = match_fn (error "It can't fail!")
275
276 extractMatchResult (MatchResult CanFail match_fn) fail_expr
277   = mkFailurePair fail_expr             `thenDs` \ (fail_bind, if_it_fails) ->
278     match_fn if_it_fails                `thenDs` \ body ->
279     returnDs (mkDsLet fail_bind body)
280
281
282 combineMatchResults :: MatchResult -> MatchResult -> MatchResult
283 combineMatchResults (MatchResult CanFail      body_fn1)
284                     (MatchResult can_it_fail2 body_fn2)
285   = MatchResult can_it_fail2 body_fn
286   where
287     body_fn fail = body_fn2 fail                        `thenDs` \ body2 ->
288                    mkFailurePair body2                  `thenDs` \ (fail_bind, duplicatable_expr) ->
289                    body_fn1 duplicatable_expr           `thenDs` \ body1 ->
290                    returnDs (Let fail_bind body1)
291
292 combineMatchResults match_result1@(MatchResult CantFail body_fn1) match_result2
293   = match_result1
294
295 adjustMatchResult :: DsWrapper -> MatchResult -> MatchResult
296 adjustMatchResult encl_fn (MatchResult can_it_fail body_fn)
297   = MatchResult can_it_fail (\fail -> body_fn fail      `thenDs` \ body ->
298                                       returnDs (encl_fn body))
299
300 adjustMatchResultDs :: (CoreExpr -> DsM CoreExpr) -> MatchResult -> MatchResult
301 adjustMatchResultDs encl_fn (MatchResult can_it_fail body_fn)
302   = MatchResult can_it_fail (\fail -> body_fn fail      `thenDs` \ body ->
303                                       encl_fn body)
304
305 wrapBinds :: [(Var,Var)] -> CoreExpr -> CoreExpr
306 wrapBinds [] e = e
307 wrapBinds ((new,old):prs) e = wrapBind new old (wrapBinds prs e)
308
309 wrapBind :: Var -> Var -> CoreExpr -> CoreExpr
310 wrapBind new old body
311   | new==old    = body
312   | isTyVar new = App (Lam new body) (Type (mkTyVarTy old))
313   | otherwise   = Let (NonRec new (Var old)) body
314
315 seqVar :: Var -> CoreExpr -> CoreExpr
316 seqVar var body = Case (Var var) var (exprType body)
317                         [(DEFAULT, [], body)]
318
319 mkCoLetMatchResult :: CoreBind -> MatchResult -> MatchResult
320 mkCoLetMatchResult bind = adjustMatchResult (mkDsLet bind)
321
322 mkEvalMatchResult :: Id -> Type -> MatchResult -> MatchResult
323 mkEvalMatchResult var ty
324   = adjustMatchResult (\e -> Case (Var var) var ty [(DEFAULT, [], e)]) 
325
326 mkGuardedMatchResult :: CoreExpr -> MatchResult -> MatchResult
327 mkGuardedMatchResult pred_expr (MatchResult can_it_fail body_fn)
328   = MatchResult CanFail (\fail -> body_fn fail  `thenDs` \ body ->
329                                   returnDs (mkIfThenElse pred_expr body fail))
330
331 mkCoPrimCaseMatchResult :: Id                           -- Scrutinee
332                     -> Type                             -- Type of the case
333                     -> [(Literal, MatchResult)]         -- Alternatives
334                     -> MatchResult
335 mkCoPrimCaseMatchResult var ty match_alts
336   = MatchResult CanFail mk_case
337   where
338     mk_case fail
339       = mappM (mk_alt fail) sorted_alts         `thenDs` \ alts ->
340         returnDs (Case (Var var) var ty ((DEFAULT, [], fail) : alts))
341
342     sorted_alts = sortWith fst match_alts       -- Right order for a Case
343     mk_alt fail (lit, MatchResult _ body_fn) = body_fn fail     `thenDs` \ body ->
344                                                returnDs (LitAlt lit, [], body)
345
346
347 mkCoAlgCaseMatchResult :: Id                                    -- Scrutinee
348                     -> Type                                     -- Type of exp
349                     -> [(DataCon, [CoreBndr], MatchResult)]     -- Alternatives
350                     -> MatchResult
351 mkCoAlgCaseMatchResult var ty match_alts 
352   | isNewTyCon tycon            -- Newtype case; use a let
353   = ASSERT( null (tail match_alts) && null (tail arg_ids1) )
354     mkCoLetMatchResult (NonRec arg_id1 newtype_rhs) match_result1
355
356   | isPArrFakeAlts match_alts   -- Sugared parallel array; use a literal case 
357   = MatchResult CanFail mk_parrCase
358
359   | otherwise                   -- Datatype case; use a case
360   = MatchResult fail_flag mk_case
361   where
362     tycon = dataConTyCon con1
363         -- [Interesting: becuase of GADTs, we can't rely on the type of 
364         --  the scrutinised Id to be sufficiently refined to have a TyCon in it]
365
366         -- Stuff for newtype
367     (con1, arg_ids1, match_result1) = ASSERT( notNull match_alts ) head match_alts
368     arg_id1     = ASSERT( notNull arg_ids1 ) head arg_ids1
369     var_ty      = idType var
370     (tc, ty_args) = splitNewTyConApp var_ty
371     newtype_rhs = unwrapNewTypeBody tc ty_args (Var var)
372                 
373         -- Stuff for data types
374     data_cons      = tyConDataCons tycon
375     match_results  = [match_result | (_,_,match_result) <- match_alts]
376
377     fail_flag | exhaustive_case
378               = foldr1 orFail [can_it_fail | MatchResult can_it_fail _ <- match_results]
379               | otherwise
380               = CanFail
381
382     wild_var = mkWildId (idType var)
383     sorted_alts  = sortWith get_tag match_alts
384     get_tag (con, _, _) = dataConTag con
385     mk_case fail = mappM (mk_alt fail) sorted_alts      `thenDs` \ alts ->
386                    returnDs (Case (Var var) wild_var ty (mk_default fail ++ alts))
387
388     mk_alt fail (con, args, MatchResult _ body_fn)
389         = body_fn fail                          `thenDs` \ body ->
390           newUniqueSupply                       `thenDs` \ us ->
391           returnDs (mkReboxingAlt (uniqsFromSupply us) con args body)
392
393     mk_default fail | exhaustive_case = []
394                     | otherwise       = [(DEFAULT, [], fail)]
395
396     un_mentioned_constructors
397         = mkUniqSet data_cons `minusUniqSet` mkUniqSet [ con | (con, _, _) <- match_alts]
398     exhaustive_case = isEmptyUniqSet un_mentioned_constructors
399
400         -- Stuff for parallel arrays
401         -- 
402         --  * the following is to desugar cases over fake constructors for
403         --   parallel arrays, which are introduced by `tidy1' in the `PArrPat'
404         --   case
405         --
406         -- Concerning `isPArrFakeAlts':
407         --
408         --  * it is *not* sufficient to just check the type of the type
409         --   constructor, as we have to be careful not to confuse the real
410         --   representation of parallel arrays with the fake constructors;
411         --   moreover, a list of alternatives must not mix fake and real
412         --   constructors (this is checked earlier on)
413         --
414         -- FIXME: We actually go through the whole list and make sure that
415         --        either all or none of the constructors are fake parallel
416         --        array constructors.  This is to spot equations that mix fake
417         --        constructors with the real representation defined in
418         --        `PrelPArr'.  It would be nicer to spot this situation
419         --        earlier and raise a proper error message, but it can really
420         --        only happen in `PrelPArr' anyway.
421         --
422     isPArrFakeAlts [(dcon, _, _)]      = isPArrFakeCon dcon
423     isPArrFakeAlts ((dcon, _, _):alts) = 
424       case (isPArrFakeCon dcon, isPArrFakeAlts alts) of
425         (True , True ) -> True
426         (False, False) -> False
427         _              -> 
428           panic "DsUtils: You may not mix `[:...:]' with `PArr' patterns"
429     --
430     mk_parrCase fail =             
431       dsLookupGlobalId lengthPName                      `thenDs` \lengthP  ->
432       unboxAlt                                          `thenDs` \alt      ->
433       returnDs (Case (len lengthP) (mkWildId intTy) ty [alt])
434       where
435         elemTy      = case splitTyConApp (idType var) of
436                         (_, [elemTy]) -> elemTy
437                         _               -> panic panicMsg
438         panicMsg    = "DsUtils.mkCoAlgCaseMatchResult: not a parallel array?"
439         len lengthP = mkApps (Var lengthP) [Type elemTy, Var var]
440         --
441         unboxAlt = 
442           newSysLocalDs intPrimTy                       `thenDs` \l        ->
443           dsLookupGlobalId indexPName                   `thenDs` \indexP   ->
444           mappM (mkAlt indexP) sorted_alts              `thenDs` \alts     ->
445           returnDs (DataAlt intDataCon, [l], (Case (Var l) wild ty (dft : alts)))
446           where
447             wild = mkWildId intPrimTy
448             dft  = (DEFAULT, [], fail)
449         --
450         -- each alternative matches one array length (corresponding to one
451         -- fake array constructor), so the match is on a literal; each
452         -- alternative's body is extended by a local binding for each
453         -- constructor argument, which are bound to array elements starting
454         -- with the first
455         --
456         mkAlt indexP (con, args, MatchResult _ bodyFun) = 
457           bodyFun fail                                  `thenDs` \body     ->
458           returnDs (LitAlt lit, [], mkDsLets binds body)
459           where
460             lit   = MachInt $ toInteger (dataConSourceArity con)
461             binds = [NonRec arg (indexExpr i) | (i, arg) <- zip [1..] args]
462             --
463             indexExpr i = mkApps (Var indexP) [Type elemTy, Var var, mkIntExpr i]
464 \end{code}
465
466
467 %************************************************************************
468 %*                                                                      *
469 \subsection{Desugarer's versions of some Core functions}
470 %*                                                                      *
471 %************************************************************************
472
473 \begin{code}
474 mkErrorAppDs :: Id              -- The error function
475              -> Type            -- Type to which it should be applied
476              -> String          -- The error message string to pass
477              -> DsM CoreExpr
478
479 mkErrorAppDs err_id ty msg
480   = getSrcSpanDs                `thenDs` \ src_loc ->
481     let
482         full_msg = showSDoc (hcat [ppr src_loc, text "|", text msg])
483         core_msg = Lit (mkStringLit full_msg)
484         -- mkStringLit returns a result of type String#
485     in
486     returnDs (mkApps (Var err_id) [Type ty, core_msg])
487 \end{code}
488
489
490 *************************************************************
491 %*                                                                      *
492 \subsection{Making literals}
493 %*                                                                      *
494 %************************************************************************
495
496 \begin{code}
497 mkCharExpr     :: Char       -> CoreExpr      -- Returns        C# c :: Int
498 mkIntExpr      :: Integer    -> CoreExpr      -- Returns        I# i :: Int
499 mkIntegerExpr  :: Integer    -> DsM CoreExpr  -- Result :: Integer
500 mkStringExpr   :: String     -> DsM CoreExpr  -- Result :: String
501 mkStringExprFS :: FastString -> DsM CoreExpr  -- Result :: String
502
503 mkIntExpr  i = mkConApp intDataCon  [mkIntLit i]
504 mkCharExpr c = mkConApp charDataCon [mkLit (MachChar c)]
505
506 mkIntegerExpr i
507   | inIntRange i        -- Small enough, so start from an Int
508   = dsLookupDataCon  smallIntegerDataConName    `thenDs` \ integer_dc ->
509     returnDs (mkSmallIntegerLit integer_dc i)
510
511 -- Special case for integral literals with a large magnitude:
512 -- They are transformed into an expression involving only smaller
513 -- integral literals. This improves constant folding.
514
515   | otherwise           -- Big, so start from a string
516   = dsLookupGlobalId plusIntegerName            `thenDs` \ plus_id ->
517     dsLookupGlobalId timesIntegerName           `thenDs` \ times_id ->
518     dsLookupDataCon  smallIntegerDataConName    `thenDs` \ integer_dc ->
519     let 
520         lit i = mkSmallIntegerLit integer_dc i
521         plus a b  = Var plus_id  `App` a `App` b
522         times a b = Var times_id `App` a `App` b
523
524         -- Transform i into (x1 + (x2 + (x3 + (...) * b) * b) * b) with abs xi <= b
525         horner :: Integer -> Integer -> CoreExpr
526         horner b i | abs q <= 1 = if r == 0 || r == i 
527                                   then lit i 
528                                   else lit r `plus` lit (i-r)
529                    | r == 0     =               horner b q `times` lit b
530                    | otherwise  = lit r `plus` (horner b q `times` lit b)
531                    where
532                      (q,r) = i `quotRem` b
533
534     in
535     returnDs (horner tARGET_MAX_INT i)
536
537 mkSmallIntegerLit small_integer_data_con i = mkConApp small_integer_data_con [mkIntLit i]
538
539 mkStringExpr str = mkStringExprFS (mkFastString str)
540
541 mkStringExprFS str
542   | nullFS str
543   = returnDs (mkNilExpr charTy)
544
545   | lengthFS str == 1
546   = let
547         the_char = mkCharExpr (headFS str)
548     in
549     returnDs (mkConsExpr charTy the_char (mkNilExpr charTy))
550
551   | all safeChar chars
552   = dsLookupGlobalId unpackCStringName  `thenDs` \ unpack_id ->
553     returnDs (App (Var unpack_id) (Lit (MachStr str)))
554
555   | otherwise
556   = dsLookupGlobalId unpackCStringUtf8Name      `thenDs` \ unpack_id ->
557     returnDs (App (Var unpack_id) (Lit (MachStr str)))
558
559   where
560     chars = unpackFS str
561     safeChar c = ord c >= 1 && ord c <= 0x7F
562 \end{code}
563
564
565 %************************************************************************
566 %*                                                                      *
567 \subsection[mkSelectorBind]{Make a selector bind}
568 %*                                                                      *
569 %************************************************************************
570
571 This is used in various places to do with lazy patterns.
572 For each binder $b$ in the pattern, we create a binding:
573 \begin{verbatim}
574     b = case v of pat' -> b'
575 \end{verbatim}
576 where @pat'@ is @pat@ with each binder @b@ cloned into @b'@.
577
578 ToDo: making these bindings should really depend on whether there's
579 much work to be done per binding.  If the pattern is complex, it
580 should be de-mangled once, into a tuple (and then selected from).
581 Otherwise the demangling can be in-line in the bindings (as here).
582
583 Boring!  Boring!  One error message per binder.  The above ToDo is
584 even more helpful.  Something very similar happens for pattern-bound
585 expressions.
586
587 \begin{code}
588 mkSelectorBinds :: LPat Id      -- The pattern
589                 -> CoreExpr     -- Expression to which the pattern is bound
590                 -> DsM [(Id,CoreExpr)]
591
592 mkSelectorBinds (L _ (VarPat v)) val_expr
593   = returnDs [(v, val_expr)]
594
595 mkSelectorBinds pat val_expr
596   | isSingleton binders || is_simple_lpat pat
597   =     -- Given   p = e, where p binds x,y
598         -- we are going to make
599         --      v = p   (where v is fresh)
600         --      x = case v of p -> x
601         --      y = case v of p -> x
602
603         -- Make up 'v'
604         -- NB: give it the type of *pattern* p, not the type of the *rhs* e.
605         -- This does not matter after desugaring, but there's a subtle 
606         -- issue with implicit parameters. Consider
607         --      (x,y) = ?i
608         -- Then, ?i is given type {?i :: Int}, a PredType, which is opaque
609         -- to the desugarer.  (Why opaque?  Because newtypes have to be.  Why
610         -- does it get that type?  So that when we abstract over it we get the
611         -- right top-level type  (?i::Int) => ...)
612         --
613         -- So to get the type of 'v', use the pattern not the rhs.  Often more
614         -- efficient too.
615     newSysLocalDs (hsLPatType pat)      `thenDs` \ val_var ->
616
617         -- For the error message we make one error-app, to avoid duplication.
618         -- But we need it at different types... so we use coerce for that
619     mkErrorAppDs iRREFUT_PAT_ERROR_ID 
620                  unitTy (showSDoc (ppr pat))    `thenDs` \ err_expr ->
621     newSysLocalDs unitTy                        `thenDs` \ err_var ->
622     mappM (mk_bind val_var err_var) binders     `thenDs` \ binds ->
623     returnDs ( (val_var, val_expr) : 
624                (err_var, err_expr) :
625                binds )
626
627
628   | otherwise
629   = mkErrorAppDs iRREFUT_PAT_ERROR_ID 
630                  tuple_ty (showSDoc (ppr pat))                  `thenDs` \ error_expr ->
631     matchSimply val_expr PatBindRhs pat local_tuple error_expr  `thenDs` \ tuple_expr ->
632     newSysLocalDs tuple_ty                                      `thenDs` \ tuple_var ->
633     let
634         mk_tup_bind binder
635           = (binder, mkTupleSelector binders binder tuple_var (Var tuple_var))
636     in
637     returnDs ( (tuple_var, tuple_expr) : map mk_tup_bind binders )
638   where
639     binders     = collectPatBinders pat
640     local_tuple = mkTupleExpr binders
641     tuple_ty    = exprType local_tuple
642
643     mk_bind scrut_var err_var bndr_var
644     -- (mk_bind sv err_var) generates
645     --          bv = case sv of { pat -> bv; other -> coerce (type-of-bv) err_var }
646     -- Remember, pat binds bv
647       = matchSimply (Var scrut_var) PatBindRhs pat
648                     (Var bndr_var) error_expr                   `thenDs` \ rhs_expr ->
649         returnDs (bndr_var, rhs_expr)
650       where
651         error_expr = mkCoerce co (Var err_var)
652         co         = mkUnsafeCoercion (exprType (Var err_var)) (idType bndr_var)
653
654     is_simple_lpat p = is_simple_pat (unLoc p)
655
656     is_simple_pat (TuplePat ps Boxed _)        = all is_triv_lpat ps
657     is_simple_pat (ConPatOut{ pat_args = ps }) = all is_triv_lpat (hsConPatArgs ps)
658     is_simple_pat (VarPat _)                   = True
659     is_simple_pat (ParPat p)                   = is_simple_lpat p
660     is_simple_pat other                        = False
661
662     is_triv_lpat p = is_triv_pat (unLoc p)
663
664     is_triv_pat (VarPat v)  = True
665     is_triv_pat (WildPat _) = True
666     is_triv_pat (ParPat p)  = is_triv_lpat p
667     is_triv_pat other       = False
668 \end{code}
669
670
671 %************************************************************************
672 %*                                                                      *
673                 Tuples
674 %*                                                                      *
675 %************************************************************************
676
677 @mkTupleExpr@ builds a tuple; the inverse to @mkTupleSelector@.  
678
679 * If it has only one element, it is the identity function.
680
681 * If there are more elements than a big tuple can have, it nests 
682   the tuples.  
683
684 Nesting policy.  Better a 2-tuple of 10-tuples (3 objects) than
685 a 10-tuple of 2-tuples (11 objects).  So we want the leaves to be big.
686
687 \begin{code}
688 mkTupleExpr :: [Id] -> CoreExpr
689 mkTupleExpr ids = mkBigCoreTup (map Var ids)
690
691 -- corresponding type
692 mkTupleType :: [Id] -> Type
693 mkTupleType ids = mkBigTuple mkCoreTupTy (map idType ids)
694
695 mkBigCoreTup :: [CoreExpr] -> CoreExpr
696 mkBigCoreTup = mkBigTuple mkCoreTup
697
698 mkBigTuple :: ([a] -> a) -> [a] -> a
699 mkBigTuple small_tuple as = mk_big_tuple (chunkify as)
700   where
701         -- Each sub-list is short enough to fit in a tuple
702     mk_big_tuple [as] = small_tuple as
703     mk_big_tuple as_s = mk_big_tuple (chunkify (map small_tuple as_s))
704
705 chunkify :: [a] -> [[a]]
706 -- The sub-lists of the result all have length <= mAX_TUPLE_SIZE
707 -- But there may be more than mAX_TUPLE_SIZE sub-lists
708 chunkify xs
709   | n_xs <= mAX_TUPLE_SIZE = {- pprTrace "Small" (ppr n_xs) -} [xs] 
710   | otherwise              = {- pprTrace "Big"   (ppr n_xs) -} (split xs)
711   where
712     n_xs     = length xs
713     split [] = []
714     split xs = take mAX_TUPLE_SIZE xs : split (drop mAX_TUPLE_SIZE xs)
715 \end{code}
716
717
718 @mkTupleSelector@ builds a selector which scrutises the given
719 expression and extracts the one name from the list given.
720 If you want the no-shadowing rule to apply, the caller
721 is responsible for making sure that none of these names
722 are in scope.
723
724 If there is just one id in the ``tuple'', then the selector is
725 just the identity.
726
727 If it's big, it does nesting
728         mkTupleSelector [a,b,c,d] b v e
729           = case e of v { 
730                 (p,q) -> case p of p {
731                            (a,b) -> b }}
732 We use 'tpl' vars for the p,q, since shadowing does not matter.
733
734 In fact, it's more convenient to generate it innermost first, getting
735
736         case (case e of v 
737                 (p,q) -> p) of p
738           (a,b) -> b
739
740 \begin{code}
741 mkTupleSelector :: [Id]         -- The tuple args
742                 -> Id           -- The selected one
743                 -> Id           -- A variable of the same type as the scrutinee
744                 -> CoreExpr     -- Scrutinee
745                 -> CoreExpr
746
747 mkTupleSelector vars the_var scrut_var scrut
748   = mk_tup_sel (chunkify vars) the_var
749   where
750     mk_tup_sel [vars] the_var = mkCoreSel vars the_var scrut_var scrut
751     mk_tup_sel vars_s the_var = mkCoreSel group the_var tpl_v $
752                                 mk_tup_sel (chunkify tpl_vs) tpl_v
753         where
754           tpl_tys = [mkCoreTupTy (map idType gp) | gp <- vars_s]
755           tpl_vs  = mkTemplateLocals tpl_tys
756           [(tpl_v, group)] = [(tpl,gp) | (tpl,gp) <- zipEqual "mkTupleSelector" tpl_vs vars_s,
757                                          the_var `elem` gp ]
758 \end{code}
759
760 A generalization of @mkTupleSelector@, allowing the body
761 of the case to be an arbitrary expression.
762
763 If the tuple is big, it is nested:
764
765         mkTupleCase uniqs [a,b,c,d] body v e
766           = case e of v { (p,q) ->
767             case p of p { (a,b) ->
768             case q of q { (c,d) ->
769             body }}}
770
771 To avoid shadowing, we use uniqs to invent new variables p,q.
772
773 ToDo: eliminate cases where none of the variables are needed.
774
775 \begin{code}
776 mkTupleCase
777         :: UniqSupply   -- for inventing names of intermediate variables
778         -> [Id]         -- the tuple args
779         -> CoreExpr     -- body of the case
780         -> Id           -- a variable of the same type as the scrutinee
781         -> CoreExpr     -- scrutinee
782         -> CoreExpr
783
784 mkTupleCase uniqs vars body scrut_var scrut
785   = mk_tuple_case uniqs (chunkify vars) body
786   where
787     mk_tuple_case us [vars] body
788       = mkSmallTupleCase vars body scrut_var scrut
789     mk_tuple_case us vars_s body
790       = let
791             (us', vars', body') = foldr one_tuple_case (us, [], body) vars_s
792         in
793         mk_tuple_case us' (chunkify vars') body'
794     one_tuple_case chunk_vars (us, vs, body)
795       = let
796             (us1, us2) = splitUniqSupply us
797             scrut_var = mkSysLocal FSLIT("ds") (uniqFromSupply us1)
798                         (mkCoreTupTy (map idType chunk_vars))
799             body' = mkSmallTupleCase chunk_vars body scrut_var (Var scrut_var)
800         in (us2, scrut_var:vs, body')
801 \end{code}
802
803 The same, but with a tuple small enough not to need nesting.
804
805 \begin{code}
806 mkSmallTupleCase
807         :: [Id]         -- the tuple args
808         -> CoreExpr     -- body of the case
809         -> Id           -- a variable of the same type as the scrutinee
810         -> CoreExpr     -- scrutinee
811         -> CoreExpr
812
813 mkSmallTupleCase [var] body _scrut_var scrut
814   = bindNonRec var scrut body
815 mkSmallTupleCase vars body scrut_var scrut
816 -- One branch no refinement?
817   = Case scrut scrut_var (exprType body) [(DataAlt (tupleCon Boxed (length vars)), vars, body)]
818 \end{code}
819
820 %************************************************************************
821 %*                                                                      *
822 \subsection[mkFailurePair]{Code for pattern-matching and other failures}
823 %*                                                                      *
824 %************************************************************************
825
826 Call the constructor Ids when building explicit lists, so that they
827 interact well with rules.
828
829 \begin{code}
830 mkNilExpr :: Type -> CoreExpr
831 mkNilExpr ty = mkConApp nilDataCon [Type ty]
832
833 mkConsExpr :: Type -> CoreExpr -> CoreExpr -> CoreExpr
834 mkConsExpr ty hd tl = mkConApp consDataCon [Type ty, hd, tl]
835
836 mkListExpr :: Type -> [CoreExpr] -> CoreExpr
837 mkListExpr ty xs = foldr (mkConsExpr ty) (mkNilExpr ty) xs
838                             
839
840 -- The next three functions make tuple types, constructors and selectors,
841 -- with the rule that a 1-tuple is represented by the thing itselg
842 mkCoreTupTy :: [Type] -> Type
843 mkCoreTupTy [ty] = ty
844 mkCoreTupTy tys  = mkTupleTy Boxed (length tys) tys
845
846 mkCoreTup :: [CoreExpr] -> CoreExpr                         
847 -- Builds exactly the specified tuple.
848 -- No fancy business for big tuples
849 mkCoreTup []  = Var unitDataConId
850 mkCoreTup [c] = c
851 mkCoreTup cs  = mkConApp (tupleCon Boxed (length cs))
852                          (map (Type . exprType) cs ++ cs)
853
854 mkCoreSel :: [Id]       -- The tuple args
855           -> Id         -- The selected one
856           -> Id         -- A variable of the same type as the scrutinee
857           -> CoreExpr   -- Scrutinee
858           -> CoreExpr
859 -- mkCoreSel [x,y,z] x v e
860 -- ===>  case e of v { (x,y,z) -> x
861 mkCoreSel [var] should_be_the_same_var scrut_var scrut
862   = ASSERT(var == should_be_the_same_var)
863     scrut
864
865 mkCoreSel vars the_var scrut_var scrut
866   = ASSERT( notNull vars )
867     Case scrut scrut_var (idType the_var)
868          [(DataAlt (tupleCon Boxed (length vars)), vars, Var the_var)]
869 \end{code}
870
871 %************************************************************************
872 %*                                                                      *
873 \subsection[mkFailurePair]{Code for pattern-matching and other failures}
874 %*                                                                      *
875 %************************************************************************
876
877 Generally, we handle pattern matching failure like this: let-bind a
878 fail-variable, and use that variable if the thing fails:
879 \begin{verbatim}
880         let fail.33 = error "Help"
881         in
882         case x of
883                 p1 -> ...
884                 p2 -> fail.33
885                 p3 -> fail.33
886                 p4 -> ...
887 \end{verbatim}
888 Then
889 \begin{itemize}
890 \item
891 If the case can't fail, then there'll be no mention of @fail.33@, and the
892 simplifier will later discard it.
893
894 \item
895 If it can fail in only one way, then the simplifier will inline it.
896
897 \item
898 Only if it is used more than once will the let-binding remain.
899 \end{itemize}
900
901 There's a problem when the result of the case expression is of
902 unboxed type.  Then the type of @fail.33@ is unboxed too, and
903 there is every chance that someone will change the let into a case:
904 \begin{verbatim}
905         case error "Help" of
906           fail.33 -> case ....
907 \end{verbatim}
908
909 which is of course utterly wrong.  Rather than drop the condition that
910 only boxed types can be let-bound, we just turn the fail into a function
911 for the primitive case:
912 \begin{verbatim}
913         let fail.33 :: Void -> Int#
914             fail.33 = \_ -> error "Help"
915         in
916         case x of
917                 p1 -> ...
918                 p2 -> fail.33 void
919                 p3 -> fail.33 void
920                 p4 -> ...
921 \end{verbatim}
922
923 Now @fail.33@ is a function, so it can be let-bound.
924
925 \begin{code}
926 mkFailurePair :: CoreExpr       -- Result type of the whole case expression
927               -> DsM (CoreBind, -- Binds the newly-created fail variable
928                                 -- to either the expression or \ _ -> expression
929                       CoreExpr) -- Either the fail variable, or fail variable
930                                 -- applied to unit tuple
931 mkFailurePair expr
932   | isUnLiftedType ty
933   = newFailLocalDs (unitTy `mkFunTy` ty)        `thenDs` \ fail_fun_var ->
934     newSysLocalDs unitTy                        `thenDs` \ fail_fun_arg ->
935     returnDs (NonRec fail_fun_var (Lam fail_fun_arg expr),
936               App (Var fail_fun_var) (Var unitDataConId))
937
938   | otherwise
939   = newFailLocalDs ty           `thenDs` \ fail_var ->
940     returnDs (NonRec fail_var expr, Var fail_var)
941   where
942     ty = exprType expr
943 \end{code}
944
945 \begin{code}
946 mkOptTickBox :: Maybe (Int,[Id]) -> CoreExpr -> DsM CoreExpr
947 mkOptTickBox Nothing e   = return e
948 mkOptTickBox (Just (ix,ids)) e = mkTickBox ix ids e
949
950 mkTickBox :: Int -> [Id] -> CoreExpr -> DsM CoreExpr
951 mkTickBox ix vars e = do
952        uq <- newUnique  
953        mod <- getModuleDs
954        let tick | opt_Hpc   = mkTickBoxOpId uq mod ix
955                 | otherwise = mkBreakPointOpId uq mod ix
956        uq2 <- newUnique         
957        let occName = mkVarOcc "tick"
958        let name = mkInternalName uq2 occName noSrcSpan   -- use mkSysLocal?
959        let var  = Id.mkLocalId name realWorldStatePrimTy
960        scrut <- 
961           if opt_Hpc 
962             then return (Var tick)
963             else do
964               let tickVar = Var tick
965               let tickType = mkFunTys (map idType vars) realWorldStatePrimTy 
966               let scrutApTy = App tickVar (Type tickType)
967               return (mkApps scrutApTy (map Var vars) :: Expr Id)
968        return $ Case scrut var ty [(DEFAULT,[],e)]
969   where
970      ty = exprType e
971
972 mkBinaryTickBox :: Int -> Int -> CoreExpr -> DsM CoreExpr
973 mkBinaryTickBox ixT ixF e = do
974        mod <- getModuleDs
975        uq <- newUnique  
976        mod <- getModuleDs
977        let bndr1 = mkSysLocal FSLIT("t1") uq boolTy 
978        falseBox <- mkTickBox ixF [] $ Var falseDataConId
979        trueBox  <- mkTickBox ixT [] $ Var trueDataConId
980        return $ Case e bndr1 boolTy
981                        [ (DataAlt falseDataCon, [], falseBox)
982                        , (DataAlt trueDataCon,  [], trueBox)
983                        ]
984 \end{code}