#3132: x86 code generator generates bad FPU register names
-----------------------------+----------------------------------------------
Reporter: int-e | Owner:
Type: bug | Status: new
Priority: normal | Component: Compiler (NCG)
Version: 6.11 | Severity: normal
Keywords: | Testcase:
Os: Unknown/Multiple | Architecture: x86
-----------------------------+----------------------------------------------
The following code,
{{{
module Spring where
import Data.Array.Unboxed
type Arr = UArray Int Double
data Spring = Spring !Double !Int !Arr deriving Show
step :: Double -> Spring -> Spring
step h (Spring k sz y) = let
f arr = listArray (0, 2*sz-1) (velocity ++ accel)
where
velocity = [arr ! i | i <- [sz .. 2*sz-1]]
k' = k * fromIntegral sz^2
accel = [0] ++ [k' * (arr!(i-1) - 2 * arr!i + arr!(i+1))
| i <- [1 .. sz-2]]
++ [k' * (arr!(sz-2) - arr!(sz-1))]
(.*) :: Double -> Arr -> Arr
a .* b = listArray (0, 2*sz-1) $ map (a*) (elems b)
(<+>) :: Arr -> Arr -> Arr
a <+> b = listArray (0, 2*sz-1) $ zipWith (+) (elems a) (elems b)
-- order 4 Runge-Kutta
k1 = h .* f y
k2 = h .* f (y <+> (0.5 .* k1))
k3 = h .* f (y <+> (0.5 .* k2))
k4 = h .* f (y <+> k3)
y' = y <+> ((1/6) .* (k1 <+> (2 .* (k2 <+> k3)) <+> k4))
in
Spring k sz y'
}}}
doesn't compile with optimization in ghc-6.11:
{{{
# ghc -O -c Bug.hs
/tmp/ghc12296_0/ghc12296_0.s: Assembler messages:
/tmp/ghc12296_0/ghc12296_0.s:2355:0:
Error: bad register name `%st(-8)'
/tmp/ghc12296_0/ghc12296_0.s:2384:0:
Error: bad register name `%st(-8)'
/tmp/ghc12296_0/ghc12296_0.s:2563:0:
Error: bad register name `%st(-8)'
/tmp/ghc12296_0/ghc12296_0.s:2602:0:
Error: bad register name `%st(-8)'
/tmp/ghc12296_0/ghc12296_0.s:3006:0:
Error: bad register name `%fake0'
/tmp/ghc12296_0/ghc12296_0.s:3023:0:
Error: bad register name `%fake0'
}}}
It's odd, first it tries to assign a closure pointer to an FPU register:
{{{
movl $r1sa_closure,%fake0
}}}
and later it uses register 0 (%eax) as an operand to an FPU operation:
{{{
# gsubl %fake1,%eax,%fake1
#GSUB-xxxcase1
ffree %st(7) ; fld %st(-8) ; fsubrp %st(0),%st(2)
}}}
Using {{{-fregs-graph}}} didn't help.
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/3132>
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