diff --git a/src/main/scala/leon/purescala/TreeOps.scala b/src/main/scala/leon/purescala/TreeOps.scala index fc3f06d22d1474aa23d70a80e0e5583078bfbb84..a7a47c8a6c5f40a841dbeedb7c861e5f1b49638d 100644 --- a/src/main/scala/leon/purescala/TreeOps.scala +++ b/src/main/scala/leon/purescala/TreeOps.scala @@ -1371,6 +1371,7 @@ object TreeOps { case Plus(e, IntLiteral(0)) => e case Plus(e1, UMinus(e2)) => Minus(e1, e2) case Plus(Plus(e, IntLiteral(i1)), IntLiteral(i2)) => Plus(e, IntLiteral(i1+i2)) + case Plus(Plus(IntLiteral(i1), e), IntLiteral(i2)) => Plus(IntLiteral(i1+i2), e) case Minus(e, IntLiteral(0)) => e case Minus(IntLiteral(0), e) => UMinus(e) @@ -1399,7 +1400,14 @@ object TreeOps { case Division(e, IntLiteral(1)) => e //here we put more expensive rules + //btw, I know those are not the most general rules, but they lead to good optimizations :) + case Plus(UMinus(Plus(e1, e2)), e3) if e1 == e3 => UMinus(e2) + case Plus(UMinus(Plus(e1, e2)), e3) if e2 == e3 => UMinus(e1) case Minus(e1, e2) if e1 == e2 => IntLiteral(0) + case Minus(Plus(e1, e2), Plus(e3, e4)) if e1 == e4 && e2 == e3 => IntLiteral(0) + case Minus(Plus(e1, e2), Plus(Plus(e3, e4), e5)) if e1 == e4 && e2 == e3 => UMinus(e5) + + //default case e => e } def fix[A](f: (A) => A)(a: A): A = {