While addressing nonlinear behavior related to coercion roles, particularly NthCo, we noticed that coercion roles are recalculated often even though they should be readily at hand already in most cases. This patch adds a Role to the NthCo constructor so that we can cache them rather than having to recalculate them on the fly. https://ghc.haskell.org/trac/ghc/ticket/11735#comment:23 explains the approach.
Performance improvement over GHC HEAD, when compiling Grammar.hs (see below):
ghc Grammar.hs 176.27s user 0.23s system 99% cpu 2:56.81 total
before patch (but with other optimizations applied):
ghc Grammar.hs -fforce-recomp 175.77s user 0.19s system 100% cpu 2:55.78 total
../../ghc/inplace/bin/ghc-stage2 Grammar.hs 10.32s user 0.17s system 98% cpu 10.678 total