[GHC] #9496: Simplify primitives for short cut fusion

GHC ghc-devs at haskell.org
Thu Aug 21 20:55:02 UTC 2014


#9496: Simplify primitives for short cut fusion
-------------------------------------+-------------------------------------
       Reporter:  dfeuer             |                   Owner:
           Type:  task               |                  Status:  new
       Priority:  normal             |               Milestone:
      Component:  libraries/base     |                 Version:  7.8.3
       Keywords:  fusion             |        Operating System:
   Architecture:  Unknown/Multiple   |  Unknown/Multiple
     Difficulty:  Unknown            |         Type of failure:  Other
     Blocked By:                     |               Test Case:
Related Tickets:                     |                Blocking:
                                     |  Differential Revisions:
-------------------------------------+-------------------------------------
 Currently, there appear to be two production primitives, `build` and
 `augment` (although I may have missed some). There are multiple
 consumption primitives (at least: `foldr`, `head`, `and`, `or`, `any`, and
 `all`). The rule sets for some producers seem to forget to handle
 `augment`, and the `augment/augment` rule is omitted as "true, but not, I
 think, useful".

 A number of other functions are instead rewritten into `foldr` forms, and
 then written back if they don't fuse.

 == What to do: ==

 Personally, I'd be very tempted to start by saying `build g = augment g
 []` (or ''possibly'' even `build g = extend [] g []` if I can ever get
 that idea to work) and cut the problem in half. The main problem I see
 with this is if other people are importing `GHC.Exts` or `GHC.Base`,
 writing things with `build`, and expecting them to fuse. One way to deal
 with this, perhaps, is to hack a special rule into the RULES compiler to
 recognize `GHC.Base.build` on the LHS of RULES and replace it with the
 appropriate `augment` form, emitting a warning.

 Where to go after that: the question remains whether it's best in general
 to rewrite a form to `foldr` to make it fuse, or to fuse directly with
 `augment`. The answer presumably depends, at least in part, on whether
 there are additional `foldr`-based rules we may want to add that would
 take advantage of the effort put into the translation back from the
 `foldr` form. I would conjecture that most such rules we could want would
 go beyond what the RULES system actually can do. That said, if we can find
 a way to use `foldr` forms without the horrible pain of translating back
 from them, that would be a very good thing.

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


More information about the ghc-tickets mailing list