[project @ 1996-12-19 09:10:02 by simonpj]
[ghc-hetmet.git] / ghc / compiler / simplCore / SimplVar.lhs
1 %
2 % (c) The AQUA Project, Glasgow University, 1993-1996
3 %
4 \section[SimplVar]{Simplifier stuff related to variables}
5
6 \begin{code}
7 #include "HsVersions.h"
8
9 module SimplVar (
10         completeVar
11     ) where
12
13 IMP_Ubiq(){-uitous-}
14 IMPORT_DELOOPER(SmplLoop)               ( simplExpr )
15
16 import Constants        ( uNFOLDING_USE_THRESHOLD,
17                           uNFOLDING_CON_DISCOUNT_WEIGHT
18                         )
19 import CmdLineOpts      ( switchIsOn, SimplifierSwitch(..) )
20 import CoreSyn
21 import CoreUnfold       ( Unfolding(..), UfExpr, RdrName, UnfoldingGuidance(..), SimpleUnfolding(..),
22                           FormSummary,
23                           okToInline, smallEnoughToInline )
24 import BinderInfo       ( BinderInfo, noBinderInfo )
25
26 import CostCentre       ( CostCentre, noCostCentreAttached )
27 import Id               ( idType, getIdInfo, getIdUnfolding, getIdSpecialisation,
28                           idMustBeINLINEd, GenId{-instance Outputable-}
29                         )
30 import SpecEnv          ( SpecEnv, lookupSpecEnv )
31 import IdInfo           ( DeforestInfo(..) )
32 import Literal          ( isNoRepLit )
33 import MagicUFs         ( applyMagicUnfoldingFun, MagicUnfoldingFun )
34 import PprStyle         ( PprStyle(..) )
35 import PprType          ( GenType{-instance Outputable-} )
36 import Pretty           ( ppBesides, ppStr )
37 import SimplEnv
38 import SimplMonad
39 import TyCon            ( tyConFamilySize )
40 import Util             ( pprTrace, assertPanic, panic )
41 import Maybes           ( maybeToBool )
42 \end{code}
43
44 %************************************************************************
45 %*                                                                      *
46 \subsection[Simplify-var]{Completing variables}
47 %*                                                                      *
48 %************************************************************************
49
50 This where all the heavy-duty unfolding stuff comes into its own.
51
52 \begin{code}
53 completeVar env var args
54
55   | maybeToBool maybe_magic_result
56   = tick MagicUnfold    `thenSmpl_`
57     magic_result
58
59   | not do_deforest &&
60     maybeToBool maybe_unfolding_info &&
61     (not essential_unfoldings_only || idMustBeINLINEd var) && 
62     ok_to_inline &&
63         -- If "essential_unfolds_only" is true we do no inlinings at all,
64         -- EXCEPT for things that absolutely have to be done
65         -- (see comments with idMustBeINLINEd)
66         --
67         -- Need to be careful: the RHS of INLINE functions is protected against inlining
68         -- by essential_unfoldings_only being set true; we must not inline workers back into
69         -- wrappers, even thouth the former have an unfold-always guidance.
70     costCentreOk (getEnclosingCC env) (getEnclosingCC unfold_env)
71   = tick UnfoldingDone  `thenSmpl_`
72     simplExpr unfold_env unf_template args
73
74   | maybeToBool maybe_specialisation
75   = tick SpecialisationDone     `thenSmpl_`
76     simplExpr (extendTyEnvList env spec_bindings) 
77               spec_template
78               (map TyArg leftover_ty_args ++ remaining_args)
79
80   | otherwise
81   = returnSmpl (mkGenApp (Var var) args)
82
83   where
84     unfolding_from_id = getIdUnfolding var
85
86         ---------- Magic unfolding stuff
87     maybe_magic_result  = case unfolding_from_id of
88                                 MagicUnfolding _ magic_fn -> applyMagicUnfoldingFun magic_fn 
89                                                                                     env args
90                                 other                     -> Nothing
91     (Just magic_result) = maybe_magic_result
92
93         ---------- Unfolding stuff
94     maybe_unfolding_info 
95         = case (lookupOutIdEnv env var, unfolding_from_id) of
96              (Just (_, occ_info, OutUnfolding enc_cc unf), _)
97                 -> Just (occ_info, setEnclosingCC env enc_cc, unf)      
98              (Just (_, occ_info, InUnfolding env_unf unf), _)
99                 -> Just (occ_info, combineSimplEnv env env_unf, unf)    
100              (_, CoreUnfolding unf)
101                 -> Just (noBinderInfo, env, unf)
102
103              other -> Nothing
104
105     Just (occ_info, unfold_env, simple_unfolding)     = maybe_unfolding_info
106     SimpleUnfolding form guidance unf_template = simple_unfolding
107
108         ---------- Specialisation stuff
109     (ty_args, remaining_args) = initialTyArgs args
110     maybe_specialisation = lookupSpecEnv (getIdSpecialisation var) ty_args
111     (Just (spec_template, (spec_bindings, leftover_ty_args))) = maybe_specialisation
112
113
114         ---------- Switches
115     sw_chkr                   = getSwitchChecker env
116     essential_unfoldings_only = switchIsOn sw_chkr EssentialUnfoldingsOnly
117     always_inline             = case guidance of {UnfoldAlways -> True; other -> False}
118     ok_to_inline              = okToInline form 
119                                            occ_info
120                                            small_enough
121     small_enough = smallEnoughToInline arg_evals guidance
122     arg_evals = [is_evald arg | arg <- args, isValArg arg]
123   
124     is_evald (VarArg v) = isEvaluated (lookupRhsInfo env v)
125     is_evald (LitArg l) = True
126
127 #if OMIT_DEFORESTER
128     do_deforest = False
129 #else
130     do_deforest = case (getDeforestInfo (getIdInfo var)) of { DoDeforest -> True; _ -> False }
131 #endif
132
133
134 -- costCentreOk checks that it's ok to inline this thing
135 -- The time it *isn't* is this:
136 --
137 --      f x = let y = E in
138 --            scc "foo" (...y...)
139 --
140 -- Here y has a subsumed cost centre, and we can't inline it inside "foo",
141 -- regardless of whether E is a WHNF or not.
142
143 costCentreOk cc_encl cc_rhs
144   = noCostCentreAttached cc_encl || not (noCostCentreAttached cc_rhs)
145 \end{code}                 
146