#10788: performance regression involving minimum (and maybe Vector) -------------------------------------+------------------------------------- Reporter: rwbarton | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.10.1 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: Runtime | Unknown/Multiple performance bug | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Revisions: -------------------------------------+------------------------------------- Comment (by nomeata): GHC 7.8 will actually inline `minimum` (and hence `foldl1` and `foldl`), allowing the compiler to specialize it for the type at hand: {{{#!hs Rec { $wlgo_r6X4 :: GHC.Prim.Int# -> [GHC.Types.Int] -> GHC.Prim.Int# [GblId, Arity=2, Caf=NoCafRefs, Str=DmdType <L,U><S,1*U>] $wlgo_r6X4 = \ (ww_s6TV :: GHC.Prim.Int#) (w_s6TS :: [GHC.Types.Int]) -> case w_s6TS of _ [Occ=Dead] { [] -> ww_s6TV; : x_a52E xs_a52F -> case x_a52E of _ [Occ=Dead] { GHC.Types.I# y1_a52Q -> case GHC.Prim.tagToEnum# @ GHC.Types.Bool (GHC.Prim.<=# ww_s6TV y1_a52Q) of _ [Occ=Dead] { GHC.Types.False -> $wlgo_r6X4 y1_a52Q xs_a52F; GHC.Types.True -> $wlgo_r6X4 ww_s6TV xs_a52F } } } end Rec } }}} GHC-7.10 will ''not'' inline `minimum`, but only replace it by `minimumStrict` via a rule, and the latter then called polymorphically: {{{#!hs ... case strictMinimum @ Int GHC.Classes.$fOrdInt (go_a6gJ cs_r9bl) of _ [Occ=Dead] { I# y_a6hm -> }}} GHC-7.8’s inlining seems to be a little excessive, but in 7.10 there is certainly a lack of specialization. Maybe some `INLINEABLE` pragma would help? Not sure... -- Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10788#comment:2> GHC <http://www.haskell.org/ghc/> The Glasgow Haskell Compiler