
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