#3698: Bad code generated for zip/filter/filter loop
---------------------------------+------------------------------------------
Reporter: rl | Owner:
Type: bug | Status: new
Priority: normal | Component: Compiler
Version: 6.13 | Keywords:
Os: Unknown/Multiple | Testcase:
Architecture: Unknown/Multiple | Failure: Runtime performance bug
---------------------------------+------------------------------------------
Here is the program:
{{{
zip_filter :: (Num a, Ord a) => a -> [a] -> [a] -> [a]
zip_filter x as bs = zipWith (+) (filter (<x) as) (filter (<x) bs)
}}}
GHC generates this:
{{{
poly_z_smp = \ (@ a_aiz) _ -> GHC.Types.[] @ a_aiz
T.zip_filter =
\ (@ a_aiz) $dNum_ajm $dOrd_ajn eta_B3 eta_B2 eta_B1 ->
letrec {
go_smr :: [a_aiz] -> [a_aiz] -> [a_aiz]
go_smr =
\ (ds_ak5 :: [a_aiz]) ->
case ds_ak5 of _ {
[] -> poly_z_smp @ a_aiz;
: y_aka ys_akb ->
let {
r_smt :: [a_aiz] -> [a_aiz]
r_smt = go_smr ys_akb } in
case GHC.Classes.< @ a_aiz $dOrd_ajn y_aka eta_B3 of _ {
GHC.Bool.False -> r_smt;
GHC.Bool.True ->
\ (ds_alR :: [a_aiz]) ->
case ds_alR of _ {
[] -> GHC.Types.[] @ a_aiz;
: y_alW ys_alX ->
GHC.Types.:
@ a_aiz (GHC.Num.+ @ a_aiz $dNum_ajm y_aka
y_alW) (r_smt ys_alX)
}
}
}; } in
go_smr
eta_B2
(GHC.List.filter
@ a_aiz
(\ (ds_djz :: a_aiz) ->
GHC.Classes.< @ a_aiz $dOrd_ajn ds_djz eta_B3)
eta_B1)
}}}
Eta-expanding `go_smr` would result in much better code.
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/3698>
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