I need some help with my work on ticket #6135. Consider this program:

{-# LANGUAGE BangPatterns, MagicHash #-}
module Main where

import GHC.Exts

main = print $ nan## ==## nan##
  where !(D# nan##) = 0.0 / 0.0

This prints False, which is a correct implementation of IEEE754 standard. 
However when I compile 
this with my modified compiler that uses new comparison primops (they return 
Int# instead of 
Bool) I get True, whcih obviously is incorrect. I belive that the problem lies 
in this piece of 
code from prelude/PrelRules.hs:

mkRelOpRule :: Name -> (forall a . Ord a => a -> a -> Bool)
            -> [RuleM CoreExpr] -> Maybe CoreRule
mkRelOpRule nm cmp extra
  = mkPrimOpRule nm 2 $ rules ++ extra
  where
    rules = [ binaryLit (\_ -> cmpOp cmp)
            , equalArgs >>
              -- x `cmp` x does not depend on x, so
              -- compute it for the arbitrary value 'True'
              -- and use that result
              return (if cmp True True
                        then trueVal
                        else falseVal) ]

It looks that equalArgs suddenly started to return True, whereas it previously 
returned False. On 
the other hand in GHCi I get correct result (False). Can anyone give me a hint 
why is this 
happening?

Janek

_______________________________________________
ghc-devs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/ghc-devs

Reply via email to