Ticket #3781 (new bug)
Improve inlining for local functions
| Reported by: | simonpj | Owned by: | |
|---|---|---|---|
| Priority: | lowest | Milestone: | 7.6.2 |
| Component: | Compiler | Version: | 6.12.1 |
| Keywords: | Cc: | ||
| Operating System: | Unknown/Multiple | Architecture: | Unknown/Multiple |
| Type of failure: | Runtime performance bug | Difficulty: | |
| Test Case: | Blocked By: | ||
| Blocking: | Related Tickets: |
Description
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.
Attachments
Change History
Note: See
TracTickets for help on using
tickets.

