From 6deb76d51d58ec910855c38eaf4f2cdd5619076d Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 14 Oct 2016 18:18:10 -0700 Subject: optimize out i32.and of -1 --- src/passes/OptimizeInstructions.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/passes/OptimizeInstructions.cpp b/src/passes/OptimizeInstructions.cpp index 7547f332a..0b54f9756 100644 --- a/src/passes/OptimizeInstructions.cpp +++ b/src/passes/OptimizeInstructions.cpp @@ -224,10 +224,15 @@ struct OptimizeInstructions : public WalkerPassop == AndInt32) { - if (auto* load = binary->left->dynCast()) { - if (auto* right = binary->right->dynCast()) { - if (right->type == i32) { - auto mask = right->value.geti32(); + if (auto* right = binary->right->dynCast()) { + if (right->type == i32) { + auto mask = right->value.geti32(); + // and with -1 does nothing (common in asm.js output) + if (mask == -1) { + return binary->left; + } + // small loads do not need to be masted, the load itself masks + if (auto* load = binary->left->dynCast()) { if ((load->bytes == 1 && mask == 0xff) || (load->bytes == 2 && mask == 0xffff)) { load->signed_ = false; -- cgit v1.2.3