[GHC] #15632: Undependable Dependencies

GHC ghc-devs at haskell.org
Fri Oct 26 03:13:01 UTC 2018


#15632: Undependable Dependencies
-------------------------------------+-------------------------------------
        Reporter:  AntC              |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:  8.6.1
       Component:  Compiler          |              Version:  8.6.1-beta1
      Resolution:                    |             Keywords:
                                     |  FunctionalDependencies,
                                     |  OverlappingInstances
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:  10675, 9210,      |  Differential Rev(s):
  8634, 15135                        |
       Wiki Page:                    |
-------------------------------------+-------------------------------------
Changes (by AntC):

 * related:  10675, 9210, 8634 => 10675, 9210, 8634, 15135


Comment:

 Adding related ticket, particularly ticket:15135#comment:3 and SPJ's reply
 at comment 6 "This is terribly unsatisfactory".

 Changing the optimisation level or the per-instance pragmas can change
 which instance is selected, and thereby the meaning of the program -- even
 within a single module. (The O.P. for that ticket is the familiar 'orphan
 instances'/separate modules -- which is at least a devil we know.)

 The linked manual for `-fsolve-constant-dicts` says
 >  we can often produce much better code by directly solving for an
 available `Num Int` dictionary we might have at hand. This removes
 potentially many layers of indirection and crucially allows other
 optimisations to fire ...

 This seems to be muddling up concerns:
 - selecting which instance satisfies a Wanted constraint
   (in case of Overlapping instances, this means 'best'/most closely
 satisfies);
 - vs: having resolved which instance, ''and'' determined it's the same
 instance as for a dictionary available at hand,
   ''then'' sharing the at-hand dictionary/removing layers of indirection,
 etc.

 I can see that under separate compilation, we can't be sure whether the
 'best' instance in scope in the current module might get gazumped by an
 instance in another module. Then we can only go by the `OVERLAPPABLE`
 pragma. But we should always search all instances in scope in the current
 module, irrespective of pragmas or optimisation(?) OK that search is
 adding a performance hit for the compiler and it only makes a difference
 in case of overlap; but it shouldn't impact object code, presuming it does
 resolve to an at-hand dictionary.

 I didn't realise the pragmas had that dramatic of an effect on selecting
 instances. Then this applies from comment 1
 > I think it's arguable that an instance should only be overlappable if it
 says {-# OVERLAPPABLE #-}. But that's not our current spec.

 Making that the rule (in some form) could detect/warn of problematic
 'orphan instances'. Interpreting the rule for instances that are in no
 substitution order (the O.P. on this ticket #15632) still needs some head-
 scratching.

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


More information about the ghc-tickets mailing list