
#13426: compile-time memory-usage regression for DynFlags between GHC 8.0 and GHC 8.2 -------------------------------------+------------------------------------- Reporter: hvr | Owner: rwbarton Type: bug | Status: new Priority: high | Milestone: 8.2.1 Component: Compiler | Version: 8.1 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: Compile-time | Unknown/Multiple performance bug | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Phab:D3399, Wiki Page: | Phab:D3400 -------------------------------------+------------------------------------- Comment (by simonpj): About forcing the type before passing to `mkBoringStop`. Often the type passed into `mkBoringStop` is discarded unused, so I'd prefer not to force it when building a `SimplCont`. I'd prefer to force it when getting it out of the `SimplCont`. Notably, `contResultType` does that. So, possible alternative plan: when extracting the `contResultType` can we just force it then? E.g. {{{ ; let alts_ty' = contResultType dup_cont ; case_expr <- mkCase dflags scrut' case_bndr' alts_ty' alts' }}} Aha -- you have already added a `seq` there! Here's another (line 1622 of `Simplify`) {{{ missingAlt env case_bndr _ cont = WARN( True, text "missingAlt" <+> ppr case_bndr ) return (env, mkImpossibleExpr (contResultType cont)) }}} Here want to force that type. Ditto here (line 1656) {{{ | not (contIsTrivial cont) -- Only do this if there is a non-trivial = return (env, castBottomExpr res cont_ty) -- continuation to discard, else we do it where -- again and again! res = argInfoExpr fun rev_args cont_ty = contResultType cont }}} But not here (line 1591) {{{ trim_cont 0 cont = mkBoringStop (contResultType cont) }} because we are just building another `SimplCont`. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/13426#comment:19 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler