
#13316: Bad inlining cascade leads to slow optimisation -------------------------------------+------------------------------------- Reporter: simonpj | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.0.1 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by simonpj): I've just discovered that this inline cascade happens in a module of GHC itself: `StgCmmBind`. Here's the output if you compile with `-fmax- simplifier-iterations=8`: {{{ WARNING: file compiler/simplCore/SimplCore.hs, line 700 Simplifier bailing out after 8 iterations [2478, 266, 16, 1, 1, 1, 2, 1] Size = {terms: 2,793, types: 8,470, coercions: 529, joins: 4/77} WARNING: file compiler/simplCore/SimplCore.hs, line 700 Simplifier bailing out after 8 iterations [990, 166, 9, 4, 2, 4, 2, 3] Size = {terms: 4,605, types: 13,273, coercions: 302, joins: 21/138} }}} The cascade of iterations with only one or two ticks each time comes from exactly the kind of nested data constructor applications in the description. To be specific, in `closureCodeBody`, at some point we see code like this, and those `wild` variables get inlined one by one: {{{ let { wild1_so1n :: CLabel [LclId, Unf=Unf{Src=<vanilla>, TopLvl=False, Value=False, ConLike=False, WorkFree=False, Expandable=False, Guidance=IF_ARGS [] 30 0}] wild1_so1n = closureLocalEntryLabel ipv_anWK cl_info_aegJ } in let { wild1_so1m :: CmmLit [LclId, Unf=Unf{Src=<vanilla>, TopLvl=False, Value=True, ConLike=True, WorkFree=True, Expandable=True, Guidance=IF_ARGS [] 10 20}] wild1_so1m = CmmExpr.CmmLabel wild1_so1n } in let { wild1_so1l :: CmmExpr [LclId, Unf=Unf{Src=<vanilla>, TopLvl=False, Value=True, ConLike=True, WorkFree=True, Expandable=True, Guidance=IF_ARGS [] 10 20}] wild1_so1l = CmmExpr.CmmLit wild1_so1m } in let { wild1_so1k :: CmmNode hoopl-3.10.2.2:Compiler.Hoopl.Block.O hoopl-3.10.2.2:Compiler.Hoopl.Block.C [LclId, Unf=Unf{Src=<vanilla>, TopLvl=False, Value=True, ConLike=True, WorkFree=True, Expandable=True, Guidance=IF_ARGS [] 10 70}] wild1_so1k = CmmNode.CmmCall @ hoopl-3.10.2.2:Compiler.Hoopl.Block.O @ hoopl-3.10.2.2:Compiler.Hoopl.Block.C @~ (hoopl-3.10.2.2:Compiler.Hoopl.Block.O_N :: (hoopl-3.10.2.2:Compiler.Hoopl.Block.O :: *) ghc-prim-0.5.0.0:GHC.Prim.~# (hoopl-3.10.2.2:Compiler.Hoopl.Block.O :: *)) @~ (hoopl-3.10.2.2:Compiler.Hoopl.Block.C_N :: (hoopl-3.10.2.2:Compiler.Hoopl.Block.C :: *) ghc-prim-0.5.0.0:GHC.Prim.~# (hoopl-3.10.2.2:Compiler.Hoopl.Block.C :: *)) wild1_so1l (GHC.Base.Nothing @ BlockId) ww2_ao10 ww1_ao0Z MkGraph.mkFinalCall1 updfr_off_alrO } in case wild_ao13 of wild2_ao15 { __DEFAULT -> OrdList.Snoc @ CgStmt wild2_ao15 (MkGraph.CgLast wild1_so1k); OrdList.One a1_ao1b -> OrdList.Cons @ CgStmt a1_ao1b (OrdList.One @ CgStmt (MkGraph.CgLast wild1_so1k)) }; }}} -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/13316#comment:4 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler