[add equality -> case conversion optimization, add equalsExpression optimizations
John Meacham <john@repetae.net>**20070531110126] hunk ./C/OpEval.hs 16
+    caseEquals :: e -> (Number,t) -> e -> e -> e
+
+    equalsExpression :: e -> e -> Bool
hunk ./C/OpEval.hs 23
+    equalsExpression _ _ = False
hunk ./C/OpEval.hs 75
-binOp bop t1 t2 tr e1 e2 str | Just _ <- toConstant e2, Just bop' <- commuteBinOp bop = binOp bop' t2 t1 tr e2 e1 str `mplus` Just (createBinOp bop' t2 t1 tr e2 e1 str)
+binOp bop t1 t2 tr e1 e2 str | Just _ <- toConstant e2, Just bop' <- commuteBinOp bop = Just $ createBinOp bop' t2 t1 tr e2 e1 str
hunk ./C/OpEval.hs 95
---    f bop e1 e2 | isAssociative bop, Just (bop',t1',t2',tr',e1',e2',str') <- fromBinOp e1, bop == bop' = let
---        g binop = binop bop e1' (binop
---        in g binOp `mplus` g (Just . createBinOp)
+    f Eq e1 e2 | Just (v1,t1) <- toConstant e1 = return $ caseEquals e2 (v1,t1) (toBool True) (toBool False)
+    f NEq e1 e2 | Just (v1,t1) <- toConstant e1 = return $ caseEquals e2 (v1,t1) (toBool False) (toBool True)
+
+    f Eq e1 e2 | e1 `equalsExpression` e2 = return $ toBool True
+    f NEq e1 e2 | e1 `equalsExpression` e2 = return $ toBool False
+    f Lte e1 e2 | e1 `equalsExpression` e2 = return $ toBool True
+    f Gte e1 e2 | e1 `equalsExpression` e2 = return $ toBool True
+    f Lt e1 e2 | e1 `equalsExpression` e2 = return $ toBool False
+    f Gt e1 e2 | e1 `equalsExpression` e2 = return $ toBool False
+    f ULte e1 e2 | e1 `equalsExpression` e2 = return $ toBool True
+    f UGte e1 e2 | e1 `equalsExpression` e2 = return $ toBool True
+    f ULt e1 e2 | e1 `equalsExpression` e2 = return $ toBool False
+    f UGt e1 e2 | e1 `equalsExpression` e2 = return $ toBool False
+
+    f Sub e1 e2 | e1 `equalsExpression` e2 = return $ toExpression 0 str
+    f Xor e1 e2 | e1 `equalsExpression` e2 = return $ toExpression 0 str
+    f And e1 e2 | e1 `equalsExpression` e2 = return e1
+    f Or e1 e2 | e1 `equalsExpression` e2 = return e1
+    f bop e1 e2 | isAssociative bop, Just (bop',t1',t2',tr',e1',e2',str') <- fromBinOp e1, bop == bop' = Just $
+        createBinOp bop tr tr tr e1' (createBinOp bop tr tr tr e2' e2 str) str
hunk ./C/OpEval.hs 117
+binOp' :: Expression t e => BinOp -> Ty -> Ty -> Ty -> e -> e -> t -> e
+binOp' bop t1 t2 tr e1 e2 str =  case binOp bop t1 t2 tr e1 e2 str of
+    Just e -> e
+    Nothing -> createBinOp bop t1 t2 tr e1 e2 str
+
hunk ./E/PrimOpt.hs 10
-import qualified Data.Map as Map
hunk ./E/PrimOpt.hs 24
-import PrimitiveOperators
hunk ./E/PrimOpt.hs 56
+    f EPrim {} = 'p'
hunk ./E/PrimOpt.hs 82
+    equalsExpression e1 e2 = e1 == e2
+    caseEquals scrut (n,t) e1 e2 = eCase scrut [Alt (LitInt n t) e1 ] e2