Skip to content

Improve inlining for local functions

See also

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
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information