Fusion rule for "foldr k z (x:build g)"
authorDavid Feuer <David.Feuer@gmail.com>
Wed, 1 Oct 2014 13:57:27 +0000 (15:57 +0200)
committerJoachim Breitner <mail@joachim-breitner.de>
Wed, 1 Oct 2014 16:20:26 +0000 (18:20 +0200)
There seem to be various issues with general fold/cons and even
cons/build rules, but it seems pretty clear to me that the simple
fold/cons/build rule is a good idea. It doesn't do much for nofib
allocation, but it seems to improve some other analyses and speed
several benchmarks up. Implements #9536.

libraries/base/GHC/Base.lhs

index 8b51c07..f9d01b5 100644 (file)
@@ -788,6 +788,9 @@ augment g xs = g (:) xs
 "foldr/single"  forall k z x. foldr k z [x] = k x z
 "foldr/nil"     forall k z.   foldr k z []  = z
 
+"foldr/cons/build" forall k z x (g::forall b. (a->b->b) -> b -> b) .
+                           foldr k z (x:build g) = k x (g k z)
+
 "augment/build" forall (g::forall b. (a->b->b) -> b -> b)
                        (h::forall b. (a->b->b) -> b -> b) .
                        augment g (build h) = build (\c n -> g c (h c n))