
#15019: Fix performance regressions from #14737 -------------------------------------+------------------------------------- Reporter: tdammers | Owner: tdammers Type: bug | Status: new Priority: normal | Milestone: 8.6.1 Component: Compiler | Version: Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: Compile-time | Unknown/Multiple performance bug | Test Case: Blocked By: | Blocking: Related Tickets: #14737 | Differential Rev(s): phab:D4568 Wiki Page: | -------------------------------------+------------------------------------- Comment (by tdammers): Replying to [comment:9 simonpj]:
OK, got it. The culprit is this: {{{ addCoerce co1 (CastIt co2 cont) = addCoerce (mkTransCo co1 co2) cont }}} It's really very common for `co1` and `co2` to cancel each other out, but `mkTransCo` doesn't spot that. Next thing to try:
{{{ addCoerce co cont | isReflCo co = return cont
addCoerce co1 (CastIt co2 cont) | isReflexiveCo co' = return cont | otherwise = {-#SCC "addCoerce-simple-recursion" #-} addCoerce co' cont where co' = mkTransCo co1 co2 }}} And get rid of the `isReflexiveCo` at the end altogether.
The initial `isReflCo` is optional -- just to catch the case where the `simplCorecion` returns Refl.
Yes, this does seem to work. Running some tests to verify. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/15019#comment:10 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler