aboutsummaryrefslogtreecommitdiff
path: root/deps/v8/test/unittests/wasm/loop-assignment-analysis-unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/unittests/wasm/loop-assignment-analysis-unittest.cc')
-rw-r--r--deps/v8/test/unittests/wasm/loop-assignment-analysis-unittest.cc211
1 files changed, 211 insertions, 0 deletions
diff --git a/deps/v8/test/unittests/wasm/loop-assignment-analysis-unittest.cc b/deps/v8/test/unittests/wasm/loop-assignment-analysis-unittest.cc
new file mode 100644
index 0000000000..958621970c
--- /dev/null
+++ b/deps/v8/test/unittests/wasm/loop-assignment-analysis-unittest.cc
@@ -0,0 +1,211 @@
+// Copyright 2016 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "test/unittests/test-utils.h"
+
+#include "src/v8.h"
+
+#include "test/cctest/wasm/test-signatures.h"
+
+#include "src/bit-vector.h"
+#include "src/objects.h"
+
+#include "src/wasm/ast-decoder.h"
+#include "src/wasm/wasm-macro-gen.h"
+#include "src/wasm/wasm-module.h"
+
+#define WASM_SET_ZERO(i) WASM_SET_LOCAL(i, WASM_ZERO)
+
+namespace v8 {
+namespace internal {
+namespace wasm {
+
+class WasmLoopAssignmentAnalyzerTest : public TestWithZone {
+ public:
+ WasmLoopAssignmentAnalyzerTest() : TestWithZone(), sigs() {
+ init_env(&env, sigs.v_v());
+ }
+
+ TestSignatures sigs;
+ FunctionEnv env;
+
+ static void init_env(FunctionEnv* env, FunctionSig* sig) {
+ env->module = nullptr;
+ env->sig = sig;
+ env->local_i32_count = 0;
+ env->local_i64_count = 0;
+ env->local_f32_count = 0;
+ env->local_f64_count = 0;
+ env->SumLocals();
+ }
+
+ BitVector* Analyze(const byte* start, const byte* end) {
+ return AnalyzeLoopAssignmentForTesting(zone(), &env, start, end);
+ }
+};
+
+
+TEST_F(WasmLoopAssignmentAnalyzerTest, Empty0) {
+ byte code[] = { 0 };
+ BitVector* assigned = Analyze(code, code);
+ CHECK_NULL(assigned);
+}
+
+
+TEST_F(WasmLoopAssignmentAnalyzerTest, Empty1) {
+ byte code[] = {kExprLoop, 0};
+ for (int i = 0; i < 5; i++) {
+ BitVector* assigned = Analyze(code, code + arraysize(code));
+ for (int j = 0; j < assigned->length(); j++) {
+ CHECK_EQ(false, assigned->Contains(j));
+ }
+ env.AddLocals(kAstI32, 1);
+ }
+}
+
+
+TEST_F(WasmLoopAssignmentAnalyzerTest, One) {
+ env.AddLocals(kAstI32, 5);
+ for (int i = 0; i < 5; i++) {
+ byte code[] = {WASM_LOOP(1, WASM_SET_ZERO(i))};
+ BitVector* assigned = Analyze(code, code + arraysize(code));
+ for (int j = 0; j < assigned->length(); j++) {
+ CHECK_EQ(j == i, assigned->Contains(j));
+ }
+ }
+}
+
+
+TEST_F(WasmLoopAssignmentAnalyzerTest, OneBeyond) {
+ env.AddLocals(kAstI32, 5);
+ for (int i = 0; i < 5; i++) {
+ byte code[] = {WASM_LOOP(1, WASM_SET_ZERO(i)), WASM_SET_ZERO(1)};
+ BitVector* assigned = Analyze(code, code + arraysize(code));
+ for (int j = 0; j < assigned->length(); j++) {
+ CHECK_EQ(j == i, assigned->Contains(j));
+ }
+ }
+}
+
+
+TEST_F(WasmLoopAssignmentAnalyzerTest, Two) {
+ env.AddLocals(kAstI32, 5);
+ for (int i = 0; i < 5; i++) {
+ for (int j = 0; j < 5; j++) {
+ byte code[] = {WASM_LOOP(2, WASM_SET_ZERO(i), WASM_SET_ZERO(j))};
+ BitVector* assigned = Analyze(code, code + arraysize(code));
+ for (int k = 0; k < assigned->length(); k++) {
+ bool expected = k == i || k == j;
+ CHECK_EQ(expected, assigned->Contains(k));
+ }
+ }
+ }
+}
+
+
+TEST_F(WasmLoopAssignmentAnalyzerTest, NestedIf) {
+ env.AddLocals(kAstI32, 5);
+ for (int i = 0; i < 5; i++) {
+ byte code[] = {WASM_LOOP(
+ 1, WASM_IF_ELSE(WASM_SET_ZERO(0), WASM_SET_ZERO(i), WASM_SET_ZERO(1)))};
+ BitVector* assigned = Analyze(code, code + arraysize(code));
+ for (int j = 0; j < assigned->length(); j++) {
+ bool expected = i == j || j == 0 || j == 1;
+ CHECK_EQ(expected, assigned->Contains(j));
+ }
+ }
+}
+
+
+static byte LEBByte(uint32_t val, byte which) {
+ byte b = (val >> (which * 7)) & 0x7F;
+ if (val >> ((which + 1) * 7)) b |= 0x80;
+ return b;
+}
+
+
+TEST_F(WasmLoopAssignmentAnalyzerTest, BigLocal) {
+ env.AddLocals(kAstI32, 65000);
+ for (int i = 13; i < 65000; i = static_cast<int>(i * 1.5)) {
+ byte code[] = {kExprLoop,
+ 1,
+ kExprSetLocal,
+ LEBByte(i, 0),
+ LEBByte(i, 1),
+ LEBByte(i, 2),
+ 11,
+ 12,
+ 13};
+
+ BitVector* assigned = Analyze(code, code + arraysize(code));
+ for (int j = 0; j < assigned->length(); j++) {
+ bool expected = i == j;
+ CHECK_EQ(expected, assigned->Contains(j));
+ }
+ }
+}
+
+
+TEST_F(WasmLoopAssignmentAnalyzerTest, Break) {
+ env.AddLocals(kAstI32, 3);
+ byte code[] = {
+ WASM_LOOP(1, WASM_IF(WASM_GET_LOCAL(0), WASM_BRV(1, WASM_SET_ZERO(1)))),
+ WASM_SET_ZERO(0)};
+
+ BitVector* assigned = Analyze(code, code + arraysize(code));
+ for (int j = 0; j < assigned->length(); j++) {
+ bool expected = j == 1;
+ CHECK_EQ(expected, assigned->Contains(j));
+ }
+}
+
+
+TEST_F(WasmLoopAssignmentAnalyzerTest, Loop1) {
+ env.AddLocals(kAstI32, 5);
+ byte code[] = {
+ WASM_LOOP(1, WASM_IF(WASM_GET_LOCAL(0),
+ WASM_BRV(0, WASM_SET_LOCAL(
+ 3, WASM_I32_SUB(WASM_GET_LOCAL(0),
+ WASM_I8(1)))))),
+ WASM_GET_LOCAL(0)};
+
+ BitVector* assigned = Analyze(code, code + arraysize(code));
+ for (int j = 0; j < assigned->length(); j++) {
+ bool expected = j == 3;
+ CHECK_EQ(expected, assigned->Contains(j));
+ }
+}
+
+
+TEST_F(WasmLoopAssignmentAnalyzerTest, Loop2) {
+ env.AddLocals(kAstI32, 3);
+ const byte kIter = 0;
+ env.AddLocals(kAstF32, 3);
+ const byte kSum = 3;
+
+ byte code[] = {WASM_BLOCK(
+ 3,
+ WASM_WHILE(
+ WASM_GET_LOCAL(kIter),
+ WASM_BLOCK(2, WASM_SET_LOCAL(
+ kSum, WASM_F32_ADD(
+ WASM_GET_LOCAL(kSum),
+ WASM_LOAD_MEM(MachineType::Float32(),
+ WASM_GET_LOCAL(kIter)))),
+ WASM_SET_LOCAL(kIter, WASM_I32_SUB(WASM_GET_LOCAL(kIter),
+ WASM_I8(4))))),
+ WASM_STORE_MEM(MachineType::Float32(), WASM_ZERO, WASM_GET_LOCAL(kSum)),
+ WASM_GET_LOCAL(kIter))};
+
+ BitVector* assigned = Analyze(code + 2, code + arraysize(code));
+ for (int j = 0; j < assigned->length(); j++) {
+ bool expected = j == kIter || j == kSum;
+ CHECK_EQ(expected, assigned->Contains(j));
+ }
+}
+
+
+} // namespace wasm
+} // namespace internal
+} // namespace v8