[GHC] #15009: Float equalities past local equalities

GHC ghc-devs at haskell.org
Fri May 18 16:16:31 UTC 2018


#15009: Float equalities past local equalities
-------------------------------------+-------------------------------------
        Reporter:  goldfire          |                Owner:  (none)
            Type:  feature request   |               Status:  new
        Priority:  normal            |            Milestone:  8.4.3
       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 Simon Peyton Jones <simonpj@…>):

 In [changeset:"2bbdd00c6d70bdc31ff78e2a42b26159c8717856/ghc" 2bbdd00/ghc]:
 {{{
 #!CommitTicketReference repository="ghc"
 revision="2bbdd00c6d70bdc31ff78e2a42b26159c8717856"
 Orient TyVar/TyVar equalities with deepest on the left

 Trac #15009 showed that, for Given TyVar/TyVar equalities, we really
 want to orient them with the deepest-bound skolem on the left. As it
 happens, we also want to do the same for Wanteds, but for a different
 reason (more likely to be touchable).  Either way, deepest wins:
 see TcUnify Note [Deeper level on the left].

 This observation led me to some significant changes:

 * A SkolemTv already had a TcLevel, but the level wasn't really being
   used.   Now it is!

 * I updated added invariant (SkolInf) to TcType
   Note [TcLevel and untouchable type variables], documenting that
   the level number of all the ic_skols should be the same as the
   ic_tclvl of the implication

 * FlatSkolTvs and FlatMetaTvs previously had a dummy level-number of
   zero, which messed the scheme up.   Now they get a level number the
   same way as all other TcTyVars, instead of being a special case.

 * To make sure that FlatSkolTvs and FlatMetaTvs are untouchable (which
   was previously done via their magic zero level) isTouchableMetaTyVar
   just tests for those two cases.

 * TcUnify.swapOverTyVars is the crucial orientation function; see the
   new Note [TyVar/TyVar orientation].  I completely rewrote this function,
   and it's now much much easier to understand.

 I ended up doing some related refactoring, of course

 * I noticed that tcImplicitTKBndrsX and tcExplicitTKBndrsX were doing
   a lot of useless work in the case where there are no skolems; I
   added a fast-patch

 * Elminate the un-used tcExplicitTKBndrsSig; and thereby get rid of
   the higher-order parameter to tcExpliciTKBndrsX.

 * Replace TcHsType.emitTvImplication with TcUnify.checkTvConstraints,
   by analogy with TcUnify.checkConstraints.

 * Inline TcUnify.buildImplication into its only call-site in
   TcUnify.checkConstraints

 * TcS.buildImplication becomes TcS.CheckConstraintsTcS, with a
   simpler API

 * Now that we have NoEvBindsVar we have no need of termEvidenceAllowed;
   nuke the latter, adding Note [No evidence bindings] to TcEvidence.
 }}}

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


More information about the ghc-tickets mailing list