diff options
author | Alon Zakai <alonzakai@gmail.com> | 2017-07-12 11:16:04 -0700 |
---|---|---|
committer | Alon Zakai (kripken) <alonzakai@gmail.com> | 2017-07-13 11:54:03 -0700 |
commit | b85e8b51464d0ea1d76d08c2a1b53648e9b7ed9c (patch) | |
tree | 025bb749fb5277ef453153171ad2233ea58384eb /src | |
parent | 26b2f331a210bf6de22816e2564516a9f59178d0 (diff) | |
download | binaryen-b85e8b51464d0ea1d76d08c2a1b53648e9b7ed9c.tar.gz binaryen-b85e8b51464d0ea1d76d08c2a1b53648e9b7ed9c.tar.bz2 binaryen-b85e8b51464d0ea1d76d08c2a1b53648e9b7ed9c.zip |
zero shifts are not sign-extends
Diffstat (limited to 'src')
-rw-r--r-- | src/ast/properties.h | 24 |
1 files changed, 14 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; + } } } } |