diff options
author | nineonine <mail4chemik@gmail.com> | 2021-05-17 11:25:53 -0700 |
---|---|---|
committer | nineonine <mail4chemik@gmail.com> | 2021-11-23 22:32:51 -0800 |
commit | 1669037430f968dd25a6339edfc95d6091974b61 (patch) | |
tree | 80984faf0fc3c1322d12b016fdaea385a1ab5e8d /compiler/GHC/Driver | |
parent | 9dcb2ad15df54e209cfae3dd1f51cf8e8d6c69d5 (diff) | |
download | haskell-1669037430f968dd25a6339edfc95d6091974b61.tar.gz |
Combine STG free variable traversals (#17978)
Previously we would traverse the STG AST twice looking for free variables.
* Once in `annTopBindingsDeps` which considers top level and imported ids free.
Its output is used to put bindings in dependency order. The pass happens
in STG pipeline.
* Once in `annTopBindingsFreeVars` which only considers non-top level ids free.
Its output is used by the code generator to compute offsets into closures.
This happens in Cmm (CodeGen) pipeline.
Now these two traversal operations are merged into one - `FVs.depSortWithAnnotStgPgm`.
The pass happens right at the end of STG pipeline. Some type signatures had to be
updated due to slight shifts of StgPass boundaries (for example, top-level CodeGen
handler now directly works with CodeGen flavoured Stg AST instead of Vanilla).
Due to changed order of bindings, a few debugger type reconstruction bugs
have resurfaced again (see tests break018, break021) - work item #18004 tracks this
investigation.
authors: simonpj, nineonine
Diffstat (limited to 'compiler/GHC/Driver')
-rw-r--r-- | compiler/GHC/Driver/Main.hs | 23 |
1 files changed, 10 insertions, 13 deletions
diff --git a/compiler/GHC/Driver/Main.hs b/compiler/GHC/Driver/Main.hs index ffc0cef89d..c403b3e85a 100644 --- a/compiler/GHC/Driver/Main.hs +++ b/compiler/GHC/Driver/Main.hs @@ -160,7 +160,6 @@ import GHC.Tc.Utils.Monad import GHC.Tc.Utils.Zonk ( ZonkFlexi (DefaultFlexi) ) import GHC.Stg.Syntax -import GHC.Stg.FVs ( annTopBindingsFreeVars ) import GHC.Stg.Pipeline ( stg2stg ) import GHC.Builtin.Utils @@ -1767,24 +1766,22 @@ This reduces residency towards the end of the CodeGen phase significantly (5-10%). -} -doCodeGen :: HscEnv -> Module -> InfoTableProvMap -> [TyCon] - -> CollectedCCs - -> [StgTopBinding] - -> HpcInfo - -> IO (Stream IO CmmGroupSRTs CgInfos) +doCodeGen :: HscEnv -> Module -> InfoTableProvMap -> [TyCon] + -> CollectedCCs + -> [CgStgTopBinding] -- ^ Bindings come already annotated with fvs + -> HpcInfo + -> IO (Stream IO CmmGroupSRTs CgInfos) -- Note we produce a 'Stream' of CmmGroups, so that the -- backend can be run incrementally. Otherwise it generates all -- the C-- up front, which has a significant space cost. doCodeGen hsc_env this_mod denv data_tycons - cost_centre_info stg_binds hpc_info = do + cost_centre_info stg_binds_w_fvs hpc_info = do let dflags = hsc_dflags hsc_env let logger = hsc_logger hsc_env let hooks = hsc_hooks hsc_env let tmpfs = hsc_tmpfs hsc_env let platform = targetPlatform dflags - let stg_binds_w_fvs = annTopBindingsFreeVars stg_binds - putDumpFileMaybe logger Opt_D_dump_stg_final "Final STG:" FormatSTG (pprGenStgTopBindings (initStgPprOpts dflags) stg_binds_w_fvs) let stg_to_cmm = case stgToCmmHook hooks of @@ -1829,7 +1826,7 @@ myCoreToStgExpr :: Logger -> DynFlags -> InteractiveContext -> Bool -> Module -> ModLocation -> CoreExpr -> IO ( Id - , [StgTopBinding] + , [CgStgTopBinding] , InfoTableProvMap , CollectedCCs ) myCoreToStgExpr logger dflags ictxt for_bytecode this_mod ml prepd_expr = do @@ -1852,7 +1849,7 @@ myCoreToStgExpr logger dflags ictxt for_bytecode this_mod ml prepd_expr = do myCoreToStg :: Logger -> DynFlags -> InteractiveContext -> Bool -> Module -> ModLocation -> CoreProgram - -> IO ( [StgTopBinding] -- output program + -> IO ( [CgStgTopBinding] -- output program , InfoTableProvMap , CollectedCCs ) -- CAF cost centre info (declared and used) myCoreToStg logger dflags ictxt for_bytecode this_mod ml prepd_binds = do @@ -1860,11 +1857,11 @@ myCoreToStg logger dflags ictxt for_bytecode this_mod ml prepd_binds = do = {-# SCC "Core2Stg" #-} coreToStg dflags this_mod ml prepd_binds - stg_binds2 + stg_binds_with_fvs <- {-# SCC "Stg2Stg" #-} stg2stg logger dflags ictxt for_bytecode this_mod stg_binds - return (stg_binds2, denv, cost_centre_info) + return (stg_binds_with_fvs, denv, cost_centre_info) {- ********************************************************************** %* * |