
#10830: maximumBy has a space leak -------------------------------------+------------------------------------- Reporter: NeilMitchell | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: libraries/base | Version: 7.10.2 Resolution: | Keywords: Operating System: Windows | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Revisions: -------------------------------------+------------------------------------- Comment (by nomeata): In 7.8, the core is nice and fully inlined: {{{#!hs Rec { main_lgo main_lgo = \ z_a1k8 ds2_a1k9 -> case ds2_a1k9 of _ { [] -> z_a1k8; : x_a1kh xs_a1ki -> case compareInteger z_a1k8 x_a1kh of _ { __DEFAULT -> main_lgo x_a1kh xs_a1ki; GT -> main_lgo z_a1k8 xs_a1ki } } end Rec } }}} In HEAD, we have a call to `foldr1`: {{{#!hs main5 = \ x_a2pT y_a2pU -> case compareInteger x_a2pT y_a2pU of _ { __DEFAULT -> y_a2pU; GT -> x_a2pT } main2 = enumDeltaToInteger1 main4 main3 main1 = \ eta_B1 -> case foldr1 main5 main2 of _ { __DEFAULT -> (# eta_B1, () #) } }}} I think you are right that this is some BBP-fallout. Note that `maximumBy` is implemented in `Data.Foldable` using `foldr1`. If I make `foldr1` inlinable (by using a local worker), I get {{{#!hs Rec { -- RHS size: {terms: 19, types: 9, coercions: 0} main_go main_go = \ ds2_a1Fi eta_a1Fj -> case ds2_a1Fi of _ { [] -> eta_a1Fj; : y_a1Fr ys_a1Fs -> case compareInteger eta_a1Fj y_a1Fr of _ { __DEFAULT -> main_go ys_a1Fs y_a1Fr; GT -> main_go ys_a1Fs eta_a1Fj } } end Rec } }}} which is equivalent to the 7.8 code. Given that we inline `foldr`, I do not see a reason not to inline `foldr1`. DR coming soon... -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10830#comment:3 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler