summaryrefslogtreecommitdiff
path: root/src/passes/OptimizeInstructions.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/passes/OptimizeInstructions.cpp')
-rw-r--r--src/passes/OptimizeInstructions.cpp46
1 files changed, 34 insertions, 12 deletions
diff --git a/src/passes/OptimizeInstructions.cpp b/src/passes/OptimizeInstructions.cpp
index 368b483ad..3d98d0a67 100644
--- a/src/passes/OptimizeInstructions.cpp
+++ b/src/passes/OptimizeInstructions.cpp
@@ -32,28 +32,50 @@ struct OptimizeInstructions : public WalkerPass<PostWalker<OptimizeInstructions,
// flip branches to get rid of an i32.eqz
if (curr->ifFalse) {
auto condition = curr->condition->dynCast<Unary>();
- if (condition && condition->op == EqZ && condition->value->type == i32) {
+ if (condition && condition->op == EqZInt32 && condition->value->type == i32) {
curr->condition = condition->value;
std::swap(curr->ifTrue, curr->ifFalse);
}
}
}
void visitUnary(Unary* curr) {
- if (curr->op == EqZ) {
+ if (curr->op == EqZInt32) {
// fold comparisons that flow into an EqZ
auto* child = curr->value->dynCast<Binary>();
if (child && (child->type == i32 || child->type == i64)) {
switch (child->op) {
- case Eq: child->op = Ne; break;
- case Ne: child->op = Eq; break;
- case LtS: child->op = GeS; break;
- case LtU: child->op = GeU; break;
- case LeS: child->op = GtS; break;
- case LeU: child->op = GtU; break;
- case GtS: child->op = LeS; break;
- case GtU: child->op = LeU; break;
- case GeS: child->op = LtS; break;
- case GeU: child->op = LtU; break;
+ case EqInt32: child->op = NeInt32; break;
+ case NeInt32: child->op = EqInt32; break;
+ case LtSInt32: child->op = GeSInt32; break;
+ case LtUInt32: child->op = GeUInt32; break;
+ case LeSInt32: child->op = GtSInt32; break;
+ case LeUInt32: child->op = GtUInt32; break;
+ case GtSInt32: child->op = LeSInt32; break;
+ case GtUInt32: child->op = LeUInt32; break;
+ case GeSInt32: child->op = LtSInt32; break;
+ case GeUInt32: child->op = LtUInt32; break;
+ case EqInt64: child->op = NeInt64; break;
+ case NeInt64: child->op = EqInt64; break;
+ case LtSInt64: child->op = GeSInt64; break;
+ case LtUInt64: child->op = GeUInt64; break;
+ case LeSInt64: child->op = GtSInt64; break;
+ case LeUInt64: child->op = GtUInt64; break;
+ case GtSInt64: child->op = LeSInt64; break;
+ case GtUInt64: child->op = LeUInt64; break;
+ case GeSInt64: child->op = LtSInt64; break;
+ case GeUInt64: child->op = LtUInt64; break;
+ case EqFloat32: child->op = NeFloat32; break;
+ case NeFloat32: child->op = EqFloat32; break;
+ case LtFloat32: child->op = GeFloat32; break;
+ case LeFloat32: child->op = GtFloat32; break;
+ case GtFloat32: child->op = LeFloat32; break;
+ case GeFloat32: child->op = LtFloat32; break;
+ case EqFloat64: child->op = NeFloat64; break;
+ case NeFloat64: child->op = EqFloat64; break;
+ case LtFloat64: child->op = GeFloat64; break;
+ case LeFloat64: child->op = GtFloat64; break;
+ case GtFloat64: child->op = LeFloat64; break;
+ case GeFloat64: child->op = LtFloat64; break;
default: return;
}
replaceCurrent(child);