Bitmap: Use foldl' instead of foldr
authorBen Gamari <bgamari.foss@gmail.com>
Wed, 11 Jan 2017 21:33:40 +0000 (16:33 -0500)
committerBen Gamari <ben@smart-cactus.org>
Tue, 17 Jan 2017 20:56:27 +0000 (15:56 -0500)
These are producing StgWords so foldl' is the natural choice. I'm not
sure how I didn't notice this when I wrote D1041.

Test Plan: Validate

Reviewers: austin, simonmar

Reviewed By: simonmar

Subscribers: thomie

Differential Revision: https://phabricator.haskell.org/D2955

GHC Trac Issues: #7450

compiler/cmm/Bitmap.hs

index 22ec6ee..a5cff38 100644 (file)
@@ -22,6 +22,7 @@ import SMRep
 import DynFlags
 import Util
 
+import Data.Foldable (foldl')
 import Data.Bits
 
 {-|
@@ -39,7 +40,10 @@ mkBitmap dflags stuff = chunkToBitmap dflags chunk : mkBitmap dflags rest
 
 chunkToBitmap :: DynFlags -> [Bool] -> StgWord
 chunkToBitmap dflags chunk =
-  foldr (.|.) (toStgWord dflags 0) [ toStgWord dflags 1 `shiftL` n | (True,n) <- zip chunk [0..] ]
+  foldl' (.|.) (toStgWord dflags 0) [ oneAt n | (True,n) <- zip chunk [0..] ]
+  where
+    oneAt :: Int -> StgWord
+    oneAt i = toStgWord dflags 1 `shiftL` i
 
 -- | Make a bitmap where the slots specified are the /ones/ in the bitmap.
 -- eg. @[0,1,3], size 4 ==> 0xb@.
@@ -61,7 +65,7 @@ intsToBitmap dflags size = go 0
     go !pos slots
       | size <= pos = []
       | otherwise =
-        (foldr (.|.) (toStgWord dflags 0) (map (\i->oneAt (i - pos)) these)) :
+        (foldl' (.|.) (toStgWord dflags 0) (map (\i->oneAt (i - pos)) these)) :
           go (pos + word_sz) rest
       where
         (these,rest) = span (< (pos + word_sz)) slots
@@ -87,7 +91,7 @@ intsToReverseBitmap dflags size = go 0
     go !pos slots
       | size <= pos = []
       | otherwise =
-        (foldr xor (toStgWord dflags init) (map (\i->oneAt (i - pos)) these)) :
+        (foldl' xor (toStgWord dflags init) (map (\i->oneAt (i - pos)) these)) :
           go (pos + word_sz) rest
       where
         (these,rest) = span (< (pos + word_sz)) slots