Id.lhs 13.1 KB
Newer Older
1 2
%
% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
3 4 5 6
%
\section[Id]{@Ids@: Value and constructor identifiers}

\begin{code}
7
module Id (
8
	Id, DictId,
9

10
	-- Simple construction
11
	mkId, mkVanillaId, mkSysLocal, mkUserLocal,
12
	mkTemplateLocals, mkTemplateLocalsNum, mkWildId, mkTemplateLocal,
13 14

	-- Taking an Id apart
15
	idName, idType, idUnique, idInfo,
16
	idPrimRep, isId,
17
	recordSelectorFieldLabel,
18

19
	-- Modifying an Id
20
	setIdName, setIdUnique, setIdType, setIdNoDiscard, 
21
	setIdInfo, lazySetIdInfo, modifyIdInfo, maybeModifyIdInfo,
22
	zapFragileIdInfo, zapLamIdInfo,
23 24

	-- Predicates
25
	isImplicitId, isDeadBinder,
26
	externallyVisibleId,
27
	isSpecPragmaId,	isRecordSelector,
28 29 30
	isPrimOpId, isPrimOpId_maybe, isDictFunId,
	isDataConId, isDataConId_maybe, 
	isDataConWrapId, isDataConWrapId_maybe,
31
	isBottomingId,
32
	isExportedId, isLocalId, 
33 34 35 36 37
	hasNoBinding,

	-- Inline pragma stuff
	idInlinePragma, setInlinePragma, modifyInlinePragma, 

38

39
	-- One shot lambda stuff
40
	isOneShotLambda, setOneShotLambda, clearOneShotLambda,
41

42 43
	-- IdInfo stuff
	setIdUnfolding,
44
	setIdArityInfo,
45 46
	setIdDemandInfo,
	setIdStrictness,
47
        setIdTyGenInfo,
48
	setIdWorkerInfo,
49 50
	setIdSpecialisation,
	setIdCafInfo,
51
	setIdCprInfo,
52
	setIdOccInfo,
53

54 55 56 57
	idArity, idArityInfo, 
	idFlavour,
	idDemandInfo,
	idStrictness,
58
        idTyGenInfo,
59 60 61 62 63 64
	idWorkerInfo,
	idUnfolding,
	idSpecialisation,
	idCafInfo,
	idCprInfo,
	idLBVarInfo,
65
	idOccInfo,
66

67
    ) where
68

69
#include "HsVersions.h"
sof's avatar
sof committed
70 71


72
import CoreSyn		( Unfolding, CoreRules )
73
import BasicTypes	( Arity )
74 75 76 77
import Var		( Id, DictId,
			  isId, mkIdVar,
			  idName, idType, idUnique, idInfo,
			  setIdName, setVarType, setIdUnique, 
78 79
			  setIdInfo, lazySetIdInfo, modifyIdInfo, 
			  maybeModifyIdInfo,
80 81
			  externallyVisibleId
			)
82
import Type		( Type, typePrimRep, addFreeTyVars, 
83
                          usOnce, seqType, splitTyConApp_maybe )
84 85 86

import IdInfo 

87
import Demand		( Demand )
sof's avatar
sof committed
88
import Name	 	( Name, OccName,
89
			  mkSysLocalName, mkLocalName,
90
			  getOccName
sof's avatar
sof committed
91
			) 
92
import OccName		( UserFS )
93
import PrimRep		( PrimRep )
94
import TysPrim		( statePrimTyCon )
95
import FieldLabel	( FieldLabel )
96
import SrcLoc		( SrcLoc )
97 98
import Unique		( Unique, mkBuiltinUnique, getBuiltinUniques, 
			  getNumBuiltinUniques )
99
import Outputable
100

101
infixl 	1 `setIdUnfolding`,
102
	  `setIdArityInfo`,
103 104
	  `setIdDemandInfo`,
	  `setIdStrictness`,
105
	  `setIdTyGenInfo`,
106
	  `setIdWorkerInfo`,
107
	  `setIdSpecialisation`,
108
	  `setInlinePragma`,
109 110
	  `idCafInfo`,
	  `idCprInfo`
111

112
	-- infixl so you can say (id `set` a `set` b)
113 114 115
\end{code}


116

117 118
%************************************************************************
%*									*
119
\subsection{Simple Id construction}
120 121 122
%*									*
%************************************************************************

123 124 125 126
Absolutely all Ids are made by mkId.  It 
	a) Pins free-tyvar-info onto the Id's type, 
	   where it can easily be found.
	b) Ensures that exported Ids are 
127

128 129
\begin{code}
mkId :: Name -> Type -> IdInfo -> Id
130
mkId name ty info = mkIdVar name (addFreeTyVars ty) info
131
\end{code}
132

133 134 135
\begin{code}
mkVanillaId :: Name -> Type -> Id
mkVanillaId name ty = mkId name ty vanillaIdInfo
136 137 138

-- SysLocal: for an Id being created by the compiler out of thin air...
-- UserLocal: an Id with a name the user might recognize...
139 140
mkUserLocal :: OccName -> Unique -> Type -> SrcLoc -> Id
mkSysLocal  :: UserFS  -> Unique -> Type -> Id
141

142 143
mkSysLocal  fs uniq ty      = mkVanillaId (mkSysLocalName uniq fs)      ty
mkUserLocal occ uniq ty loc = mkVanillaId (mkLocalName    uniq occ loc) ty
144
\end{code}
145 146 147 148 149 150

Make some local @Ids@ for a template @CoreExpr@.  These have bogus
@Uniques@, but that's OK because the templates are supposed to be
instantiated before use.

\begin{code}
151 152
-- "Wild Id" typically used when you need a binder that you don't expect to use
mkWildId :: Type -> Id
153
mkWildId ty = mkSysLocal SLIT("wild") (mkBuiltinUnique 1) ty
154 155

-- "Template locals" typically used in unfoldings
156
mkTemplateLocals :: [Type] -> [Id]
157
mkTemplateLocals tys = zipWith (mkSysLocal SLIT("tpl"))
158 159
			       (getBuiltinUniques (length tys))
			       tys
160

161
mkTemplateLocalsNum :: Int -> [Type] -> [Id]
162
-- The Int gives the starting point for unique allocation
163 164 165 166
mkTemplateLocalsNum n tys = zipWith (mkSysLocal SLIT("tpl"))
			       (getNumBuiltinUniques n (length tys))
			       tys

167 168
mkTemplateLocal :: Int -> Type -> Id
mkTemplateLocal i ty = mkSysLocal SLIT("tpl") (mkBuiltinUnique i) ty
169 170 171
\end{code}


172 173 174 175 176 177 178
%************************************************************************
%*									*
\subsection[Id-general-funs]{General @Id@-related functions}
%*									*
%************************************************************************

\begin{code}
179
setIdType :: Id -> Type -> Id
180
	-- Add free tyvar info to the type
181
setIdType id ty = seqType ty `seq` setVarType id (addFreeTyVars ty)
sof's avatar
sof committed
182

183 184
idPrimRep :: Id -> PrimRep
idPrimRep id = typePrimRep (idType id)
185 186 187 188 189
\end{code}


%************************************************************************
%*									*
190
\subsection{Special Ids}
191 192 193
%*									*
%************************************************************************

sof's avatar
sof committed
194
\begin{code}
195 196 197 198 199 200 201
idFlavour :: Id -> IdFlavour
idFlavour id = flavourInfo (idInfo id)

setIdNoDiscard :: Id -> Id
setIdNoDiscard id	-- Make an Id into a NoDiscardId, unless it is already
  = modifyIdInfo setNoDiscardInfo id

202
recordSelectorFieldLabel :: Id -> FieldLabel
203
recordSelectorFieldLabel id = case idFlavour id of
204
				RecordSelId lbl -> lbl
sof's avatar
sof committed
205

206
isRecordSelector id = case idFlavour id of
207 208
			RecordSelId lbl -> True
			other	  	-> False
sof's avatar
sof committed
209

210 211 212 213 214 215 216 217 218 219 220
isPrimOpId id = case idFlavour id of
		    PrimOpId op -> True
		    other	-> False

isPrimOpId_maybe id = case idFlavour id of
			    PrimOpId op -> Just op
			    other	-> Nothing

isDataConId id = case idFlavour id of
			DataConId _ -> True
			other	    -> False
sof's avatar
sof committed
221

222
isDataConId_maybe id = case idFlavour id of
223 224
			  DataConId con -> Just con
			  other	        -> Nothing
sof's avatar
sof committed
225

226 227 228
isDataConWrapId_maybe id = case idFlavour id of
				  DataConWrapId con -> Just con
				  other	            -> Nothing
229

230 231 232
isDataConWrapId id = case idFlavour id of
			DataConWrapId con -> True
			other	          -> False
233

234 235 236 237
isSpecPragmaId id = case idFlavour id of
			SpecPragmaId -> True
			other	     -> False

238
hasNoBinding id = case idFlavour id of
239 240 241
			DataConId _ -> True
			PrimOpId _  -> True
			other	    -> False
242
	-- hasNoBinding returns True of an Id which may not have a
243 244 245
	-- binding, even though it is defined in this module.  Notably,
	-- the constructors of a dictionary are in this situation.

246 247 248 249
isDictFunId id = case idFlavour id of
		   DictFunId -> True
		   other     -> False

250 251
-- Don't drop a binding for an exported Id,
-- if it otherwise looks dead.  
252
-- Perhaps a better name would be isDiscardableId
253
isExportedId :: Id -> Bool
254 255 256 257 258 259 260
isExportedId id = case idFlavour id of
			VanillaId  -> False
			other	   -> True

isLocalId :: Id -> Bool
-- True of Ids that are locally defined, but are not constants
-- like data constructors, record selectors, and the like. 
261
-- See comments with CoreFVs.isLocalVar
262 263 264 265 266 267 268 269 270 271
isLocalId id 
#ifdef DEBUG
  | not (isId id) = pprTrace "isLocalid" (ppr id) False
  | otherwise
#endif
  = case idFlavour id of
	 VanillaId    -> True
	 ExportedId   -> True
	 SpecPragmaId -> True
	 other	      -> False
272 273
\end{code}

274

275 276 277
isImplicitId tells whether an Id's info is implied by other
declarations, so we don't need to put its signature in an interface
file, even if it's mentioned in some other interface unfolding.
278 279

\begin{code}
280 281
isImplicitId :: Id -> Bool
isImplicitId id
282
  = case idFlavour id of
283 284 285 286 287
	RecordSelId _   -> True	-- Includes dictionary selectors
        PrimOpId _      -> True
        DataConId _     -> True
	DataConWrapId _ -> True
		-- These are are implied by their type or class decl;
288 289 290
		-- remember that all type and class decls appear in the interface file.
		-- The dfun id must *not* be omitted, because it carries version info for
		-- the instance decl
291
	other		-> False
292 293 294 295
\end{code}

\begin{code}
isDeadBinder :: Id -> Bool
296
isDeadBinder bndr | isId bndr = isDeadOcc (idOccInfo bndr)
297
		  | otherwise = False	-- TyVars count as not dead
298 299 300
\end{code}


301 302
%************************************************************************
%*									*
303
\subsection{IdInfo stuff}
304 305 306
%*									*
%************************************************************************

307
\begin{code}
308 309
	---------------------------------
	-- ARITY
310 311 312 313 314
idArityInfo :: Id -> ArityInfo
idArityInfo id = arityInfo (idInfo id)

idArity :: Id -> Arity
idArity id = arityLowerBound (idArityInfo id)
315

316 317
setIdArityInfo :: Id -> ArityInfo -> Id
setIdArityInfo id arity = modifyIdInfo (`setArityInfo` arity) id
318

319 320
	---------------------------------
	-- STRICTNESS
321 322
idStrictness :: Id -> StrictnessInfo
idStrictness id = strictnessInfo (idInfo id)
323

324
setIdStrictness :: Id -> StrictnessInfo -> Id
325
setIdStrictness id strict_info = modifyIdInfo (`setStrictnessInfo` strict_info) id
326

327 328
-- isBottomingId returns true if an application to n args would diverge
isBottomingId :: Id -> Bool
329
isBottomingId id = isBottomingStrictness (idStrictness id)
330

331 332 333 334 335 336 337 338
	---------------------------------
	-- TYPE GENERALISATION
idTyGenInfo :: Id -> TyGenInfo
idTyGenInfo id = tyGenInfo (idInfo id)

setIdTyGenInfo :: Id -> TyGenInfo -> Id
setIdTyGenInfo id tygen_info = modifyIdInfo (`setTyGenInfo` tygen_info) id

339 340
	---------------------------------
	-- WORKER ID
341 342
idWorkerInfo :: Id -> WorkerInfo
idWorkerInfo id = workerInfo (idInfo id)
343 344

setIdWorkerInfo :: Id -> WorkerInfo -> Id
345
setIdWorkerInfo id work_info = modifyIdInfo (`setWorkerInfo` work_info) id
346

347 348
	---------------------------------
	-- UNFOLDING
349 350
idUnfolding :: Id -> Unfolding
idUnfolding id = unfoldingInfo (idInfo id)
351

352
setIdUnfolding :: Id -> Unfolding -> Id
353
setIdUnfolding id unfolding = modifyIdInfo (`setUnfoldingInfo` unfolding) id
sof's avatar
sof committed
354

355 356
	---------------------------------
	-- DEMAND
357 358
idDemandInfo :: Id -> Demand
idDemandInfo id = demandInfo (idInfo id)
359

360
setIdDemandInfo :: Id -> Demand -> Id
361
setIdDemandInfo id demand_info = modifyIdInfo (`setDemandInfo` demand_info) id
362

363 364
	---------------------------------
	-- SPECIALISATION
365 366
idSpecialisation :: Id -> CoreRules
idSpecialisation id = specInfo (idInfo id)
367

368 369
setIdSpecialisation :: Id -> CoreRules -> Id
setIdSpecialisation id spec_info = modifyIdInfo (`setSpecInfo` spec_info) id
370

371 372
	---------------------------------
	-- CAF INFO
373 374
idCafInfo :: Id -> CafInfo
idCafInfo id = cafInfo (idInfo id)
375

376
setIdCafInfo :: Id -> CafInfo -> Id
377
setIdCafInfo id caf_info = modifyIdInfo (`setCafInfo` caf_info) id
378 379 380

	---------------------------------
	-- CPR INFO
381 382
idCprInfo :: Id -> CprInfo
idCprInfo id = cprInfo (idInfo id)
383 384

setIdCprInfo :: Id -> CprInfo -> Id
385
setIdCprInfo id cpr_info = modifyIdInfo (`setCprInfo` cpr_info) id
386 387 388

	---------------------------------
	-- Occcurrence INFO
389 390
idOccInfo :: Id -> OccInfo
idOccInfo id = occInfo (idInfo id)
391 392 393

setIdOccInfo :: Id -> OccInfo -> Id
setIdOccInfo id occ_info = modifyIdInfo (`setOccInfo` occ_info) id
394 395
\end{code}

sof's avatar
sof committed
396

397 398 399 400
	---------------------------------
	-- INLINING
The inline pragma tells us to be very keen to inline this Id, but it's still
OK not to if optimisation is switched off.
401 402

\begin{code}
403 404
idInlinePragma :: Id -> InlinePragInfo
idInlinePragma id = inlinePragInfo (idInfo id)
405

406
setInlinePragma :: Id -> InlinePragInfo -> Id
407
setInlinePragma id prag = modifyIdInfo (`setInlinePragInfo` prag) id
408

409
modifyInlinePragma :: Id -> (InlinePragInfo -> InlinePragInfo) -> Id
410
modifyInlinePragma id fn = modifyIdInfo (\info -> info `setInlinePragInfo` (fn (inlinePragInfo info))) id
411
\end{code}
412 413 414 415 416


	---------------------------------
	-- ONE-SHOT LAMBDAS
\begin{code}
417 418 419
idLBVarInfo :: Id -> LBVarInfo
idLBVarInfo id = lbvarInfo (idInfo id)

420
isOneShotLambda :: Id -> Bool
421 422 423 424 425 426 427 428
isOneShotLambda id = analysis || hack
  where analysis = case idLBVarInfo id of
                     LBVarInfo u    | u == usOnce             -> True
                     other                                    -> False
        hack     = case splitTyConApp_maybe (idType id) of
                     Just (tycon,_) | tycon == statePrimTyCon -> True
                     other                                    -> False

429 430 431 432 433 434 435 436 437 438 439
	-- The last clause is a gross hack.  It claims that 
	-- every function over realWorldStatePrimTy is a one-shot
	-- function.  This is pretty true in practice, and makes a big
	-- difference.  For example, consider
	--	a `thenST` \ r -> ...E...
	-- The early full laziness pass, if it doesn't know that r is one-shot
	-- will pull out E (let's say it doesn't mention r) to give
	--	let lvl = E in a `thenST` \ r -> ...lvl...
	-- When `thenST` gets inlined, we end up with
	--	let lvl = E in \s -> case a s of (r, s') -> ...lvl...
	-- and we don't re-inline E.
440
	--
441 442
	-- It would be better to spot that r was one-shot to start with, but
	-- I don't want to rely on that.
443 444 445
	--
	-- Another good example is in fill_in in PrelPack.lhs.  We should be able to
	-- spot that fill_in has arity 2 (and when Keith is done, we will) but we can't yet.
446 447

setOneShotLambda :: Id -> Id
448
setOneShotLambda id = modifyIdInfo (`setLBVarInfo` LBVarInfo usOnce) id
449 450 451 452 453 454 455 456 457

clearOneShotLambda :: Id -> Id
clearOneShotLambda id 
  | isOneShotLambda id = modifyIdInfo (`setLBVarInfo` NoLBVarInfo) id
  | otherwise	       = id			

-- But watch out: this may change the type of something else
--	f = \x -> e
-- If we change the one-shot-ness of x, f's type changes
458
\end{code}
459 460 461 462 463 464 465 466 467

\begin{code}
zapFragileIdInfo :: Id -> Id
zapFragileIdInfo id = maybeModifyIdInfo zapFragileInfo id

zapLamIdInfo :: Id -> Id
zapLamIdInfo id = maybeModifyIdInfo zapLamInfo id
\end{code}