#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    
                                      
-------------------------------+--------------------------------------------
Changes (by igloo):

  * priority:  normal => high
  * milestone:  => 6.12.3


Comment:

 With `AST.hs`:
 {{{
 module AST (Expr(..), Token(..), spanning, getSpan) where

 class Span a where
    getSpan :: a -> SrcSpan

 spanning :: (Span a, Span b) => a -> b -> SrcSpan
 spanning x y = combineSrcSpans (getSpan x) (getSpan y)

 instance Span a => Span [a] where
    getSpan [] = error "[]"
    getSpan [x] = getSpan x
    getSpan list@(x:_) = combineSrcSpans (getSpan x) (getSpan (last list))

 data SrcSpan

   = SpanMultiLine
     { span_start_row    :: !Int
     , span_start_column :: !Int
     , span_end_row      :: !Int
     , span_end_column   :: !Int
     }

 combineSrcSpans :: SrcSpan -> SrcSpan -> SrcSpan
 combineSrcSpans start end
  = case row1 `compare` row2 of
      LT -> SpanMultiLine row1 col1 row2 col2
      _  -> SpanMultiLine row2 col2 row1 col1
   where
   row1 = startRow start
   col1 = startCol start
   row2 = endRow end
   col2 = endCol end


 startRow :: SrcSpan -> Int
 startRow (SpanMultiLine { span_start_row = row }) = row

 endRow :: SrcSpan -> Int
 endRow (SpanMultiLine { span_end_row = row }) = row

 startCol :: SrcSpan -> Int
 startCol (SpanMultiLine { span_start_column = col }) = col

 endCol :: SrcSpan -> Int
 endCol (SpanMultiLine { span_end_column = col }) = col

 data Token
    = T10 { token_SrcSpan :: SrcSpan }
    | T11 { token_SrcSpan :: SrcSpan }
    | T12 { token_SrcSpan :: SrcSpan }
    | T13 { token_SrcSpan :: SrcSpan }
    | T14 { token_SrcSpan :: SrcSpan }
    | T15 { token_SrcSpan :: SrcSpan }
    | T16 { token_SrcSpan :: SrcSpan }
    | T17 { token_SrcSpan :: SrcSpan }
    | T18 { token_SrcSpan :: SrcSpan }
    | T19 { token_SrcSpan :: SrcSpan }
    | T20 { token_SrcSpan :: SrcSpan }
    | T21 { token_SrcSpan :: SrcSpan }
    | T22 { token_SrcSpan :: SrcSpan }
    | T23 { token_SrcSpan :: SrcSpan }
    | T24 { token_SrcSpan :: SrcSpan }
    | T25 { token_SrcSpan :: SrcSpan }
    | T26 { token_SrcSpan :: SrcSpan }
    | T27 { token_SrcSpan :: SrcSpan }
    | T28 { token_SrcSpan :: SrcSpan }
    | T29 { token_SrcSpan :: SrcSpan }
    | T30 { token_SrcSpan :: SrcSpan }
    | T31 { token_SrcSpan :: SrcSpan }
    | T32 { token_SrcSpan :: SrcSpan }
    | T33 { token_SrcSpan :: SrcSpan }
    | T34 { token_SrcSpan :: SrcSpan }
    | T35 { token_SrcSpan :: SrcSpan }
    | T36 { token_SrcSpan :: SrcSpan }
    | T37 { token_SrcSpan :: SrcSpan }
    | T38 { token_SrcSpan :: SrcSpan }
    | T39 { token_SrcSpan :: SrcSpan }
    | T40 { token_SrcSpan :: SrcSpan }
    | T41 { token_SrcSpan :: SrcSpan }
    | T42 { token_SrcSpan :: SrcSpan }
    | T43 { token_SrcSpan :: SrcSpan }
    | T44 { token_SrcSpan :: SrcSpan }
    | T45 { token_SrcSpan :: SrcSpan }
    | T46 { token_SrcSpan :: SrcSpan }
    | T47 { token_SrcSpan :: SrcSpan }
    | T48 { token_SrcSpan :: SrcSpan }
    | T49 { token_SrcSpan :: SrcSpan }

 instance Span Token where
   getSpan = token_SrcSpan

 data Expr
    = E10 { expr_SrcSpan :: SrcSpan }
    | E11 { expr_SrcSpan :: SrcSpan }
    | E12 { expr_SrcSpan :: SrcSpan }
    | E13 { expr_SrcSpan :: SrcSpan }
    | E14 { expr_SrcSpan :: SrcSpan }
    | E15 { expr_SrcSpan :: SrcSpan }
    | E16 { expr_SrcSpan :: SrcSpan }
    | E17 { expr_SrcSpan :: SrcSpan }
    | E18 { expr_SrcSpan :: SrcSpan }
    | E19 { expr_SrcSpan :: SrcSpan }
    | E20 { expr_SrcSpan :: SrcSpan }
    | E21 { expr_SrcSpan :: SrcSpan }
    | E22 { expr_SrcSpan :: SrcSpan }
    | E23 { expr_SrcSpan :: SrcSpan }
    | E24 { expr_SrcSpan :: SrcSpan }
    | E25 { expr_SrcSpan :: SrcSpan }
    | E26 { expr_SrcSpan :: SrcSpan }
    | E27 { expr_SrcSpan :: SrcSpan }
    | E28 { expr_SrcSpan :: SrcSpan }
    | E29 { expr_SrcSpan :: SrcSpan }
    | E30 { expr_SrcSpan :: SrcSpan }
    | E31 { expr_SrcSpan :: SrcSpan }
    | E32 { expr_SrcSpan :: SrcSpan }
    | E33 { expr_SrcSpan :: SrcSpan }
    | E34 { expr_SrcSpan :: SrcSpan }
    | E35 { expr_SrcSpan :: SrcSpan }
    | E36 { expr_SrcSpan :: SrcSpan }
    | E37 { expr_SrcSpan :: SrcSpan }
    | E38 { expr_SrcSpan :: SrcSpan }
    | E39 { expr_SrcSpan :: SrcSpan }
    | E40 { expr_SrcSpan :: SrcSpan }
    | E41 { expr_SrcSpan :: SrcSpan }
    | E42 { expr_SrcSpan :: SrcSpan }
    | E43 { expr_SrcSpan :: SrcSpan }
    | E44 { expr_SrcSpan :: SrcSpan }
    | E45 { expr_SrcSpan :: SrcSpan }
    | E46 { expr_SrcSpan :: SrcSpan }
    | E47 { expr_SrcSpan :: SrcSpan }
    | E48 { expr_SrcSpan :: SrcSpan }
    | E49 { expr_SrcSpan :: SrcSpan }

 instance Span Expr where
    getSpan = expr_SrcSpan
 }}}
 and `ParserUtils.hs`:
 {{{
 module ParserUtils where

 import AST (Expr(E10), Token, spanning, getSpan)

 makeTupleOrExpr :: [Expr] -> Maybe Token -> Expr
 makeTupleOrExpr [e] Nothing = e
 makeTupleOrExpr es@(_:_) (Just t) = E10 (spanning es t)
 makeTupleOrExpr es@(_:_) Nothing  = E10 (getSpan es)
 }}}
 6.12.1 and stable branch give (with a 1G memory limit):
 {{{
 $ ulimit -v
 1024000
 $ ghc -O -c AST.hs
 $ ghc -O -c ParserUtils.hs
 ghc: out of memory (requested 1048576 bytes)
 }}}
 while HEAD has no problem. I don't know if this is due to luck, or if HEAD
 has already been fixed, though.

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