#2289: Needless reboxing of values when returning from a tight loop
----------------------------------------+-----------------------------------
Reporter: dons | Owner:
Type: run-time performance bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 6.8.2
Severity: normal | Resolution:
Keywords: boxing, loops, performance | Difficulty: Unknown
Testcase: | Architecture: Unknown
Os: Unknown |
----------------------------------------+-----------------------------------
Comment (by simonpj):
(Retrying, having messed up typesetting.)
Rats. I'd forgotten about the strictness question:
{{{
f :: Int -> (Int,Int)
f x = (g x, h x)
}}}
Suppose `g` and `h` have the CPR property -- that is, they explicitly
return a boxed value. Then it's a mistake to transform to
{{{
f x = case (g x, h x) of { (I# r1, I# r2) ->
(I# r1 ,I# r2) }
}}}
because that'd make f too strict. But in your example, `g` and `h` are
themselves constructors.
My conclusion: for the ''nested'' part of CPR analysis we do not want to
"look through" function calls, but rather look only for literal
constructor applications. I have not thought about how much this'd affect
the analysis.
Provided the analysis was modified in this way, it shouldn't be too hard
to modify the worker/wrapper part to take account of it.
But NB that `CprAnalyse` is dead code; the current analysis is done as
part of strictness analysis in `DmdAnal`. And the strictness analyser
itself needs love and attention. So much to do, so little time.
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/2289#comment:6>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs