
#14948: A program which benefits from a late specialisation pass -------------------------------------+------------------------------------- Reporter: mpickering | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.2.2 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 mpickering): The code in question first uses a type class to generate an overloaded function. The overloaded function is not immediately apparent, it is defined in terms of combinators which must be inlined and then later we get calls of `fmap` next to a dictionary which can be specialised upon. Diffing the core output immediately shows where the difference is. In the bad version we have lots of calls to `fmap` which are not eliminated because the function they are contained in is not specialised. {{{ 1486,1497c1514,1560 < -- RHS size: {terms: 13, types: 12, coercions: 13, joins: 0/0} < $s$fGHasTypeskaK1_$cgtypes_$s$dHastypes' < $s$fGHasTypeskaK1_$cgtypes_$s$dHastypes' < = \ eta_B2 eta1_B1 -> < case eta1_B1 of { < [] -> [] `cast` Co:4; < : g1_ab8Q g2_ab8R -> < (: ((eta_B2 g1_ab8Q) `cast` Co:2) < (($s$fGHasTypeskaK1_$cgtypes_$s$dHastypes' eta_B2 g2_ab8R) < `cast` Co:3)) < `cast` Co:4 < } ---
-- RHS size: {terms: 63, types: 791, coercions: 308, joins: 0/0} $s$fGHasTypeskaK1_$cgtypes1 $s$fGHasTypeskaK1_$cgtypes1 = \ @ f_a5xv $dApplicative_a5xx eta_B2 eta1_B1 -> fmap ($p1Applicative $dApplicative_a5xx) $fGeneric[]_$cto ((fmap ($p1Applicative $dApplicative_a5xx) ($s$fGHasTypeskaK1_$cgtypes8 `cast` Co:121) (case eta1_B1 of { [] -> fmap ($p1Applicative $dApplicative_a5xx) L1 (fmap ($p1Applicative $dApplicative_a5xx) ($s$fGHasTypeskaK1_$cgtypes7 `cast` Co:22) (pure $dApplicative_a5xx U1)); : g1_abai g2_abaj -> fmap ($p1Applicative $dApplicative_a5xx) R1 (fmap ($p1Applicative $dApplicative_a5xx) ($s$fGHasTypeskaK1_$cgtypes6 `cast` Co:78) (<*> $dApplicative_a5xx (fmap ($p1Applicative $dApplicative_a5xx) :*: (fmap ($p1Applicative $dApplicative_a5xx) ($s$fGHasTypeskaK1_$cgtypes5 `cast` Co:28) (fmap ($p1Applicative $dApplicative_a5xx) ($s$fGHasTypeskaK1_$cgtypes4 `cast` Co:11) (eta_B2 g1_abai)))) (fmap ($p1Applicative $dApplicative_a5xx) ($s$fGHasTypeskaK1_$cgtypes3 `cast` Co:28) (fmap ($p1Applicative $dApplicative_a5xx) ($s$fGHasTypeskaK1_$cgtypes2 `cast` Co:13) ($s$fGHasTypeskaK1_$cgtypes1 $dApplicative_a5xx eta_B2 g2_abaj))))) })) `cast` Co:7) }}}
-- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14948#comment:2 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler