diff options
author | Alon Zakai <azakai@google.com> | 2021-09-01 14:06:56 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-01 21:06:56 +0000 |
commit | 4bf2d3bc3da17a28b65222d6e84f6126dcb9c553 (patch) | |
tree | c3ea072129f8d30305280cb1265badcaffc1928a | |
parent | b50064bde4f584813398b7696ce7a4a3bf1cbbaa (diff) | |
download | binaryen-4bf2d3bc3da17a28b65222d6e84f6126dcb9c553.tar.gz binaryen-4bf2d3bc3da17a28b65222d6e84f6126dcb9c553.tar.bz2 binaryen-4bf2d3bc3da17a28b65222d6e84f6126dcb9c553.zip |
Fix the effects of array.copy (#4118)
This appeared to be a regression from #4117, however this
was always a bug, and that PR just exposed it. That is,
somehow we forgot to indicate the effects of ArrayCopy, and
after that PR we'd vacuum it out incorrectly.
-rw-r--r-- | src/ir/effects.h | 2 | ||||
-rw-r--r-- | test/example/cpp-unit.cpp | 14 |
2 files changed, 16 insertions, 0 deletions
diff --git a/src/ir/effects.h b/src/ir/effects.h index b9393ade2..475e6f2b1 100644 --- a/src/ir/effects.h +++ b/src/ir/effects.h @@ -659,6 +659,8 @@ private: } } void visitArrayCopy(ArrayCopy* curr) { + parent.readsArray = true; + parent.writesArray = true; // traps when a ref is null, or when out of bounds. parent.implicitTrap = true; } diff --git a/test/example/cpp-unit.cpp b/test/example/cpp-unit.cpp index 9c95bb31c..41096a43a 100644 --- a/test/example/cpp-unit.cpp +++ b/test/example/cpp-unit.cpp @@ -599,12 +599,26 @@ void test_cost() { void test_effects() { PassOptions options; Module module; + // Unreachables trap. Unreachable unreachable; assert_equal(EffectAnalyzer(options, module, &unreachable).trap, true); + // Nops... do not. Nop nop; assert_equal(EffectAnalyzer(options, module, &nop).trap, false); + + // ArrayCopy can trap, reads arrays, and writes arrays (but not structs). + { + ArrayCopy arrayCopy(module.allocator); + EffectAnalyzer effects(options, module); + effects.visit(&arrayCopy); + assert_equal(effects.trap, true); + assert_equal(effects.readsArray, true); + assert_equal(effects.writesArray, true); + assert_equal(effects.readsStruct, false); + assert_equal(effects.writesStruct, false); + } } void test_literals() { |