summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/passes/OptimizeInstructions.cpp4
-rw-r--r--test/passes/optimize-instructions.txt62
-rw-r--r--test/passes/optimize-instructions.wast40
3 files changed, 95 insertions, 11 deletions
diff --git a/src/passes/OptimizeInstructions.cpp b/src/passes/OptimizeInstructions.cpp
index 578a01f11..f458a58b2 100644
--- a/src/passes/OptimizeInstructions.cpp
+++ b/src/passes/OptimizeInstructions.cpp
@@ -228,8 +228,8 @@ Index getMaxBits(Expression* curr, LocalInfoProvider* localInfoProvider) {
}
} else if (auto* unary = curr->dynCast<Unary>()) {
switch (unary->op) {
- case ClzInt32: case CtzInt32: case PopcntInt32: return 5;
- case ClzInt64: case CtzInt64: case PopcntInt64: return 6;
+ case ClzInt32: case CtzInt32: case PopcntInt32: return 6;
+ case ClzInt64: case CtzInt64: case PopcntInt64: return 7;
case EqZInt32: case EqZInt64: return 1;
case WrapInt64: return std::min(Index(32), getMaxBits(unary->value, localInfoProvider));
default: {}
diff --git a/test/passes/optimize-instructions.txt b/test/passes/optimize-instructions.txt
index 2e46379fb..55501dfb8 100644
--- a/test/passes/optimize-instructions.txt
+++ b/test/passes/optimize-instructions.txt
@@ -7,6 +7,7 @@
(type $5 (func (param i32)))
(type $6 (func (param i32 i32) (result i32)))
(type $7 (func (param i64) (result i64)))
+ (type $8 (func (result i64)))
(memory $0 0)
(export "load-off-2" (func $load-off-2))
(func $f (type $0) (param $i1 i32) (param $i2 i64)
@@ -827,11 +828,14 @@
)
)
(drop
- (i32.shl
- (i32.clz
- (i32.const 0)
+ (i32.shr_s
+ (i32.shl
+ (i32.clz
+ (i32.const 0)
+ )
+ (i32.const 26)
)
- (i32.const 2)
+ (i32.const 24)
)
)
(drop
@@ -853,13 +857,16 @@
)
)
(drop
- (i32.shl
- (i32.wrap/i64
- (i64.clz
- (i64.const 0)
+ (i32.shr_s
+ (i32.shl
+ (i32.wrap/i64
+ (i64.clz
+ (i64.const 0)
+ )
)
+ (i32.const 25)
)
- (i32.const 1)
+ (i32.const 24)
)
)
(drop
@@ -2076,4 +2083,41 @@
(func $less-shifts-than-it-seems (type $3) (param $x i32) (result i32)
(i32.const 4800)
)
+ (func $and-popcount32 (type $2) (result i32)
+ (i32.and
+ (i32.popcnt
+ (i32.const -1)
+ )
+ (i32.const 31)
+ )
+ )
+ (func $and-popcount32-big (type $2) (result i32)
+ (i32.popcnt
+ (i32.const -1)
+ )
+ )
+ (func $and-popcount64 (type $8) (result i64)
+ (i64.and
+ (i64.popcnt
+ (i64.const -1)
+ )
+ (i64.const 63)
+ )
+ )
+ (func $and-popcount64-big (type $8) (result i64)
+ (i64.and
+ (i64.popcnt
+ (i64.const -1)
+ )
+ (i64.const 127)
+ )
+ )
+ (func $and-popcount64-bigger (type $8) (result i64)
+ (i64.and
+ (i64.popcnt
+ (i64.const -1)
+ )
+ (i64.const 255)
+ )
+ )
)
diff --git a/test/passes/optimize-instructions.wast b/test/passes/optimize-instructions.wast
index 517c74ea6..c26aad196 100644
--- a/test/passes/optimize-instructions.wast
+++ b/test/passes/optimize-instructions.wast
@@ -2526,4 +2526,44 @@
)
)
)
+ (func $and-popcount32 (result i32)
+ (i32.and
+ (i32.popcnt
+ (i32.const -1)
+ )
+ (i32.const 31)
+ )
+ )
+ (func $and-popcount32-big (result i32)
+ (i32.and
+ (i32.popcnt
+ (i32.const -1)
+ )
+ (i32.const 63)
+ )
+ )
+ (func $and-popcount64 (result i64) ;; these are TODOs
+ (i64.and
+ (i64.popcnt
+ (i64.const -1)
+ )
+ (i64.const 63)
+ )
+ )
+ (func $and-popcount64-big (result i64)
+ (i64.and
+ (i64.popcnt
+ (i64.const -1)
+ )
+ (i64.const 127)
+ )
+ )
+ (func $and-popcount64-bigger (result i64)
+ (i64.and
+ (i64.popcnt
+ (i64.const -1)
+ )
+ (i64.const 255)
+ )
+ )
)