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