summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2017-07-12 11:16:04 -0700
committerAlon Zakai (kripken) <alonzakai@gmail.com>2017-07-13 11:54:03 -0700
commitb85e8b51464d0ea1d76d08c2a1b53648e9b7ed9c (patch)
tree025bb749fb5277ef453153171ad2233ea58384eb
parent26b2f331a210bf6de22816e2564516a9f59178d0 (diff)
downloadbinaryen-b85e8b51464d0ea1d76d08c2a1b53648e9b7ed9c.tar.gz
binaryen-b85e8b51464d0ea1d76d08c2a1b53648e9b7ed9c.tar.bz2
binaryen-b85e8b51464d0ea1d76d08c2a1b53648e9b7ed9c.zip
zero shifts are not sign-extends
-rw-r--r--src/ast/properties.h24
-rw-r--r--test/passes/optimize-instructions.txt30
-rw-r--r--test/passes/optimize-instructions.wast36
3 files changed, 80 insertions, 10 deletions
diff --git a/src/ast/properties.h b/src/ast/properties.h
index 9121deba5..097f7a8f0 100644
--- a/src/ast/properties.h
+++ b/src/ast/properties.h
@@ -60,11 +60,13 @@ struct Properties {
if (auto* outer = curr->dynCast<Binary>()) {
if (outer->op == ShrSInt32) {
if (auto* outerConst = outer->right->dynCast<Const>()) {
- if (auto* inner = outer->left->dynCast<Binary>()) {
- if (inner->op == ShlInt32) {
- if (auto* innerConst = inner->right->dynCast<Const>()) {
- if (outerConst->value == innerConst->value) {
- return inner->left;
+ if (outerConst->value.geti32() != 0) {
+ if (auto* inner = outer->left->dynCast<Binary>()) {
+ if (inner->op == ShlInt32) {
+ if (auto* innerConst = inner->right->dynCast<Const>()) {
+ if (outerConst->value == innerConst->value) {
+ return inner->left;
+ }
}
}
}
@@ -87,11 +89,13 @@ struct Properties {
if (auto* outer = curr->dynCast<Binary>()) {
if (outer->op == ShrSInt32) {
if (auto* outerConst = outer->right->dynCast<Const>()) {
- if (auto* inner = outer->left->dynCast<Binary>()) {
- if (inner->op == ShlInt32) {
- if (auto* innerConst = inner->right->dynCast<Const>()) {
- if (outerConst->value.leU(innerConst->value).geti32()) {
- return inner->left;
+ if (outerConst->value.geti32() != 0) {
+ if (auto* inner = outer->left->dynCast<Binary>()) {
+ if (inner->op == ShlInt32) {
+ if (auto* innerConst = inner->right->dynCast<Const>()) {
+ if (outerConst->value.leU(innerConst->value).geti32()) {
+ return inner->left;
+ }
}
}
}
diff --git a/test/passes/optimize-instructions.txt b/test/passes/optimize-instructions.txt
index c8fe17cf0..49c3fca8b 100644
--- a/test/passes/optimize-instructions.txt
+++ b/test/passes/optimize-instructions.txt
@@ -1962,4 +1962,34 @@
)
)
)
+ (func $zero-shifts-is-not-sign-ext (type $1)
+ (drop
+ (i32.eq
+ (i32.shr_s
+ (i32.shl
+ (i32.load16_s align=1
+ (i32.const 790656516)
+ )
+ (i32.const 0)
+ )
+ (i32.const 0)
+ )
+ (i32.const -5431187)
+ )
+ )
+ (drop
+ (i32.eq
+ (i32.shr_s
+ (i32.shl
+ (i32.load16_s align=1
+ (i32.const 790656516)
+ )
+ (i32.const 1)
+ )
+ (i32.const 0)
+ )
+ (i32.const -5431187)
+ )
+ )
+ )
)
diff --git a/test/passes/optimize-instructions.wast b/test/passes/optimize-instructions.wast
index bb89d7314..88b2bcdfe 100644
--- a/test/passes/optimize-instructions.wast
+++ b/test/passes/optimize-instructions.wast
@@ -2359,4 +2359,40 @@
)
)
)
+ (func $zero-shifts-is-not-sign-ext
+ (drop
+ (i32.eq
+ (i32.const -5431187)
+ (i32.add
+ (i32.const 0)
+ (i32.shr_s
+ (i32.shl
+ (i32.load16_s align=1
+ (i32.const 790656516)
+ )
+ (i32.const 0)
+ )
+ (i32.const 0)
+ )
+ )
+ )
+ )
+ (drop
+ (i32.eq
+ (i32.const -5431187)
+ (i32.add
+ (i32.const 0)
+ (i32.shr_s
+ (i32.shl
+ (i32.load16_s align=1
+ (i32.const 790656516)
+ )
+ (i32.const 1)
+ )
+ (i32.const 0)
+ )
+ )
+ )
+ )
+ )
)