#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

Reply via email to