[GHC] #8668: SPECIALIZE silently fails to apply

GHC ghc-devs at haskell.org
Thu Jan 16 19:20:34 UTC 2014


#8668: SPECIALIZE silently fails to apply
-------------------------------------+----------------------------------
        Reporter:  crockeea          |            Owner:
            Type:  bug               |           Status:  new
        Priority:  normal            |        Milestone:
       Component:  Compiler          |          Version:  7.6.2
      Resolution:                    |         Keywords:
Operating System:  Unknown/Multiple  |     Architecture:  x86_64 (amd64)
 Type of failure:  None/Unknown      |       Difficulty:  Unknown
       Test Case:                    |       Blocked By:
        Blocking:                    |  Related Tickets:
-------------------------------------+----------------------------------

Comment (by crockeea):

 I updated the files again per your suggestion, and get identical behavior.

 I expect the `vtTest` (currently fast) and `fcTest` (currently slow) to
 have the same runtime, e.g. < 2 seconds runtime difference. The two
 functions are doing the same work, but `fcTest` has one more level of
 indirection (one more wrapper on the type, and one more function call per
 addition).

 As far as "doing a lot of work unpacking `Pow` constructors",
 `plusFastCyc` is iterated 100 times, but the runtime difference is 1
 minute 18 seconds. I'm willing to pay for 100 function calls, but I think
 we can agree that something more is going on than just unpacking
 constructors.

 I put some core snippets here [http://lpaste.net/98593]
 This was compiled with -O3 using the `forall`'d SPECIALIZATION.
 On line 10, you can see that GHC does write a specialized version of
 `plusFastCyc`, compared to the generic version on line 167.
 The rule for the specialization is on line 225. I believe this rule should
 fire on line 270. (`main6` calls `iterate main8 y`, so `main8` is where
 `plusFastCyc` should be specialized.)





 In regards to GHC auto-specializing: if I do not explicitly specialize
 `plusFastCyc` at all (but still mark it as `INLINABLE`), `fcTest` is slow.
 If instead I specialize `plusFastCyc` with concrete types as in the
 comment, `fcTest` is fast. Thus it appears GHC is *not* auto-specializing
 `plusFastCyc`, despite it being marked as `INLINABLE`.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/8668#comment:5>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list