Opened 4 years ago

Last modified 15 months ago

#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 (1)

FVDiscountSim.hs (769 bytes) - added by nfrisby 15 months ago.
Small example abstracting nofib boyer2, where discounting FVs is a win

Download all attachments as: .zip

Change History (10)

comment:1 Changed 4 years ago by igloo

  • Milestone set to 6.12 branch

comment:2 Changed 4 years ago by igloo

  • Milestone changed from 6.12 branch to 6.12.3

comment:3 Changed 4 years ago by igloo

  • Milestone changed from 6.12.3 to 6.14.1
  • Priority changed from normal to low

comment:4 Changed 3 years ago by igloo

  • Milestone changed from 7.0.1 to 7.0.2

comment:5 Changed 3 years ago by igloo

  • Milestone changed from 7.0.2 to 7.2.1

comment:6 Changed 3 years ago by igloo

  • Milestone changed from 7.2.1 to 7.4.1

comment:7 Changed 2 years ago by igloo

  • Milestone changed from 7.4.1 to 7.6.1
  • Priority changed from low to lowest

comment:8 Changed 20 months ago by igloo

  • Milestone changed from 7.6.1 to 7.6.2

Changed 15 months ago by nfrisby

Small example abstracting nofib boyer2, where discounting FVs is a win

comment:9 Changed 15 months ago by nfrisby

For the record, we re-discovered this while investigating a late lambda float. If we move forward with that, it would partially achieve the functionality of discounting FVs, as discussed in #7664; see attached FVDiscountSim.hs

Note: See TracTickets for help on using tickets.