#3781: Improve inlining for local functions
---------------------------------+------------------------------------------
    Reporter:  simonpj           |        Owner:                         
        Type:  bug               |       Status:  new                    
    Priority:  normal            |    Milestone:                         
   Component:  Compiler          |      Version:  6.12.1                 
    Keywords:                    |   Difficulty:                         
          Os:  Unknown/Multiple  |     Testcase:                         
Architecture:  Unknown/Multiple  |      Failure:  Runtime performance bug
---------------------------------+------------------------------------------
 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.

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/3781>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to