I have this fairly short code segment that causes ghc to run out of
memory when I use -O2 (even with -H128M).  Is this just the large-ish
expression in `discriminant', or have I tickled a bug?  If I comment
out `discriminant', it works (without needing to specify a -H).

Code is as follows:

module Testing where

mod0 :: Integral a => a -> a -> a
mod0 x 0 = x
mod0 x y = mod x y

data Curve = EC Int Int Int Int Int
             deriving (Eq,Show)

b2 :: Int -> Curve -> Int
b4 :: Int -> Curve -> Int
b6 :: Int -> Curve -> Int
b8 :: Int -> Curve -> Int

b2 p (EC a1 a2 a3 a4 a6) = (a1 `mod0` p * a1 `mod0` p + 4 * a2 `mod0` p) `mod0` p
b4 p (EC a1 a2 a3 a4 a6) = (a1 `mod0` p * a3 `mod0` p + 2 * a4 `mod0` p) `mod0` p
b6 p (EC a1 a2 a3 a4 a6) = (a3 `mod0` p * a3 `mod0` p + 4 * a6 `mod0` p) `mod0` p
b8 p (EC a1 a2 a3 a4 a6) = (  a1  `mod0` p * a1  `mod0` p * a6 `mod0` p
                              - a1 `mod0` p * a3 `mod0` p * a4 `mod0` p
                              +  4          * a2 `mod0` p * a6 `mod0` p
                              + a2 `mod0` p * a3 `mod0` p * a3 `mod0` p
                              - a4 `mod0` p * a4 `mod0` p) `mod0` p

discriminant :: Int -> Curve -> Int
discriminant p curve = (9*!b2p*!b4p*!b6p) -! (b2p*!b2p*!b8p) -! (8*!b4p*!b4p*!b4p)
                       -! (27*!b6p*!b6p)
    where b2p = b2 p curve
          b4p = b4 p curve
          b6p = b6 p curve
          b8p = b8 p curve
          (*!) x y = (x * y) `mod0` p
          (+!) x y = (x + y) `mod0` p
          (-!) x y = (x - y) `mod0` p
          infixl 7  *!
          infixl 6  +!, -!

(sorry for the long lines).

It compiles fine with just -O.

This is with the released 4.06 ghc from RPM; I haven't got the cvs
source to build yet (make boot dies looking for `happy-inplace').

It's been a good way to test that new dimm I've just bought anyway!

Cheers,
M.

Reply via email to