Allow enumDeltaIntegerFB to be inlined
authorJoachim Breitner <mail@joachim-breitner.de>
Mon, 28 Sep 2015 11:48:40 +0000 (13:48 +0200)
committerJoachim Breitner <mail@joachim-breitner.de>
Mon, 28 Sep 2015 11:48:40 +0000 (13:48 +0200)
The function is very small and the compiler should be at liberty to
inline it. But it is recursive, so it did not do it before. By applying
the usual transformation with a local recursive function, GHC can now
inline it, producing the loop that one would expect.

libraries/base/GHC/Enum.hs

index a11d4f8..0d91cc7 100644 (file)
@@ -704,7 +704,8 @@ the special case varies more from the general case, due to the issue of overflow
 
 {-# NOINLINE [0] enumDeltaIntegerFB #-}
 enumDeltaIntegerFB :: (Integer -> b -> b) -> Integer -> Integer -> b
-enumDeltaIntegerFB c x d = x `seq` (x `c` enumDeltaIntegerFB c (x+d) d)
+enumDeltaIntegerFB c x d = go x
+  where go x = x `seq` (x `c` go (x+d))
 
 {-# NOINLINE [1] enumDeltaInteger #-}
 enumDeltaInteger :: Integer -> Integer -> [Integer]