Hi,
Am Dienstag, den 18.07.2017, 08:34 -0700 schrieb Conal Elliott: > I'm seeing what looks like repeated computation under a lambda with > `-O` and `-O2`. The following definition: > > > exampleC :: Double -> Double -> Double > > exampleC = \ t -> let s = sin t in \ x -> x + s > > yields this Core: > > > -- RHS size: {terms: 13, types: 6, coercions: 0} > > exampleC :: Double -> Double -> Double > > exampleC = > > \ (t_afI6 :: Double) (eta_B1 :: Double) -> > > case eta_B1 of _ { D# x_aj5c -> > > case t_afI6 of _ { D# x1_aj5l -> > > D# (+## x_aj5c (sinDouble# x1_aj5l)) > > } > > } ghc -O -dverbose-core2core shows you that the problem is this phase: ==================== Simplifier ==================== Max iterations = 4 SimplMode {Phase = 2 [main], inline, rules, eta-expand, case-of-case} It does not happen with -fno-do-lambda-eta-expansion (but you’d lose in other parts.) > I'm concerned because many of my uses of such functions involve > computations dependent only on `t` (time) but with millions of uses > (space) per `t`. (I'm working on a GHC Core plugin (compiling to > categories), with one use generating graphics GPU code.) Did you measure whether this really is a problem? The benefits of not dealing with dynamically allocated functions might outweigh the cost of recalculating sin. Greetings, Joachim -- Joachim Breitner m...@joachim-breitner.de http://www.joachim-breitner.de/
signature.asc
Description: This is a digitally signed message part
_______________________________________________ ghc-devs mailing list ghc-devs@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs