simple CSE?
Don Stewart
dons at galois.com
Fri Mar 28 22:23:44 EDT 2008
conal:
> I'd like to know if it's possible to get GHC to perform some simple CSE
> for function-level programming. Here's a simple example:
>
> liftA2 (*) sin sin :: Double -> Double
>
> which inlines and simplifies to
>
> \ t -> sin t * sin t
>
> A more realistic, equivalent, example:
>
> let b = sin <$> id in liftA2 (*) b b
>
> Can GHC be nudged into computing 'sin t' once rather than twice?
>
So GHC does do some light CSE, but not in this case, as far as I could
see.
I had a go with a rewrite rule that I felt should have matched, but it
didn't seem to want to fire. Possibly the dictionaries were getting in
the way.
import System.Environment
import Prelude hiding (sin)
import qualified Prelude
sin :: Double -> Double
sin x = Prelude.sin x
{-# NOINLINE sin #-}
times :: Double -> Double -> Double
times x y = x * y
{-# NOINLINE times #-}
{-# RULES
"sin/cse" forall x.
times (sin x) (sin x) = case Prelude.sin x of y -> y * y
#-}
main = do
[x] <- getArgs
let n = read x
print $ sin n `times` sin n
More information about the Glasgow-haskell-users
mailing list