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