diff options
-rw-r--r-- | src/passes/OptimizeInstructions.cpp | 4 | ||||
-rw-r--r-- | test/passes/optimize-instructions.txt | 12 | ||||
-rw-r--r-- | test/passes/optimize-instructions.wast | 15 |
3 files changed, 31 insertions, 0 deletions
diff --git a/src/passes/OptimizeInstructions.cpp b/src/passes/OptimizeInstructions.cpp index 561e7882c..51fb67065 100644 --- a/src/passes/OptimizeInstructions.cpp +++ b/src/passes/OptimizeInstructions.cpp @@ -561,6 +561,10 @@ private: } } } + if (auto* ext = getSignExt(binary)) { + // use a cheaper zero-extent, we just care about the boolean value anyhow + return makeZeroExt(ext, getSignExtBits(binary)); + } } else if (auto* block = boolean->dynCast<Block>()) { if (block->type == i32 && block->list.size() > 0) { block->list.back() = optimizeBoolean(block->list.back()); diff --git a/test/passes/optimize-instructions.txt b/test/passes/optimize-instructions.txt index eddb2b6b3..a170b3b8c 100644 --- a/test/passes/optimize-instructions.txt +++ b/test/passes/optimize-instructions.txt @@ -1121,4 +1121,16 @@ ) ) ) + (func $sign-ext-boolean (type $4) (param $0 i32) (param $1 i32) + (drop + (if i32 + (i32.and + (get_local $0) + (i32.const 255) + ) + (i32.const 100) + (i32.const 200) + ) + ) + ) ) diff --git a/test/passes/optimize-instructions.wast b/test/passes/optimize-instructions.wast index d9e6fcc71..035eb754b 100644 --- a/test/passes/optimize-instructions.wast +++ b/test/passes/optimize-instructions.wast @@ -1390,4 +1390,19 @@ ) ) ) + (func $sign-ext-boolean (param $0 i32) (param $1 i32) + (drop + (if i32 + (i32.shr_s + (i32.shl + (get_local $0) + (i32.const 24) + ) + (i32.const 24) + ) + (i32.const 100) + (i32.const 200) + ) + ) + ) ) |