
Now that I'm looking at the proper thing, I'm a bit confused and have
#10346: Cross-module SpecConstr -------------------------------------+------------------------------------- Reporter: simonpj | Owner: ckoparkar Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.10.1 Resolution: | Keywords: SpecConstr, | newcomer Operating System: Unknown/Multiple | Architecture: Type of failure: Runtime | Unknown/Multiple performance bug | Test Case: Blocked By: | Blocking: Related Tickets: #13016 | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by sgraf): Replying to [comment:18 ckoparkar]: the same question as ak3n did. I blame the example. 1. After SpecConstr runs on M, the call isn't really recursive anymore: There will be a specialisation for the call pattern `[x, y] |> [True, (x, y)]`. The resulting function is non-recursive, inlined, and suddenly foo itself isn't recursive anymore and simply gets inlined in X. 2. The `baz` binding in M will make it so that there is a specialisation for the call pattern `[x,y] |> [False, (x,y)]` anyway. The call in X matches this pattern, so will be specialised appropriately. Try this instead: {{{#!hs module M where {-# INLINABLE foo #-} foo 0 y = y foo n y = foo (n-1) y --baz = foo 14 (2,2) --------------------- module X where import M bar = foo 2 (3,4) }}} This works better, because integer literals are not currently considered values (probably to avoid code bloat through endless loop unrolling). Notice that the call in X specialises iff you comment in `baz` in M which has the same call pattern. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10346#comment:19 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler