id summary reporter owner description type status priority milestone component version resolution keywords cc os architecture failure testcase blockedby blocking related differential wikipage
1794 map has strange unfolding, code blowup and performance loss simonmar igloo "{{{
module Test where
f xs = map (True:) xs
}}}
gives this with ghc-6.8.1 -O -ddump-simpl:
{{{
==================== Tidy Core ====================
Rec {
Test.go :: [[GHC.Base.Bool]] -> [[GHC.Base.Bool]]
[GlobalId]
[Arity 1
NoCafRefs
Str: DmdType S]
Test.go =
\ (ds_a6S :: [[GHC.Base.Bool]]) ->
case ds_a6S of wild_a6T {
[] -> GHC.Base.[] @ [GHC.Base.Bool];
: y_a6X ys_a6Y ->
GHC.Base.:
@ [GHC.Base.Bool]
(GHC.Base.: @ GHC.Base.Bool GHC.Base.True y_a6X)
(Test.go ys_a6Y)
}
end Rec }
Test.f :: [[GHC.Base.Bool]] -> [[GHC.Base.Bool]]
[GlobalId]
[Arity 1
NoCafRefs
Str: DmdType S]
Test.f =
\ (xs_a5B :: [[GHC.Base.Bool]]) ->
case xs_a5B of wild_a5Q {
[] -> GHC.Base.[] @ [GHC.Base.Bool];
: x_a5T xs1_a5U ->
GHC.Base.:
@ [GHC.Base.Bool]
(GHC.Base.: @ GHC.Base.Bool GHC.Base.True x_a5T)
(Test.go xs1_a5U)
}
}}}
This is not, as I first suspected, that the `mapList` rule is not firing - the RULEs are firing as they should. The problem is that `map` itself has this unfolding:
{{{
map :: forall a b. (a -> b) -> [a] -> [b]
{- Arity: 2 HasNoCafRefs Strictness: LS
Unfolding: (\ @ a @ b ds :: a -> b ds1 :: [a] ->
case @ [b] ds1 of wild {
[] -> GHC.Base.[] @ b
: x xs
-> GHC.Base.:
@ b
(ds x)
(GHC.Base.foldr
@ a
@ [b]
(\ x1 :: a ys :: [b] -> GHC.Base.: @ b (ds x1) ys)
(GHC.Base.[] @ b)
xs) }) -}
}}}
Highly strange - `map`'s unfolding refers to `foldr`, but `map` itself is written with the usual recursive definition in `GHC.Base`. The only explanation I can think of is that the RULEs for `map` must have applied in `map`'s definition when `GHC.Base` was compiled.
This is bad, because of the code blowup and also because performance will be badly affected for non-optimised compilation (`map` is defined in terms of `foldr`).
" merge closed normal 6.8.1 Compiler 6.6.1 fixed Unknown/Multiple Unknown/Multiple