[commit: ghc] master: Migrate more rules to PrelRules. (4f811e1)

Paolo Capriotti p.capriotti at gmail.com
Fri Jul 27 10:34:01 CEST 2012


Repository : ssh://darcs.haskell.org//srv/darcs/ghc

On branch  : master

http://hackage.haskell.org/trac/ghc/changeset/4f811e1a86701918fe2434958f9bc80b0b5f866a

>---------------------------------------------------------------

commit 4f811e1a86701918fe2434958f9bc80b0b5f866a
Author: Paolo Capriotti <p.capriotti at gmail.com>
Date:   Wed Jul 25 11:37:18 2012 +0100

    Migrate more rules to PrelRules.
    
    Move the following primop rules from GHC.Base to PrelRules:
    
    "narrow32Int#"  forall x#. narrow32Int#   x# = x#
    "narrow32Word#" forall x#. narrow32Word#   x# = x#
    
    "int2Word2Int"  forall x#. int2Word# (word2Int# x#) = x#
    "word2Int2Word" forall x#. word2Int# (int2Word# x#) = x#

>---------------------------------------------------------------

 compiler/prelude/PrelRules.lhs |   46 ++++++++++++++++++++++++++++++++-------
 1 files changed, 37 insertions(+), 9 deletions(-)

diff --git a/compiler/prelude/PrelRules.lhs b/compiler/prelude/PrelRules.lhs
index 388aad3..77c9654 100644
--- a/compiler/prelude/PrelRules.lhs
+++ b/compiler/prelude/PrelRules.lhs
@@ -18,6 +18,7 @@ ToDo:
 module PrelRules ( primOpRules, builtinRules ) where
 
 #include "HsVersions.h"
