#3286: junk `naughty x86_64 register' after expression
-----------------------------+----------------------------------------------
  Reporter:  igloo           |          Owner:                
      Type:  bug             |         Status:  new           
  Priority:  high            |      Milestone:  6.12.1        
 Component:  Compiler (NCG)  |        Version:  6.11          
  Severity:  normal          |       Keywords:                
Difficulty:  Unknown         |       Testcase:                
        Os:  Linux           |   Architecture:  x86_64 (amd64)
-----------------------------+----------------------------------------------
 This is a cut-down version of the `hmm` and `logfloat` packages on
 hackage. On amd64/Linux, the 6.10 branch can build this, but the HEAD
 fails with:
 {{{
 $ ghc -fforce-recomp -O --make A.hs
 [1 of 2] Compiling B                ( B.hs, B.o )
 [2 of 2] Compiling A                ( A.hs, A.o )
 /tmp/ghc29040_0/ghc29040_0.s: Assembler messages:

 /tmp/ghc29040_0/ghc29040_0.s:393:0:
      Error: junk `naughty x86_64 register' after expression
 }}}

 `A.hs`:
 {{{
 module A (train) where

 import qualified Data.Map as M
 import Data.List (groupBy, foldl')
 import Data.Maybe (fromMaybe, fromJust)
 import Data.Function (on)
 import B

 type Prob = LogFloat

 learn_states :: (Ord state) => [(observation, state)] -> M.Map state Prob
 learn_states xs = histogram $ map snd xs

 learn_observations ::  (Ord state, Ord observation) =>
                        M.Map state Prob
                     -> [(observation, state)]
                     -> M.Map (observation, state) Prob
 learn_observations state_prob = M.mapWithKey f . histogram
     where f (_, state) prob = prob / (fromJust $ M.lookup state
 state_prob)

 histogram :: (Ord a) => [a] -> M.Map a Prob
 histogram xs = let hist = foldl' undefined M.empty xs in
                 M.map (/ M.fold (+) 0 hist) hist

 train :: (Ord observation, Ord state) =>
             [(observation, state)]
          -> (observation -> [Prob])
 train sample = model
     where
         states = learn_states sample
         state_list = M.keys states

         observations = learn_observations states sample
         observation_probs = fromMaybe (fill state_list []) . (flip
 M.lookup $
                             M.fromList $ map (\ (e, xs) -> (e, fill
 state_list xs)) $
                                 map (\ xs -> (fst $ head xs, map snd xs))
 $
                                 groupBy     ((==) `on` fst)
                                             [(observation, (state, prob))
                                                 | ((observation, state),
 prob) <- M.toAscList observations])

         model = observation_probs

         fill :: Eq state => [state] -> [(state, Prob)] -> [Prob]
         fill = undefined
 }}}

 `B.hs`:
 {{{
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}

 module B (LogFloat) where

 newtype LogFloat = LogFloat Double
     deriving (Eq, Ord, Num, Show)

 instance Fractional LogFloat where
     (/) (LogFloat x) (LogFloat y)
         |    x == 1
           && y == 1 = error "(/)"
         | otherwise                = LogFloat (x-y)
     fromRational = LogFloat . fromRational
 }}}

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/3286>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
_______________________________________________
Glasgow-haskell-bugs mailing list
Glasgow-haskell-bugs@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to