[GHC] #10526: Overlapping instances, incoherence, and optimisation
GHC
ghc-devs at haskell.org
Mon Jun 15 09:18:51 UTC 2015
#10526: Overlapping instances, incoherence, and optimisation
-------------------------------------+-------------------------------------
Reporter: simonpj | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.10.1
Keywords: | Operating System: Unknown/Multiple
Architecture: | Type of failure: None/Unknown
Unknown/Multiple | Blocked By:
Test Case: | Related Tickets:
Blocking: |
Differential Revisions: |
-------------------------------------+-------------------------------------
Segei Meshveliani reports that his `docon` library has rather unexpected
behaviour with GHC 7.10. See [https://mail.haskell.org/pipermail/glasgow-
haskell-users/2015-May/025916.html his email].
The effect is that his test module `Main` has different runtime behaviour
when compiling with and without `-O`. This sounds pretty bad.
The reason is this:
* He has overlapping instances for a class, say
* `instance ... => C (T a)`, call it (A)
* `instance C (T Int)`, call it (B)
The actual situation is more complicated of course
* The instances are defined in different modules.
* In one module `Spec`
* instance (B) is not visible
* there is a function `f :: C a => a -> a`
* `f` is called at type `T Int`.
So GHC specialises `f`, to `f_spec :: T Int -> T Int`, and exports a
RULE
{{{
RULE "SPEC" f = f_spec :: T Int -> T Int
}}}
The idea is that any other module that calls `f` at type `T Int` can
simply re-use the specialised (and presumably much faster) version of `f`.
`C (T Int)` but (B) is not visible, so GHC finds a solution using (A).
* In another module, `Use`, which ''can'' see (B), we call `f` at type `T
Int`. In the absence of the cross-module specialisation rule, or without
`-O`, GHC would solve the constraint `C (T Int)`, this time using (B).
But because of the rule, with `-O`, it re-uses `f_spec`. Result:
different runtime behaviour.
There is a more detailed discussion on [https://mail.haskell.org/pipermail
/glasgow-haskell-users/2015-June/025970.html this thread].
Files to reproduce.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10526>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list