+#include "../includes/MachDeps.h"
 
 import {-# SOURCE #-} MkId ( mkPrimOpId )
 
@@ -129,14 +130,18 @@ primOpRules nm SrlOp       = mkPrimOpRule nm 2 [ binaryLit (wordShiftOp2 shiftRi
                                                , rightIdentity zeroi ]
 
 -- coercions
-primOpRules nm Word2IntOp     = mkPrimOpRule nm 1 [ liftLit word2IntLit ]
-primOpRules nm Int2WordOp     = mkPrimOpRule nm 1 [ liftLit int2WordLit ]
+primOpRules nm Word2IntOp     = mkPrimOpRule nm 1 [ liftLit word2IntLit
+                                                  , inversePrimOp Int2WordOp ]
+primOpRules nm Int2WordOp     = mkPrimOpRule nm 1 [ liftLit int2WordLit
+                                                  , inversePrimOp Word2IntOp ]
 primOpRules nm Narrow8IntOp   = mkPrimOpRule nm 1 [ liftLit narrow8IntLit ]
 primOpRules nm Narrow16IntOp  = mkPrimOpRule nm 1 [ liftLit narrow16IntLit ]
-primOpRules nm Narrow32IntOp  = mkPrimOpRule nm 1 [ liftLit narrow32IntLit ]
+primOpRules nm Narrow32IntOp  = mkPrimOpRule nm 1 [ liftLit narrow32IntLit
+                                                  , removeOp32 ]
 primOpRules nm Narrow8WordOp  = mkPrimOpRule nm 1 [ liftLit narrow8WordLit ]
 primOpRules nm Narrow16WordOp = mkPrimOpRule nm 1 [ liftLit narrow16WordLit ]
-primOpRules nm Narrow32WordOp = mkPrimOpRule nm 1 [ liftLit narrow32WordLit ]
+primOpRules nm Narrow32WordOp = mkPrimOpRule nm 1 [ liftLit narrow32WordLit
+                                                  , removeOp32 ]
 primOpRules nm OrdOp          = mkPrimOpRule nm 1 [ liftLit char2IntLit ]
 primOpRules nm ChrOp          = mkPrimOpRule nm 1 [ do { [Lit lit] <- getArgs
                                                   ; guard (litFitsInChar lit)
@@ -194,21 +199,21 @@ primOpRules nm FloatGeOp  = mkRelOpRule nm (>=) []
 primOpRules nm FloatLeOp  = mkRelOpRule nm (<=) []
 primOpRules nm FloatLtOp  = mkRelOpRule nm (<)  []
 primOpRules nm FloatEqOp  = mkRelOpRule nm (==) [ litEq True ]
-primOpRules nm FloatNeOp  = mkRelOpRule nm (/=) [ litEq True ]
+primOpRules nm FloatNeOp  = mkRelOpRule nm (/=) [ litEq False ]
 
 primOpRules nm DoubleGtOp = mkRelOpRule nm (>)  []
 primOpRules nm DoubleGeOp = mkRelOpRule nm (>=) []
 primOpRules nm DoubleLeOp = mkRelOpRule nm (<=) []
 primOpRules nm DoubleLtOp = mkRelOpRule nm (<)  []
 primOpRules nm DoubleEqOp = mkRelOpRule nm (==) [ litEq True ]
-primOpRules nm DoubleNeOp = mkRelOpRule nm (/=) [ litEq True ]
+primOpRules nm DoubleNeOp = mkRelOpRule nm (/=) [ litEq False ]
 
 primOpRules nm WordGtOp   = mkRelOpRule nm (>)  [ boundsCmp Gt ]
 primOpRules nm WordGeOp   = mkRelOpRule nm (>=) [ boundsCmp Ge ]
 primOpRules nm WordLeOp   = mkRelOpRule nm (<=) [ boundsCmp Le ]
 primOpRules nm WordLtOp   = mkRelOpRule nm (<)  [ boundsCmp Lt ]
 primOpRules nm WordEqOp   = mkRelOpRule nm (==) [ litEq True ]
-primOpRules nm WordNeOp   = mkRelOpRule nm (/=) [ litEq True ]
+primOpRules nm WordNeOp   = mkRelOpRule nm (/=) [ litEq False ]
 
 primOpRules nm SeqOp      = mkPrimOpRule nm 4 [ seqRule ]
 primOpRules nm SparkOp    = mkPrimOpRule nm 4 [ sparkRule ]
@@ -412,8 +417,14 @@ intResult result
 wordResult :: Integer -> Maybe CoreExpr
 wordResult result
   = Just (mkWordVal (toInteger (fromInteger result :: TargetWord)))
-\end{code}
 
+inversePrimOp :: PrimOp -> RuleM CoreExpr
+inversePrimOp primop = do
+  [Var primop_id `App` e] <- getArgs
+  matchPrimOpId primop primop_id
+  return e
+
+\end{code}
 
 %************************************************************************
 %*                                                                      *
@@ -454,6 +465,18 @@ liftLit f = do
   [Lit lit] <- getArgs
   return $ Lit (f lit)
 
+removeOp :: RuleM CoreExpr
+removeOp = do
+  [e] <- getArgs
+  return e
+
+removeOp32 :: RuleM CoreExpr
+#if WORD_SIZE_IN_BITS == 32
+removeOp32 = removeOp
+#else
+removeOp32 = mzero
+#endif
+
 getArgs :: RuleM [CoreExpr]
 getArgs = RuleM $ \_ args -> Just args
 
@@ -558,8 +581,13 @@ mkFloatVal :: Rational -> Expr CoreBndr
 mkFloatVal  f = Lit (convFloating (MachFloat  f))
 mkDoubleVal :: Rational -> Expr CoreBndr
 mkDoubleVal d = Lit (convFloating (MachDouble d))
-\end{code}
 
+matchPrimOpId :: PrimOp -> Id -> RuleM ()
+matchPrimOpId op id = do
+  op' <- liftMaybe $ isPrimOpId_maybe id
+  guard $ op == op'
+
+\end{code}
 
 %************************************************************************
 %*                                                                      *





More information about the Cvs-ghc mailing list