summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2019-04-09 10:34:21 -0700
committerGitHub <noreply@github.com>2019-04-09 10:34:21 -0700
commitb13db5a0bc1170494ba845ab66129a506b251fde (patch)
tree2fb047cfd864e8a6fb21d19a3cf43c4096831eaf
parentd318b18d8c415357e8ee65dd4ae34ec28dc8f9d0 (diff)
downloadbinaryen-b13db5a0bc1170494ba845ab66129a506b251fde.tar.gz
binaryen-b13db5a0bc1170494ba845ab66129a506b251fde.tar.bz2
binaryen-b13db5a0bc1170494ba845ab66129a506b251fde.zip
avoid signed overflow undefined behavior in OptimizeInstructions constant computations (#1990)
-rw-r--r--src/passes/OptimizeInstructions.cpp4
-rw-r--r--test/passes/O1.wast6
2 files changed, 8 insertions, 2 deletions
diff --git a/src/passes/OptimizeInstructions.cpp b/src/passes/OptimizeInstructions.cpp
index 7d4735686..c098d0ed7 100644
--- a/src/passes/OptimizeInstructions.cpp
+++ b/src/passes/OptimizeInstructions.cpp
@@ -825,11 +825,11 @@ private:
// find added constants in an expression tree, including multiplied/shifted, and combine them
// note that we ignore division/shift-right, as rounding makes this nonlinear, so not a valid opt
Expression* optimizeAddedConstants(Binary* binary) {
- int32_t constant = 0;
+ uint32_t constant = 0;
std::vector<Const*> constants;
std::function<void (Expression*, int)> seek = [&](Expression* curr, int mul) {
if (auto* c = curr->dynCast<Const>()) {
- auto value = c->value.geti32();
+ uint32_t value = c->value.geti32();
if (value != 0) {
constant += value * mul;
constants.push_back(c);
diff --git a/test/passes/O1.wast b/test/passes/O1.wast
index 87b06b063..6c1f3abda 100644
--- a/test/passes/O1.wast
+++ b/test/passes/O1.wast
@@ -14,6 +14,12 @@
)
)
)
+ (func $signed-overflow (param $0 f32) (result i32)
+ (i32.sub
+ (i32.const 268435456)
+ (i32.const -2147483648)
+ )
+ )
)