diff options
Diffstat (limited to 'src/passes/OptimizeInstructions.cpp')
-rw-r--r-- | src/passes/OptimizeInstructions.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/passes/OptimizeInstructions.cpp b/src/passes/OptimizeInstructions.cpp index 2736c8984..232faab7a 100644 --- a/src/passes/OptimizeInstructions.cpp +++ b/src/passes/OptimizeInstructions.cpp @@ -1454,6 +1454,23 @@ private: right->value = Literal::makeZero(type); return right; } + // i32(x) / i32.min_s ==> x == i32.min_s + if (matches( + curr, + binary(DivSInt32, any(), i32(std::numeric_limits<int32_t>::min())))) { + curr->op = EqInt32; + return curr; + } + // i64(x) / i64.min_s ==> i64(x == i64.min_s) + // only for zero shrink level + if (getPassOptions().shrinkLevel == 0 && + matches( + curr, + binary(DivSInt64, any(), i64(std::numeric_limits<int64_t>::min())))) { + curr->op = EqInt64; + curr->type = Type::i32; + return Builder(*getModule()).makeUnary(ExtendUInt32, curr); + } // (unsigned)x > -1 ==> 0 if (matches(curr, binary(Abstract::GtU, pure(&left), ival(-1)))) { right->value = Literal::makeZero(Type::i32); |