Actually, in this case it would be safe to do CSS. Because a) the function is strict in both arguments so GHC creates a worker which only uses unboxed types b) this cannot cause any space leaks (it contains no pointers)
The generated Core does look pretty weird, though: $wnewton = \ (ww_s115 :: Double#) (ww1_s119 :: Int#) -> case ww1_s119 of ds_Xr8 { __DEFAULT -> case ^_r11D (case $wnewton ww_s115 (-# ds_Xr8 1) of ww2_s11d { __DEFAULT -> D# ww2_s11d -- box the result of $wnewton }) lvl_r11B of _ { D# x_avk -> -- unbox it again case $wnewton ww_s115 (-# ds_Xr8 1) of ww2_s11d { __DEFAULT -> /## (+## x_avk ww_s115) (*## 2.0 ww2_s11d) } }; 0 -> ww_s115 } On 22 May 2010 13:30, Ozgur Akgun <ozgurak...@gmail.com> wrote: > Richard, > > I found this very annoying when I first realised GHC doesn't do any CSE, > given that the result of pure functions only depend on their parameters. > > Even though CSE usually sounds good, when you ask, they go and find obscure > examples in which it causes great trouble :) > > I think, there should at least be a compiler flag or something similar to > enforce CSE on some structures. But currently, as others pointed out, you > need to bind and do your sub expression elimination yourself. > > Best, > > On 18 May 2010 17:30, Richard Warburton <richard.warbur...@gmail.com> wrote: >> >> A colleague of mine pointed out that ghc wasn't performing as he >> expected when optimising some code. I wonder if anyone could offer >> any insight as to why its not noting this common subexpression: >> >> main = print $ newton 4 24 >> >> newton a 0 = a >> newton a n = ((newton a (n-1))^2 + a)/(2*(newton a (n-1))) >> >> Compiled with 'ghc -O3 --make perf.hs', results in: >> >> real 0m5.544s >> user 0m5.492s >> sys 0m0.008s >> >> However if we factor out the repeated call to the newton method: >> >> main = print $ newton2 4 24 >> >> newton2 a 0 = a >> newton2 a n = (x^2 + a)/(2*x) >> where >> x = newton2 a (n-1) >> >> real 0m0.004s >> user 0m0.004s >> sys 0m0.004s >> >> It looks to me like Referential transparency should make this a sound >> optimisation to apply, but ghc isn't doing it even on -O3. >> >> regards, >> >> Richard >> _______________________________________________ >> Haskell-Cafe mailing list >> Haskell-Cafe@haskell.org >> http://www.haskell.org/mailman/listinfo/haskell-cafe > > > > -- > Ozgur Akgun > > _______________________________________________ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe > > -- Push the envelope. Watch it bend. _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe