Skip to content
  • Simon Peyton Jones's avatar
    Faster type equality · c8a8727e
    Simon Peyton Jones authored and Marge Bot's avatar Marge Bot committed
    This MR speeds up type equality, triggered by perf regressions that
    showed up when fixing #24725 by parameterising type equality over
    whether to ignore multiplicity.
    
    The changes are:
    
    * Do not use `nonDetCmpType` for type /equality/. Instead use a specialised
      type-equality function, which we have always had!
    
      `nonDetCmpType` remains, but I did not invest effort in refactoring
      or optimising it.
    
    * Type equality is parameterised by
        - whether to expand synonyms
        - whether to respect multiplicities
        - whether it has a RnEnv2 environment
      In this MR I systematically specialise it for static values of these
      parameters.  Much more direct and predictable than before.  See
      Note [Specialising type equality]
    
    * We want to avoid comparing kinds if possible.  I refactored how this
      happens, at least for `eqType`.
      See Note [Casts and coercions in type comparison]
    
    * To make Lint fast, we want to avoid allocating a thunk for <msg> in
          ensureEqTypes ty1 ty2 <msg>
      becau...
    c8a8727e