(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
<simo...@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-boun...@haskell.org [mailto:glasgow-haskell-users-
| boun...@haskell.org] On Behalf Of Claus Reinke
| Sent: 23 March 2009 23:17
| To: glasgow-haskell-users@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@haskell.org
| http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

_______________________________________________
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

_______________________________________________
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

_______________________________________________
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to