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