Improve inlining for local functions
See also
- #19643
- #3755
- #20516
- #21938
- #22317
- !8778 (closed) Andreas's MR addressing this issue
- Problem with the binary library, and the binary-library ticket
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.
See also: #4960
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.
Trac metadata
Trac field | Value |
---|---|
Version | 6.12.1 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Compiler |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture |
Edited by Simon Peyton Jones