[GHC] #14201: Implement ideas from "Compiling Pattern Matching to Good Decision Trees"

GHC ghc-devs at haskell.org
Tue Sep 25 03:46:08 UTC 2018


#14201: Implement ideas from "Compiling Pattern Matching to Good Decision Trees"
-------------------------------------+-------------------------------------
        Reporter:  AndreasK          |                Owner:  AndreasK
            Type:  feature request   |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.2.1
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by AndreasK):

 = There are shortcomings in the current codegen of GHC that eliminate much
 of the gains to be had here.

 * Changing the order of pattern matches can lead to more floating of case
 alternatives to the top level. The associated cost from calling a top
 level function overshadows potential gains when that happens. This is
 expensive since:
   * They have to confirm to the calling convention, so can require
 register shifting.
   * They prohibit us from falling through to the alternative.
   * They split the code in memory usually leading to more cache pressure.
   There is an ticket about the issue already: #15560

 * The algorithm depends on shared pattern matching subtrees being commoned
 up which doesn't work yet. As a consequence we quite often end up with
 duplicate code which kills performance.
   * I had hoped to leave this to CSE but it turns out GHC's CSE is not as
 good as one would hope in this regard. See
 https://ghc.haskell.org/trac/ghc/wiki/MoreCSE for some discussion.
   * We could do an special CSE for just the pattern matching trees.
 Butduring desugaring we don't work bottom up but top down. We generate
 functions which take as argument the expression to put into the case
 alternatives instead of directly generating an AST expression. It wasn't
 clear how to work with or refactor this to allow commoning up of pattern
 matching subtrees at the time I last looked at this.

 * Last and least: The current codelayout is heavily dependent on how we
 generate `if` statements for Cmm. As consequence performance can vary a
 lot when changing the order of pattern matches. I did some work on code
 layout which hopefully will help with this in #15124. Which might change
 the performance difference between differing pattern match algorithms.

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14201#comment:20>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list