#3781: Improve inlining for local functions
---------------------------------+------------------------------------------
Reporter: simonpj | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 6.12.1
Keywords: | Difficulty:
Os: Unknown/Multiple | Testcase:
Architecture: Unknown/Multiple | Failure: Runtime performance bug
---------------------------------+------------------------------------------
I found that `boyer2/Rewritefuns.onewayunify1` has a join point that
really should be inlined. It should get a big discount from scrutinizing
free variables. But the inlining mechanism only take account of
arguments, not free variables. There's a small optimisation opportunity
here, which this ticket records.
Here's the code:
{{{
Rewritefns.onewayunify1 =
\ (t1_acm :: Lisplikefns.Lisplist)
(t2_acn :: Lisplikefns.Lisplist)
(u_aco :: Lisplikefns.Lisplist) ->
case t2_acn of wild_ao1 {
__DEFAULT ->
case t1_acm of wild_Xok {
__DEFAULT ->
let {
$j_spS
:: GHC.Prim.State# GHC.Prim.RealWorld
-> (GHC.Bool.Bool, Lisplikefns.Lisplist)
[LclId,
Arity=1,
Unf=Unf{Src=<vanilla>, TopLvl=False, Arity=1, Value=True,
ConLike=True, Cheap=True, Expandable=True,
Guidance=IF_ARGS [0] 10 0}]
$j_spS =
\ _ ->
Rewritefns.onewayunify1lst
(case wild_Xok of _ {
Lisplikefns.Nil -> Lisplikefns.Nil;
Lisplikefns.Cons ds1_anT ->
case ds1_anT of _ { (_, y_anY) -> y_anY }
})
(case wild_ao1 of _ {
Lisplikefns.Nil -> Lisplikefns.Nil;
Lisplikefns.Cons ds1_anT ->
case ds1_anT of _ { (_, y_anY) -> y_anY }
})
u_aco } in
case wild_Xok of _ {
Lisplikefns.Nil ->
case wild_ao1 of _ {
Lisplikefns.Nil ->
case Lisplikefns.$fEqLisplist_$c== Lisplikefns.Nil
Lisplikefns.Nil
of _ {
GHC.Bool.False -> (GHC.Bool.False, u_aco);
GHC.Bool.True -> $j_spS GHC.Prim.realWorld#
};
Lisplikefns.Cons ds1_anJ ->
case ds1_anJ of _ { (x_anN, _) ->
case Lisplikefns.$fEqLisplist_$c== Lisplikefns.Nil
x_anN of _ {
GHC.Bool.False -> (GHC.Bool.False, u_aco);
GHC.Bool.True -> $j_spS GHC.Prim.realWorld#
}
}
};
Lisplikefns.Cons ds1_anJ ->
case ds1_anJ of _ { (x_anN, _) ->
case wild_ao1 of _ {
Lisplikefns.Nil ->
case Lisplikefns.$fEqLisplist_$c== x_anN
Lisplikefns.Nil of _ {
GHC.Bool.False -> (GHC.Bool.False, u_aco);
GHC.Bool.True -> $j_spS GHC.Prim.realWorld#
};
Lisplikefns.Cons ds1_Xof ->
case ds1_Xof of _ { (x_Xom, _) ->
case Lisplikefns.$fEqLisplist_$c== x_anN x_Xom of _ {
GHC.Bool.False -> (GHC.Bool.False, u_aco);
GHC.Bool.True -> $j_spS GHC.Prim.realWorld#
}
}
}
}
};
Lisplikefns.Atom x_ao3 -> (GHC.Bool.False, u_aco)
};
}}}
You can see that `$j_sps` scrutinises `wild_Xok` and `wild_ao1`, but it
currently gets no discount for doing so.
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/3781>
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