[GHC] #14684: combineIdenticalAlts is only partially implemented

GHC ghc-devs at haskell.org
Tue Feb 20 15:50:03 UTC 2018


#14684: combineIdenticalAlts is only partially implemented
-------------------------------------+-------------------------------------
        Reporter:  mpickering        |                Owner:  sjakobi
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:  8.6.1
       Component:  Compiler          |              Version:  8.2.2
      Resolution:                    |             Keywords:  newcomer
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):  Phab:D4419
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by sjakobi):

 Replying to [comment:8 simonpj]:
 > It's invisible in the message above, but I think this commit is only on
 branch `wip/T14684`.  Is that what you intended?  Or did you mean to
 commit to HEAD?

 We agreed that the new most-common-RHS code should be moved into `-O2`
 before it can land in `master`.

 BTW, regarding [comment:2 your comment above]:
 > Fortunately, we now have `TrieMap.CoreMap`, an efficient finite map
 whose keys are `CoreExprs`. Using this I think we can efficiently ask (as
 we iterate oover the alternatives) "have I seen this RHS in an earlier
 alternative?". More advanced: find the RHS that occurs most often. Take
 care that in the common case the RHSs are (a) large and (b) different,
 then the test does not exhaustively traverse the RHSs; just looks far
 enough to establish they are different.

 In the common case you describe, my code will still insert every
 alternative into the `CoreMap`. I haven't been able to find a less
 expensive way to establish that the alternatives are all different, but
 I'd love to hear about any ideas!

 I have also found `CSE.combineAlts`:

 {{{
 {- Note [Combine case alternatives]
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 combineAlts is just a more heavyweight version of the use of
 combineIdenticalAlts in SimplUtils.prepareAlts.  The basic idea is
 to transform

     DEFAULT -> e1
     K x     -> e1
     W y z   -> e2
 ===>
    DEFAULT -> e1
    W y z   -> e2

 In the simplifier we use cheapEqExpr, because it is called a lot.
 But here in CSE we use the full eqExpr.  After all, two alternatives
 usually
 differ near the root, so it probably isn't expensive to compare the full
 alternative.  It seems like the same kind of thing that CSE is supposed
 to be doing, which is why I put it here.
 }}}

 Should `combineAlts` get the same optimization as `combineIdenticalAlts`?
 Might `combineAlts` even be the ''better'' place to apply the
 optimization?

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


More information about the ghc-tickets mailing list