diff options
author | Ömer Sinan Ağacan <omeragacan@gmail.com> | 2018-11-12 06:50:54 +0300 |
---|---|---|
committer | Ömer Sinan Ağacan <omeragacan@gmail.com> | 2018-11-12 06:51:49 +0300 |
commit | d30352add1da67dd0346613853cd423c7becbaeb (patch) | |
tree | 634126b59821c7b6b27cd00fc3fa287811d86b25 /compiler/codeGen | |
parent | 13ff0b7ced097286e0d7b054f050871effe07f86 (diff) | |
download | haskell-d30352add1da67dd0346613853cd423c7becbaeb.tar.gz |
Remove StgBinderInfo and related computation in CoreToStg
- The StgBinderInfo type was never used in the code gen, so the type, related
computation in CoreToStg, and some comments about it are removed. See #15770
for more details.
- Simplified CoreToStg after removing the StgBinderInfo computation: removed
StgBinderInfo arguments and mfix stuff.
The StgBinderInfo values were not used in the code gen, but I still run nofib
just to make sure: 0.0% change in allocations and binary sizes.
Test Plan: Validated locally
Reviewers: simonpj, simonmar, bgamari, sgraf
Reviewed By: sgraf
Subscribers: AndreasK, sgraf, rwbarton, carter
Differential Revision: https://phabricator.haskell.org/D5232
Diffstat (limited to 'compiler/codeGen')
-rw-r--r-- | compiler/codeGen/StgCmm.hs | 4 | ||||
-rw-r--r-- | compiler/codeGen/StgCmmBind.hs | 15 | ||||
-rw-r--r-- | compiler/codeGen/StgCmmClosure.hs | 86 | ||||
-rw-r--r-- | compiler/codeGen/StgCmmExpr.hs | 2 |
4 files changed, 10 insertions, 97 deletions
diff --git a/compiler/codeGen/StgCmm.hs b/compiler/codeGen/StgCmm.hs index 60be1ca01b..5b80ba61d9 100644 --- a/compiler/codeGen/StgCmm.hs +++ b/compiler/codeGen/StgCmm.hs @@ -153,9 +153,9 @@ cgTopRhs dflags _rec bndr (StgRhsCon _cc con args) -- con args are always non-void, -- see Note [Post-unarisation invariants] in UnariseStg -cgTopRhs dflags rec bndr (StgRhsClosure cc bi fvs upd_flag args body) +cgTopRhs dflags rec bndr (StgRhsClosure cc fvs upd_flag args body) = ASSERT(null fvs) -- There should be no free variables - cgTopRhsClosure dflags rec bndr cc bi upd_flag args body + cgTopRhsClosure dflags rec bndr cc upd_flag args body --------------------------------------------------------------- diff --git a/compiler/codeGen/StgCmmBind.hs b/compiler/codeGen/StgCmmBind.hs index aa2b954a95..004bf90c67 100644 --- a/compiler/codeGen/StgCmmBind.hs +++ b/compiler/codeGen/StgCmmBind.hs @@ -62,13 +62,12 @@ cgTopRhsClosure :: DynFlags -> RecFlag -- member of a recursive group? -> Id -> CostCentreStack -- Optional cost centre annotation - -> StgBinderInfo -> UpdateFlag -> [Id] -- Args -> StgExpr -> (CgIdInfo, FCode ()) -cgTopRhsClosure dflags rec id ccs _ upd_flag args body = +cgTopRhsClosure dflags rec id ccs upd_flag args body = let closure_label = mkLocalClosureLabel (idName id) (idCafInfo id) cg_id_info = litIdInfo dflags id lf_info (CmmLabel closure_label) lf_info = mkClosureLFInfo dflags id TopLevel [] upd_flag args @@ -207,15 +206,15 @@ cgRhs id (StgRhsCon cc con args) -- see Note [Post-unarisation invariants] in UnariseStg {- See Note [GC recovery] in compiler/codeGen/StgCmmClosure.hs -} -cgRhs id (StgRhsClosure cc bi fvs upd_flag args body) +cgRhs id (StgRhsClosure cc fvs upd_flag args body) = do dflags <- getDynFlags - mkRhsClosure dflags id cc bi (nonVoidIds fvs) upd_flag args body + mkRhsClosure dflags id cc (nonVoidIds fvs) upd_flag args body ------------------------------------------------------------------------ -- Non-constructor right hand sides ------------------------------------------------------------------------ -mkRhsClosure :: DynFlags -> Id -> CostCentreStack -> StgBinderInfo +mkRhsClosure :: DynFlags -> Id -> CostCentreStack -> [NonVoid Id] -- Free vars -> UpdateFlag -> [Id] -- Args @@ -258,7 +257,7 @@ for semi-obvious reasons. -} ---------- Note [Selectors] ------------------ -mkRhsClosure dflags bndr _cc _bi +mkRhsClosure dflags bndr _cc [NonVoid the_fv] -- Just one free var upd_flag -- Updatable thunk [] -- A thunk @@ -291,7 +290,7 @@ mkRhsClosure dflags bndr _cc _bi in cgRhsStdThunk bndr lf_info [StgVarArg the_fv] ---------- Note [Ap thunks] ------------------ -mkRhsClosure dflags bndr _cc _bi +mkRhsClosure dflags bndr _cc fvs upd_flag [] -- No args; a thunk @@ -323,7 +322,7 @@ mkRhsClosure dflags bndr _cc _bi payload = StgVarArg fun_id : args ---------- Default case ------------------ -mkRhsClosure dflags bndr cc _ fvs upd_flag args body +mkRhsClosure dflags bndr cc fvs upd_flag args body = do { let lf_info = mkClosureLFInfo dflags bndr NotTopLevel fvs upd_flag args ; (id_info, reg) <- rhsIdInfo bndr lf_info ; return (id_info, gen_code lf_info reg) } diff --git a/compiler/codeGen/StgCmmClosure.hs b/compiler/codeGen/StgCmmClosure.hs index 6f0feaa557..65e7cf7dab 100644 --- a/compiler/codeGen/StgCmmClosure.hs +++ b/compiler/codeGen/StgCmmClosure.hs @@ -623,92 +623,6 @@ getCallMethod _ _name _ LFLetNoEscape _n_args _v_args (LneLoc blk_id lne_regs) getCallMethod _ _ _ _ _ _ _ _ = panic "Unknown call method" ----------------------------------------------------------------------------- --- staticClosureRequired ------------------------------------------------------------------------------ - -{- staticClosureRequired is never called (hence commented out) - - SimonMar writes (Sept 07) It's an optimisation we used to apply at - one time, I believe, but it got lost probably in the rewrite of - the RTS/code generator. I left that code there to remind me to - look into whether it was worth doing sometime - -{- Avoiding generating entries and info tables - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -At present, for every function we generate all of the following, -just in case. But they aren't always all needed, as noted below: - -[NB1: all of this applies only to *functions*. Thunks always -have closure, info table, and entry code.] - -[NB2: All are needed if the function is *exported*, just to play safe.] - -* Fast-entry code ALWAYS NEEDED - -* Slow-entry code - Needed iff (a) we have any un-saturated calls to the function - OR (b) the function is passed as an arg - OR (c) we're in the parallel world and the function has free vars - [Reason: in parallel world, we always enter functions - with free vars via the closure.] - -* The function closure - Needed iff (a) we have any un-saturated calls to the function - OR (b) the function is passed as an arg - OR (c) if the function has free vars (ie not top level) - - Why case (a) here? Because if the arg-satis check fails, - UpdatePAP stuffs a pointer to the function closure in the PAP. - [Could be changed; UpdatePAP could stuff in a code ptr instead, - but doesn't seem worth it.] - - [NB: these conditions imply that we might need the closure - without the slow-entry code. Here's how. - - f x y = let g w = ...x..y..w... - in - ...(g t)... - - Here we need a closure for g which contains x and y, - but since the calls are all saturated we just jump to the - fast entry point for g, with R1 pointing to the closure for g.] - - -* Standard info table - Needed iff (a) we have any un-saturated calls to the function - OR (b) the function is passed as an arg - OR (c) the function has free vars (ie not top level) - - NB. In the sequential world, (c) is only required so that the function closure has - an info table to point to, to keep the storage manager happy. - If (c) alone is true we could fake up an info table by choosing - one of a standard family of info tables, whose entry code just - bombs out. - - [NB In the parallel world (c) is needed regardless because - we enter functions with free vars via the closure.] - - If (c) is retained, then we'll sometimes generate an info table - (for storage mgr purposes) without slow-entry code. Then we need - to use an error label in the info table to substitute for the absent - slow entry code. --} - -staticClosureRequired - :: Name - -> StgBinderInfo - -> LambdaFormInfo - -> Bool -staticClosureRequired binder bndr_info - (LFReEntrant top_level _ _ _ _) -- It's a function - = ASSERT( isTopLevel top_level ) - -- Assumption: it's a top-level, no-free-var binding - not (satCallsOnly bndr_info) - -staticClosureRequired binder other_binder_info other_lf_info = True --} - ------------------------------------------------------------------------------ -- Data types for closure information ----------------------------------------------------------------------------- diff --git a/compiler/codeGen/StgCmmExpr.hs b/compiler/codeGen/StgCmmExpr.hs index 1af8fb3376..7fc9dfc829 100644 --- a/compiler/codeGen/StgCmmExpr.hs +++ b/compiler/codeGen/StgCmmExpr.hs @@ -151,7 +151,7 @@ cgLetNoEscapeRhsBody -> Id -> StgRhs -> FCode (CgIdInfo, FCode ()) -cgLetNoEscapeRhsBody local_cc bndr (StgRhsClosure cc _bi _ _upd args body) +cgLetNoEscapeRhsBody local_cc bndr (StgRhsClosure cc _ _upd args body) = cgLetNoEscapeClosure bndr local_cc cc (nonVoidIds args) body cgLetNoEscapeRhsBody local_cc bndr (StgRhsCon cc con args) = cgLetNoEscapeClosure bndr local_cc cc [] |