Skip to content
Snippets Groups Projects
Forked from Glasgow Haskell Compiler / GHC
13970 commits behind the upstream repository.
  • Ben Gamari's avatar
    eddaa591
    compiler: Introduce and use RoughMap for instance environments · eddaa591
    Ben Gamari authored and Marge Bot's avatar Marge Bot committed
    
    Here we introduce a new data structure, RoughMap, inspired by the
    previous `RoughTc` matching mechanism for checking instance matches.
    This allows [Fam]InstEnv to be implemented as a trie indexed by these
    RoughTc signatures, reducing the complexity of instance lookup and
    FamInstEnv merging (done during the family instance conflict test)
    from O(n) to O(log n).
    
    The critical performance improvement currently realised by this patch is
    in instance matching. In particular the RoughMap mechanism allows us to
    discount many potential instances which will never match for constraints
    involving type variables (see Note [Matching a RoughMap]). In realistic
    code bases matchInstEnv was accounting for 50% of typechecker time due
    to redundant work checking instances when simplifying instance contexts
    when deriving instances. With this patch the cost is significantly
    reduced.
    
    The larger constants in InstEnv creation do mean that a few small
    tests regress in allocations slightly. However, the runtime of T19703 is
    reduced by a factor of 4. Moreover, the compilation time of the Cabal
    library is slightly improved.
    
    A couple of test cases are included which demonstrate significant
    improvements in compile time with this patch.
    
    This unfortunately does not fix the testcase provided in #19703 but does
    fix #20933
    
    -------------------------
    Metric Decrease:
        T12425
    Metric Increase:
        T13719
        T9872a
        T9872d
        hard_hole_fits
    -------------------------
    
    Co-authored-by: default avatarMatthew Pickering <matthewtpickering@gmail.com>
    eddaa591
    History
    compiler: Introduce and use RoughMap for instance environments
    Ben Gamari authored and Marge Bot's avatar Marge Bot committed
    
    Here we introduce a new data structure, RoughMap, inspired by the
    previous `RoughTc` matching mechanism for checking instance matches.
    This allows [Fam]InstEnv to be implemented as a trie indexed by these
    RoughTc signatures, reducing the complexity of instance lookup and
    FamInstEnv merging (done during the family instance conflict test)
    from O(n) to O(log n).
    
    The critical performance improvement currently realised by this patch is
    in instance matching. In particular the RoughMap mechanism allows us to
    discount many potential instances which will never match for constraints
    involving type variables (see Note [Matching a RoughMap]). In realistic
    code bases matchInstEnv was accounting for 50% of typechecker time due
    to redundant work checking instances when simplifying instance contexts
    when deriving instances. With this patch the cost is significantly
    reduced.
    
    The larger constants in InstEnv creation do mean that a few small
    tests regress in allocations slightly. However, the runtime of T19703 is
    reduced by a factor of 4. Moreover, the compilation time of the Cabal
    library is slightly improved.
    
    A couple of test cases are included which demonstrate significant
    improvements in compile time with this patch.
    
    This unfortunately does not fix the testcase provided in #19703 but does
    fix #20933
    
    -------------------------
    Metric Decrease:
        T12425
    Metric Increase:
        T13719
        T9872a
        T9872d
        hard_hole_fits
    -------------------------
    
    Co-authored-by: default avatarMatthew Pickering <matthewtpickering@gmail.com>
Code owners
Assign users and groups as approvers for specific file changes. Learn more.