compilation of pattern-matching?
Simon Marlow
marlowsd at gmail.com
Wed Mar 25 11:55:52 EDT 2009
(thanks to Simon PJ for an excellent summary of the issues)
Lennart Augustsson wrote:
> You could imagine a pragma to say which branch is likely.
> f p1 = e1
> f p2 = {-# LIKELY #-} e2
> f p3 = e3
>
> Is there some way to propagate pragmas through core transformations?
I just thought I'd mention the way gcc does this:
if (__builtin_expect__(p, 1)) {
... likely case ...
} else {
... unlikely case ...
}
sadly gcc's back end doesn't alway take advantage of the information very
well, at least when I've tried it, but I think the design is nice - it
feels more general than just annotating the "hot code". Or perhaps it
feels nicer because an annotation on the hot code would have to be
propagated back through the branches; and how far back? What if there are
multiple branches annotated as "hot"?
Cheers,
Simon
> -- Lennart
>
> On Wed, Mar 25, 2009 at 9:18 AM, Simon Peyton-Jones
> <simonpj at microsoft.com> wrote:
>> Indeed GHC does not attempt to retain the order of alternatives, although
>> a) it might be possible to do so by paying more attention in numerous places
>> b) GHC may do so already, by accident, in certain cases
>>
>> Observations:
>>
>> * The issue at stake is a small one: not the *number of tests* but *which tests branch, and which fall through*.
>>
>> * Simply ordering the equations doesn't really work, because pattern-match compilation will match an entire column at once:
>> f (x:xs) True = ...
>> f [] True = ...
>> f [] False = ...
>> f (x:xs) False = ...
>> Which "order" should the (:)/[] test go in?
>>
>> * Not only does GHC currently not attempt to retain order, but for a particular order it makes no guarantees about which falls through. For example, given
>> case ... of { A -> e1; C -> e2; B -> e3 }
>> We might test for A and then
>> either fall though to e1
>> or fall through to the test for C
>>
>> * When the number of constructors is larger, instead of a linear sequence of tests, GHC may generate a table-jump; or a balanced tree of tests.
>>
>> * Which plan performs best is tremendously architecture dependent, and may well vary a lot between different chips implementing the same instruction set. It's a losing battle to fix the strategy in source code.
>>
>> * More promising might be to say "this is the hot branch". That information about frequency could in principle be used by the back end to generate better code. However, I am unsure how
>> a) to express this info in source code
>> b) retain it throughout optimisation
>>
>>
>> Claus, if you think this thread is worth capturing, then do write a Commentary page, and I'll check its veracity.
>>
>> Thanks
>>
>> Simon
>>
>>
>> | -----Original Message-----
>> | From: glasgow-haskell-users-bounces at haskell.org [mailto:glasgow-haskell-users-
>> | bounces at haskell.org] On Behalf Of Claus Reinke
>> | Sent: 23 March 2009 23:17
>> | To: glasgow-haskell-users at haskell.org
>> | Subject: compilation of pattern-matching?
>> |
>> | I just noticed that GHC (6.11.20090320) seems to compile both
>> |
>> | f (a:b:c) =
>> | f (a:[]) =
>> | f [] =
>> |
>> | and
>> |
>> | f [] =
>> | f (a:[]) =
>> | f (a:b:c) =
>> |
>> | to something like (looking at Core, but writing source)
>> |
>> | f x = case x of { [] -> ..; (a:t) -> case t of { [] ->..; (b:c) ->..}}
>> |
>> | That doesn't seem right to me: if I try to give the patterns in
>> | the order from frequent to rare, in order to reduce jumps, I
>> | don't expect GHC to rearrange things. What is the rationale
>> | for this? And where can I read about GHC's pattern match
>> | compilation approach in general?
>> |
>> | Claus
>> |
>> | _______________________________________________
>> | Glasgow-haskell-users mailing list
>> | Glasgow-haskell-users at haskell.org
>> | http://www.haskell.org/mailman/listinfo/glasgow-haskell-users
>>
>> _______________________________________________
>> Glasgow-haskell-users mailing list
>> Glasgow-haskell-users at haskell.org
>> http://www.haskell.org/mailman/listinfo/glasgow-haskell-users
>>
> _______________________________________________
> Glasgow-haskell-users mailing list
> Glasgow-haskell-users at haskell.org
> http://www.haskell.org/mailman/listinfo/glasgow-haskell-users
More information about the Glasgow-haskell-users
mailing list