#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