#3972: ghc 6.12.1 and 6.13.20090922 consume a lot more memory than 6.10.4 when
compiling language-python package
-------------------------------+--------------------------------------------
    Reporter:  bjpop           |        Owner:                                  
                                      
        Type:  bug             |       Status:  new                             
                                      
    Priority:  high            |    Milestone:  6.12.3                          
                                      
   Component:  Compiler        |      Version:  6.12.1                          
                                      
    Keywords:  memory usage    |   Difficulty:                                  
                                      
          Os:  Linux           |     Testcase:  
http://projects.haskell.org/language-python/language-python-0.2.tar.gz
Architecture:  x86_64 (amd64)  |      Failure:  Compile-time performance bug    
                                      
-------------------------------+--------------------------------------------

Comment(by igloo):

 It looks like the main difference is that in the stable branch the getSpan
 functions are getting inlined:
 {{{
 ==================== Occurrence analysis ====================
 $dSpan_al3 [ALWAYS OnceL* Nothing] :: AST.Span [AST.Expr]
 LclId
 [Arity 1]
 $dSpan_al3 = AST.$fSpan[] @ AST.Expr AST.$fSpanExpr

 lvl_smf [ALWAYS OnceL Nothing] :: AST.Expr
 LclId
 []
 lvl_smf =
   Control.Exception.Base.patError
     @ AST.Expr "ParserUtils.hs:(6,0)-(8,51)|function makeTupleOrExpr"

 ParserUtils.makeTupleOrExpr :: [AST.Expr]
                                -> Data.Maybe.Maybe AST.Token
                                -> AST.Expr
 LclIdX
 [Arity 2]
 ParserUtils.makeTupleOrExpr =
   \ (ds_dla [ALWAYS Once! Nothing] :: [AST.Expr])
     (ds_dlb :: Data.Maybe.Maybe AST.Token) ->
     case ds_dla of wild_B1 {
       [] -> lvl_smf;
       : e_ag9 [ALWAYS Once Nothing] ds_dlc [ALWAYS Once! Nothing] ->
         let {
           ds_dla [ALWAYS Once* Nothing] :: [AST.Expr]
           LclId
           []
           ds_dla = wild_B1 } in
         let {
           fail_sme [ALWAYS Once*! Nothing] :: GHC.Prim.State#
                                                 GHC.Prim.RealWorld
                                               -> AST.Expr
           LclId
           [Arity 1]
           fail_sme =
             \ _ ->
               case ds_dlb of _ {
                 Data.Maybe.Nothing ->
                   let {
                     lvl_smg [ALWAYS Once Nothing] :: AST.Expr
                     LclId
                     []
                     lvl_smg = AST.E10 (AST.getSpan @ [AST.Expr] $dSpan_al3
 ds_dla) } in
                   lvl_smg;
                 Data.Maybe.Just t_agk [ALWAYS Once Nothing] ->
                   AST.E10
                     (AST.spanning
                        @ [AST.Expr] @ AST.Token $dSpan_al3 AST.$fSpanToken
 ds_dla t_agk)
               } } in
         case ds_dlc of _ {
           [] ->
             case ds_dlb of _ {
               Data.Maybe.Nothing -> e_ag9;
               Data.Maybe.Just _ -> fail_sme GHC.Prim.realWorld#
             };
           : _ _ -> fail_sme GHC.Prim.realWorld#
         }
     }




 ==================== Simplifier mode 2 [main], iteration 1 out of 4
 ====================
 Total ticks: NON-ZERO!


     Result size = 2999

 ==================== Simplifier mode 2 [main], iteration 1 out of 4
 ====================
 a_spy :: [AST.Expr] -> AST.SrcSpan
 LclId
 [Arity 1]
 a_spy =
   AST.$fSpan[]_getSpan
     @ AST.Expr
     (AST.expr_SrcSpan
      `cast` (sym (AST.NTCo:T:Span AST.Expr)
              :: (AST.Expr -> AST.SrcSpan) ~ AST.T:Span AST.Expr))

 lvl_smf :: AST.Expr
 LclId
 []
 lvl_smf =
   Control.Exception.Base.patError
     @ AST.Expr "ParserUtils.hs:(6,0)-(8,51)|function makeTupleOrExpr"

 ParserUtils.makeTupleOrExpr :: [AST.Expr]
                                -> Data.Maybe.Maybe AST.Token
                                -> AST.Expr
 LclIdX
 [Arity 2]
 ParserUtils.makeTupleOrExpr =
   \ (ds_dla :: [AST.Expr]) (ds_dlb :: Data.Maybe.Maybe AST.Token) ->
     case ds_dla of wild_B1 {
       [] -> lvl_smf;
       : e_ag9 ds_dlc ->
         let {
           fail_sme :: GHC.Prim.State# GHC.Prim.RealWorld -> AST.Expr
           LclId
           [Arity 1]
           fail_sme =
             \ _ ->
               case ds_dlb of _ {
                 Data.Maybe.Nothing ->
                   AST.E10
                     (AST.$fSpan[]_getSpan
                        @ AST.Expr
                        (AST.expr_SrcSpan
                         `cast` (sym (AST.NTCo:T:Span AST.Expr)
                                 :: (AST.Expr -> AST.SrcSpan) ~ AST.T:Span
 AST.Expr))
                        wild_B1);
                 Data.Maybe.Just t_agk ->
                   AST.E10
                     (let {
                        $j_srC :: GHC.Types.Int -> GHC.Types.Int ->
 AST.SrcSpan
                        LclId
                        [Arity 2]
                        $j_srC =
                          \ (ds_alw [ALWAYS Nothing OneShot] ::
 GHC.Types.Int)
                            (ds1_alx [ALWAYS Nothing OneShot] ::
 GHC.Types.Int) ->
                            case ds_alw of wild1_alB { GHC.Types.I# x#_alD
 ->
                            let {
                              $j_srA :: GHC.Types.Int -> GHC.Types.Int ->
 AST.SrcSpan
                              LclId
                              [Arity 2]
                              $j_srA =
                                \ (ds6_alJ [ALWAYS Nothing OneShot] ::
 GHC.Types.Int)
                                  (ds7_alK [ALWAYS Nothing OneShot] ::
 GHC.Types.Int) ->
                                  case ds6_alJ of wild11_alM { GHC.Types.I#
 y#_alO ->
                                  case GHC.Prim.<# x#_alD y#_alO of _ {
                                    GHC.Bool.False ->
                                      AST.SpanMultiLine wild11_alM ds7_alK
 wild1_alB ds1_alx;
                                    GHC.Bool.True ->
                                      AST.SpanMultiLine wild1_alB ds1_alx
 wild11_alM ds7_alK
                                  }
                                  } } in
                            case t_agk of _ {
                              AST.T10 ds1_apD ->
                                case ds1_apD of _ { AST.SpanMultiLine _ _
 ds6_alJ ds7_alK ->
                                case ds6_alJ of wild11_alM { GHC.Types.I#
 y#_alO ->
                                case GHC.Prim.<# x#_alD y#_alO of _ {
                                  GHC.Bool.False ->
                                    AST.SpanMultiLine wild11_alM ds7_alK
 wild1_alB ds1_alx;
                                  GHC.Bool.True ->
                                    AST.SpanMultiLine wild1_alB ds1_alx
 wild11_alM ds7_alK
                                }
                                }
                                };
                              AST.T11 ds1_apG ->
                                case ds1_apG of _ { AST.SpanMultiLine _ _
 ds6_alJ ds7_alK ->
                                case ds6_alJ of wild11_alM { GHC.Types.I#
 y#_alO ->
                                case GHC.Prim.<# x#_alD y#_alO of _ {
                                  GHC.Bool.False ->
                                    AST.SpanMultiLine wild11_alM ds7_alK
 wild1_alB ds1_alx;
                                  GHC.Bool.True ->
                                    AST.SpanMultiLine wild1_alB ds1_alx
 wild11_alM ds7_alK
                                }
                                }
                                };
 [...]
                              AST.T49 ds1_arw ->
                                case ds1_arw of _ { AST.SpanMultiLine _ _
 ds6_alJ ds7_alK ->
                                case ds6_alJ of wild11_alM { GHC.Types.I#
 y#_alO ->
                                case GHC.Prim.<# x#_alD y#_alO of _ {
                                  GHC.Bool.False ->
                                    AST.SpanMultiLine wild11_alM ds7_alK
 wild1_alB ds1_alx;
                                  GHC.Bool.True ->
                                    AST.SpanMultiLine wild1_alB ds1_alx
 wild11_alM ds7_alK
                                }
                                }
                                }
                            }
                            } } in
                      case ds_dlc of wild1_amq {
                        [] ->
                          case e_ag9 of _ {
                            AST.E10 ds1_anA ->
                              case ds1_anA of _ { AST.SpanMultiLine ds_alw
 ds1_alx _ _ ->
                              $j_srC ds_alw ds1_alx
                              };
                            AST.E11 ds1_anD ->
                              case ds1_anD of _ { AST.SpanMultiLine ds_alw
 ds1_alx _ _ ->
                              $j_srC ds_alw ds1_alx
                              };
 [...]
                            AST.E49 ds1_apt ->
                              case ds1_apt of _ { AST.SpanMultiLine ds_alw
 ds1_alx _ _ ->
                              $j_srC ds_alw ds1_alx
                              }
                          };
                        : ipv_amu ipv1_amv ->
                          let {
                            $j_srG :: GHC.Types.Int -> GHC.Types.Int ->
 AST.SrcSpan
                            LclId
                            [Arity 2]
                            $j_srG =
                              \ (ds1_amz [ALWAYS Nothing OneShot] ::
 GHC.Types.Int)
                                (ds2_amA [ALWAYS Nothing OneShot] ::
 GHC.Types.Int) ->
                                case ds1_amz of wild3_amE { GHC.Types.I#
 x#_amG ->
                                let {
                                  $j_srE :: GHC.Types.Int -> GHC.Types.Int
 -> AST.SrcSpan
                                  LclId
                                  [Arity 2]
                                  $j_srE =
                                    \ (ds7_anl [ALWAYS Nothing OneShot] ::
 GHC.Types.Int)
                                      (ds8_anm [ALWAYS Nothing OneShot] ::
 GHC.Types.Int) ->
                                      case ds7_anl of wild11_ano {
 GHC.Types.I# y#_anq ->
                                      case GHC.Prim.<# x#_amG y#_anq of _ {
                                        GHC.Bool.False -> $j_srC wild11_ano
 ds8_anm;
                                        GHC.Bool.True -> $j_srC wild3_amE
 ds2_amA
                                      }
                                      } } in
                                case GHC.List.last_last' @ AST.Expr e_ag9
 wild1_amq of _ {
                                  AST.E10 ds1_anA ->
                                    case ds1_anA of _ { AST.SpanMultiLine _
 _ ds7_anl ds8_anm ->
                                    case ds7_anl of wild11_ano {
 GHC.Types.I# y#_anq ->
                                    case GHC.Prim.<# x#_amG y#_anq of _ {
                                      GHC.Bool.False -> $j_srC wild11_ano
 ds8_anm;
                                      GHC.Bool.True -> $j_srC wild3_amE
 ds2_amA
                                    }
                                    }
                                    };
                                  AST.E11 ds1_anD ->
                                    case ds1_anD of _ { AST.SpanMultiLine _
 _ ds7_anl ds8_anm ->
                                    case ds7_anl of wild11_ano {
 GHC.Types.I# y#_anq ->
                                    case GHC.Prim.<# x#_amG y#_anq of _ {
                                      GHC.Bool.False -> $j_srC wild11_ano
 ds8_anm;
                                      GHC.Bool.True -> $j_srC wild3_amE
 ds2_amA
                                    }
                                    }
                                    };
 [...]
                                  AST.E49 ds1_apt ->
                                    case ds1_apt of _ { AST.SpanMultiLine _
 _ ds7_anl ds8_anm ->
                                    case ds7_anl of wild11_ano {
 GHC.Types.I# y#_anq ->
                                    case GHC.Prim.<# x#_amG y#_anq of _ {
                                      GHC.Bool.False -> $j_srC wild11_ano
 ds8_anm;
                                      GHC.Bool.True -> $j_srC wild3_amE
 ds2_amA
                                    }
                                    }
                                    }
                                }
                                } } in
                          case e_ag9 of _ {
                            AST.E10 ds1_anA ->
                              case ds1_anA of _ { AST.SpanMultiLine ds1_amz
 ds2_amA _ _ ->
                              $j_srG ds1_amz ds2_amA
                              };
                            AST.E11 ds1_anD ->
                              case ds1_anD of _ { AST.SpanMultiLine ds1_amz
 ds2_amA _ _ ->
                              $j_srG ds1_amz ds2_amA
                              };
 [...]
                            AST.E49 ds1_apt ->
                              case ds1_apt of _ { AST.SpanMultiLine ds1_amz
 ds2_amA _ _ ->
                              $j_srG ds1_amz ds2_amA
                              }
                          }
                      })
               } } in
         case ds_dlc of _ {
           [] ->
             case ds_dlb of _ {
               Data.Maybe.Nothing -> e_ag9;
               Data.Maybe.Just _ -> fail_sme GHC.Prim.realWorld#
             };
           : _ _ -> fail_sme GHC.Prim.realWorld#
         }
     }
 }}}

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/3972#comment:3>
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