IO hack in demand analyzer gets in the way of CPR
After a lot of staring at code and comparing unexpected nofib results I found the following:
The IO hack in the demand analyzer (see dmdAnalAlt
in StrAnal.lhs
and #1592 (closed) for a good discussion) prevents CPR in any function that uses a C call. This is a small example, reduced from the scaleFloat
method for doubles:
module Float(fun) where
import GHC.Float (Double(..))
import GHC.Integer (decodeDoubleInteger, encodeDoubleInteger)
fun :: Double -> Double
fun x | isFix = x
| otherwise = case x of
(D# x#) -> case decodeDoubleInteger x# of
(# i, j #) -> D# (encodeDoubleInteger i j)
where
isFix = isDoubleFinite x == 0
foreign import ccall unsafe "isDoubleFinite" isDoubleFinite :: Double -> Int
Here, fun
does current not get the CPR property, and the work gets type GHC.Prim.Double# -> GHC.Types.Double
. Why? Because in core, there will be a
case {__pkg_ccall main isDoubleFinite GHC.Prim.Double#
-> GHC.Prim.State# GHC.Prim.RealWorld
-> (# GHC.Prim.State# GHC.Prim.RealWorld, GHC.Prim.Int# #)}_dQD
ds_dQA GHC.Prim.realWorld#
of _ [Occ=Dead, Dmd=<L,A>]
{ (# ds_dQC [Dmd=<L,A>, OS=OneShot], ds_dQB [Dmd=<S,1*U>] #) ->
...
where the case body has DmdType m {dQz-><L,1*U(U)> dQA-><L,U>}
, but dmdAnalAlt
detects that this is evaluating a possibly exiting function and throws aways the information using alt_ty
lubDmdType topDmdType
.
Would it be ok to lub
only the demand on the free variables, but keep the CPR information?
In nofib (if I managed to compare the right results) this does nothing for almost all benchmarks, -9.2%
of allocations for mandel
and +4.9%
for reverse-complement (but these numbers are not obtained very cleanly, and all is happening on top of the better-ho-cardinality branch.
Trac metadata
Trac field | Value |
---|---|
Version | 7.6.3 |
Type | Task |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Compiler |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture |