Skip to content
  • Richard Eisenberg's avatar
    Remove flattening variables · 8bb52d91
    Richard Eisenberg authored and Marge Bot's avatar Marge Bot committed
    This patch redesigns the flattener to simplify type family applications
    directly instead of using flattening meta-variables and skolems. The key new
    innovation is the CanEqLHS type and the new CEqCan constraint (Ct). A CanEqLHS
    is either a type variable or exactly-saturated type family application; either
    can now be rewritten using a CEqCan constraint in the inert set.
    
    Because the flattener no longer reduces all type family applications to
    variables, there was some performance degradation if a lengthy type family
    application is now flattened over and over (not making progress). To
    compensate, this patch contains some extra optimizations in the flattener,
    leading to a number of performance improvements.
    
    Close #18875.
    Close #18910.
    
    There are many extra parts of the compiler that had to be affected in writing
    this patch:
    
    * The family-application cache (formerly the flat-cache) sometimes stores
      coercions built from Given inerts. When these inerts get kicked out, we must
      kick out from the cache as well. (This was, I believe, true previously, but
      somehow never caused trouble.) Kicking out from the cache requires adding a
      filterTM function to TrieMap.
    
    * This patch obviates the need to distinguish "blocking" coercion holes from
      non-blocking ones (which, previously, arose from CFunEqCans). There is thus
      some simplification around coercion holes.
    
    * Extra commentary throughout parts of the code I read through, to preserve
      the knowledge I gained while working.
    
    * A change in the pure unifier around unifying skolems with other types.
      Unifying a skolem now leads to SurelyApart, not MaybeApart, as documented
      in Note [Binding when looking up instances] in GHC.Core.InstEnv.
    
    * Some more use of MCoercion where appropriate.
    
    * Previously, class-instance lookup automatically noticed that e.g. C Int was
      a "unifier" to a target [W] C (F Bool), because the F Bool was flattened to
      a variable. Now, a little more care must be taken around checking for
      unifying instances.
    
    * Previously, tcSplitTyConApp_maybe would split (Eq a => a). This is silly,
      because (=>) is not a tycon in Haskell. Fixed now, but there are some
      knock-on changes in e.g. TrieMap code and in the canonicaliser.
    
    * New function anyFreeVarsOf{Type,Co} to check whether a free variable
      satisfies a certain predicate.
    
    * Type synonyms now remember whether or not they are "forgetful"; a forgetful
      synonym drops at least one argument. This is useful when flattening; see
      flattenView.
    
    * The pattern-match completeness checker invokes the solver. This invocation
      might need to look through newtypes when checking representational equality.
      Thus, the desugarer needs to keep track of the in-scope variables to know
      what newtype constructors are in scope. I bet this bug was around before but
      never noticed.
    
    * Extra-constraints wildcards are no longer simplified before printing.
      See Note [Do not simplify ConstraintHoles] in GHC.Tc.Solver.
    
    * Whether or not there are Given equalities has become slightly subtler.
      See the new HasGivenEqs datatype.
    
    * Note [Type variable cycles in Givens] in GHC.Tc.Solver.Canonical
      explains a significant new wrinkle in the new approach.
    
    * See Note [What might match later?] in GHC.Tc.Solver.Interact, which
      explains the fix to #18910.
    
    * The inert_count field of InertCans wasn't actually used, so I removed
      it.
    
    Though I (Richard) did the implementation, Simon PJ was very involved
    in design and review.
    
    This updates the Haddock submodule to avoid #18932 by adding
    a type signature.
    
    -------------------------
    Metric Decrease:
        T12227
        T5030
        T9872a
        T9872b
        T9872c
    Metric Increase:
        T9872d
    -------------------------
    8bb52d91