summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/passes/OptimizeInstructions.cpp4
-rw-r--r--test/passes/optimize-instructions.txt12
-rw-r--r--test/passes/optimize-instructions.wast15
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)
+ )
+ )
+ )
)