[project @ 2005-01-31 13:25:33 by simonpj]
[ghc-hetmet.git] / ghc / compiler / prelude / PrelRules.lhs
index d7d4201..3a3c02c 100644 (file)
@@ -20,8 +20,8 @@ module PrelRules ( primOpRules, builtinRules ) where
 #include "HsVersions.h"
 
 import CoreSyn
-import Id              ( mkWildId )
-import Literal         ( Literal(..), isLitLitLit, mkMachInt, mkMachWord
+import Id              ( mkWildId, isPrimOpId_maybe )
+import Literal         ( Literal(..), mkMachInt, mkMachWord
                        , literalType
                        , word2IntLit, int2WordLit
                        , narrow8IntLit, narrow16IntLit, narrow32IntLit
@@ -31,11 +31,12 @@ import Literal              ( Literal(..), isLitLitLit, mkMachInt, mkMachWord
                        , float2DoubleLit, double2FloatLit
                        )
 import PrimOp          ( PrimOp(..), primOpOcc )
-import TysWiredIn      ( trueDataConId, falseDataConId )
+-- gaw 2004
+import TysWiredIn      ( boolTy, trueDataConId, falseDataConId )
 import TyCon           ( tyConDataCons_maybe, isEnumerationTyCon, isNewTyCon )
 import DataCon         ( dataConTag, dataConTyCon, dataConWorkId, fIRST_TAG )
-import CoreUtils       ( exprIsValue, cheapEqExpr, exprIsConApp_maybe )
-import Type            ( tyConAppTyCon, eqType )
+import CoreUtils       ( cheapEqExpr, exprIsConApp_maybe )
+import Type            ( tyConAppTyCon, coreEqType )
 import OccName         ( occNameUserString)
 import PrelNames       ( unpackCStringFoldrName, unpackCStringFoldrIdKey, hasKey,
                          eqStringName, unpackCStringIdKey )
@@ -177,16 +178,14 @@ primOpRules op = primop_rule op
 %*                                                                     *
 %************************************************************************
 
-       IMPORTANT NOTE
-
-In all these operations we might find a LitLit as an operand; that's
-why we have the catch-all Nothing case.
+ToDo: the reason these all return Nothing is because there used to be
+the possibility of an argument being a litlit.  Litlits are now gone,
+so this could be cleaned up.
 
 \begin{code}
 --------------------------
 litCoerce :: (Literal -> Literal) -> Literal -> Maybe CoreExpr
-litCoerce fn lit | isLitLitLit lit = Nothing
-                 | otherwise       = Just (Lit (fn lit))
+litCoerce fn lit = Just (Lit (fn lit))
 
 --------------------------
 cmpOp :: (Ordering -> Bool) -> Literal -> Literal -> Maybe CoreExpr
@@ -208,10 +207,12 @@ cmpOp cmp l1 l2
 
 --------------------------
 
-negOp (MachFloat f)  = Just (mkFloatVal (-f))
-negOp (MachDouble d) = Just (mkDoubleVal (-d))
-negOp (MachInt i)    = intResult (-i)
-negOp l                     = Nothing
+negOp (MachFloat 0.0) = Nothing  -- can't represent -0.0 as a Rational
+negOp (MachFloat f)   = Just (mkFloatVal (-f))
+negOp (MachDouble 0.0) = Nothing
+negOp (MachDouble d)   = Just (mkDoubleVal (-d))
+negOp (MachInt i)      = intResult (-i)
+negOp l                       = Nothing
 
 --------------------------
 intOp2 op (MachInt i1) (MachInt i2) = intResult (i1 `op` i2)
@@ -288,7 +289,7 @@ litEq is_eq [expr, Lit lit] = do_lit_eq is_eq lit expr
 litEq is_eq other          = Nothing
 
 do_lit_eq is_eq lit expr
-  = Just (Case expr (mkWildId (literalType lit))
+  = Just (Case expr (mkWildId (literalType lit)) boolTy
                [(DEFAULT,    [], val_if_neq),
                 (LitAlt lit, [], val_if_eq)])
   where
@@ -380,12 +381,15 @@ For dataToTag#, we can reduce if either
        (b) the argument is a variable whose unfolding is a known constructor
 
 \begin{code}
-dataToTagRule [_, val_arg]
-  = case exprIsConApp_maybe val_arg of
-       Just (dc,_) -> ASSERT( not (isNewTyCon (dataConTyCon dc)) )
-                      Just (mkIntVal (toInteger (dataConTag dc - fIRST_TAG)))
+dataToTagRule [Type ty1, Var tag_to_enum `App` Type ty2 `App` tag]
+  | Just TagToEnumOp <- isPrimOpId_maybe tag_to_enum
+  , ty1 `coreEqType` ty2
+  = Just tag   -- dataToTag (tagToEnum x)   ==>   x
 
-       other       -> Nothing
+dataToTagRule [_, val_arg]
+  | Just (dc,_) <- exprIsConApp_maybe val_arg
+  = ASSERT( not (isNewTyCon (dataConTyCon dc)) )
+    Just (mkIntVal (toInteger (dataConTag dc - fIRST_TAG)))
 
 dataToTagRule other = Nothing
 \end{code}
@@ -418,7 +422,7 @@ match_append_lit [Type ty1,
                  ]
   | unpk `hasKey` unpackCStringFoldrIdKey && 
     c1 `cheapEqExpr` c2
-  = ASSERT( ty1 `eqType` ty2 )
+  = ASSERT( ty1 `coreEqType` ty2 )
     Just (Var unpk `App` Type ty1
                   `App` Lit (MachStr (s1 `appendFS` s2))
                   `App` c1