Skip to content

Commit cc374e0

Browse files
committed
Much better simplification
1 parent 8f7be7f commit cc374e0

File tree

1 file changed

+14
-6
lines changed

1 file changed

+14
-6
lines changed

src/EVM/Expr.hs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,16 +72,24 @@ normArgs sym conc l r = case (l, r) of
7272
where
7373
doOp = op2 sym conc
7474

75+
-- Same as `normArgs`, but for commutative operators it orders the arguments canonically
76+
-- This helps in cases when (PEq x1 x2) is comparing x1 and x2 that are equivalent modulo commutativity.
77+
-- In such cases, normArgsOrd will make sure x1 and x2 look the same.
78+
normArgsOrd :: (Expr EWord -> Expr EWord -> Expr EWord) -> (W256 -> W256 -> W256) -> Expr EWord -> Expr EWord -> Expr EWord
79+
normArgsOrd sym conc l r = if l < r then doOp l r else doOp r l
80+
where
81+
doOp = op2 sym conc
82+
7583
-- Integers
7684

7785
add :: Expr EWord -> Expr EWord -> Expr EWord
78-
add = normArgs Add (+)
86+
add = normArgsOrd Add (+)
7987

8088
sub :: Expr EWord -> Expr EWord -> Expr EWord
8189
sub = op2 Sub (-)
8290

8391
mul :: Expr EWord -> Expr EWord -> Expr EWord
84-
mul = normArgs Mul (*)
92+
mul = normArgsOrd Mul (*)
8593

8694
div :: Expr EWord -> Expr EWord -> Expr EWord
8795
div = op2 Div (\x y -> if y == 0 then 0 else Prelude.div x y)
@@ -156,21 +164,21 @@ sgt = op2 SGT (\x y ->
156164
in if sx > sy then 1 else 0)
157165

158166
eq :: Expr EWord -> Expr EWord -> Expr EWord
159-
eq = normArgs Eq (\x y -> if x == y then 1 else 0)
167+
eq = normArgsOrd Eq (\x y -> if x == y then 1 else 0)
160168

161169
iszero :: Expr EWord -> Expr EWord
162170
iszero = op1 IsZero (\x -> if x == 0 then 1 else 0)
163171

164172
-- Bits
165173

166174
and :: Expr EWord -> Expr EWord -> Expr EWord
167-
and = normArgs And (.&.)
175+
and = normArgsOrd And (.&.)
168176

169177
or :: Expr EWord -> Expr EWord -> Expr EWord
170-
or = normArgs Or (.|.)
178+
or = normArgsOrd Or (.|.)
171179

172180
xor :: Expr EWord -> Expr EWord -> Expr EWord
173-
xor = normArgs Xor Data.Bits.xor
181+
xor = normArgsOrd Xor Data.Bits.xor
174182

175183
not :: Expr EWord -> Expr EWord
176184
not = op1 Not complement

0 commit comments

Comments
 (0)