Commit a4835b8b authored by rl@cse.unsw.edu.au's avatar rl@cse.unsw.edu.au

Teach cheapEqExpr about casts

Previously, cheapEqExpr would always return False if it encountered a cast.
This was bad for two reasons. Firstly, CSE (which uses cheapEqExpr to compare
expressions) never eliminated expressions which contained casts and secondly,
it was inconsistent with exprIsBig. This patch fixes this.
parent 5952ef0d
......@@ -34,7 +34,7 @@ module CoreUtils (
exprEtaExpandArity, etaExpand,
-- Size
coreBindsSize,
coreBindsSize, exprSize,
-- Hashing
hashExpr,
......@@ -1271,6 +1271,9 @@ cheapEqExpr (Type t1) (Type t2) = t1 `coreEqType` t2
cheapEqExpr (App f1 a1) (App f2 a2)
= f1 `cheapEqExpr` f2 && a1 `cheapEqExpr` a2
cheapEqExpr (Cast e1 t1) (Cast e2 t2)
= e1 `cheapEqExpr` e2 && t1 `coreEqCoercion` t2
cheapEqExpr _ _ = False
exprIsBig :: Expr b -> Bool
......
......@@ -42,6 +42,9 @@ module Coercion (
transCoercionTyCon, leftCoercionTyCon,
rightCoercionTyCon, instCoercionTyCon, -- needed by TysWiredIn
-- Comparison
coreEqCoercion,
-- CoercionI
CoercionI(..),
isIdentityCoercion,
......@@ -482,6 +485,12 @@ splitNewTypeRepCo_maybe (TyConApp tc tys)
-- This case handled by coreView
splitNewTypeRepCo_maybe _
= Nothing
-------------------------------------
-- Syntactic equality of coercions
coreEqCoercion :: Coercion -> Coercion -> Bool
coreEqCoercion = coreEqType
\end{code}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment