blob: e77c1cfff54306aed9124be57920b5aa82ae1767 [file] [log] [blame]
Ben Murdoch097c5b22016-05-18 11:27:45 +01001// Copyright 2016 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "test/unittests/test-utils.h"
6
7#include "src/v8.h"
8
9#include "test/cctest/wasm/test-signatures.h"
10
11#include "src/bit-vector.h"
12#include "src/objects.h"
13
14#include "src/wasm/ast-decoder.h"
15#include "src/wasm/wasm-macro-gen.h"
16#include "src/wasm/wasm-module.h"
17
18#define WASM_SET_ZERO(i) WASM_SET_LOCAL(i, WASM_ZERO)
19
20namespace v8 {
21namespace internal {
22namespace wasm {
23
24class WasmLoopAssignmentAnalyzerTest : public TestWithZone {
25 public:
Ben Murdochda12d292016-06-02 14:46:10 +010026 WasmLoopAssignmentAnalyzerTest() : num_locals(0) {}
Ben Murdoch097c5b22016-05-18 11:27:45 +010027 TestSignatures sigs;
Ben Murdochda12d292016-06-02 14:46:10 +010028 uint32_t num_locals;
Ben Murdoch097c5b22016-05-18 11:27:45 +010029
30 BitVector* Analyze(const byte* start, const byte* end) {
Ben Murdochda12d292016-06-02 14:46:10 +010031 return AnalyzeLoopAssignmentForTesting(zone(), num_locals, start, end);
Ben Murdoch097c5b22016-05-18 11:27:45 +010032 }
33};
34
35
36TEST_F(WasmLoopAssignmentAnalyzerTest, Empty0) {
37 byte code[] = { 0 };
38 BitVector* assigned = Analyze(code, code);
39 CHECK_NULL(assigned);
40}
41
42
43TEST_F(WasmLoopAssignmentAnalyzerTest, Empty1) {
44 byte code[] = {kExprLoop, 0};
45 for (int i = 0; i < 5; i++) {
46 BitVector* assigned = Analyze(code, code + arraysize(code));
47 for (int j = 0; j < assigned->length(); j++) {
48 CHECK_EQ(false, assigned->Contains(j));
49 }
Ben Murdochda12d292016-06-02 14:46:10 +010050 num_locals++;
Ben Murdoch097c5b22016-05-18 11:27:45 +010051 }
52}
53
54
55TEST_F(WasmLoopAssignmentAnalyzerTest, One) {
Ben Murdochda12d292016-06-02 14:46:10 +010056 num_locals = 5;
Ben Murdoch097c5b22016-05-18 11:27:45 +010057 for (int i = 0; i < 5; i++) {
58 byte code[] = {WASM_LOOP(1, WASM_SET_ZERO(i))};
59 BitVector* assigned = Analyze(code, code + arraysize(code));
60 for (int j = 0; j < assigned->length(); j++) {
61 CHECK_EQ(j == i, assigned->Contains(j));
62 }
63 }
64}
65
66
67TEST_F(WasmLoopAssignmentAnalyzerTest, OneBeyond) {
Ben Murdochda12d292016-06-02 14:46:10 +010068 num_locals = 5;
Ben Murdoch097c5b22016-05-18 11:27:45 +010069 for (int i = 0; i < 5; i++) {
70 byte code[] = {WASM_LOOP(1, WASM_SET_ZERO(i)), WASM_SET_ZERO(1)};
71 BitVector* assigned = Analyze(code, code + arraysize(code));
72 for (int j = 0; j < assigned->length(); j++) {
73 CHECK_EQ(j == i, assigned->Contains(j));
74 }
75 }
76}
77
78
79TEST_F(WasmLoopAssignmentAnalyzerTest, Two) {
Ben Murdochda12d292016-06-02 14:46:10 +010080 num_locals = 5;
Ben Murdoch097c5b22016-05-18 11:27:45 +010081 for (int i = 0; i < 5; i++) {
82 for (int j = 0; j < 5; j++) {
83 byte code[] = {WASM_LOOP(2, WASM_SET_ZERO(i), WASM_SET_ZERO(j))};
84 BitVector* assigned = Analyze(code, code + arraysize(code));
85 for (int k = 0; k < assigned->length(); k++) {
86 bool expected = k == i || k == j;
87 CHECK_EQ(expected, assigned->Contains(k));
88 }
89 }
90 }
91}
92
93
94TEST_F(WasmLoopAssignmentAnalyzerTest, NestedIf) {
Ben Murdochda12d292016-06-02 14:46:10 +010095 num_locals = 5;
Ben Murdoch097c5b22016-05-18 11:27:45 +010096 for (int i = 0; i < 5; i++) {
97 byte code[] = {WASM_LOOP(
98 1, WASM_IF_ELSE(WASM_SET_ZERO(0), WASM_SET_ZERO(i), WASM_SET_ZERO(1)))};
99 BitVector* assigned = Analyze(code, code + arraysize(code));
100 for (int j = 0; j < assigned->length(); j++) {
101 bool expected = i == j || j == 0 || j == 1;
102 CHECK_EQ(expected, assigned->Contains(j));
103 }
104 }
105}
106
107
108static byte LEBByte(uint32_t val, byte which) {
109 byte b = (val >> (which * 7)) & 0x7F;
110 if (val >> ((which + 1) * 7)) b |= 0x80;
111 return b;
112}
113
114
115TEST_F(WasmLoopAssignmentAnalyzerTest, BigLocal) {
Ben Murdochda12d292016-06-02 14:46:10 +0100116 num_locals = 65000;
Ben Murdoch097c5b22016-05-18 11:27:45 +0100117 for (int i = 13; i < 65000; i = static_cast<int>(i * 1.5)) {
118 byte code[] = {kExprLoop,
119 1,
120 kExprSetLocal,
121 LEBByte(i, 0),
122 LEBByte(i, 1),
123 LEBByte(i, 2),
124 11,
125 12,
126 13};
127
128 BitVector* assigned = Analyze(code, code + arraysize(code));
129 for (int j = 0; j < assigned->length(); j++) {
130 bool expected = i == j;
131 CHECK_EQ(expected, assigned->Contains(j));
132 }
133 }
134}
135
136
137TEST_F(WasmLoopAssignmentAnalyzerTest, Break) {
Ben Murdochda12d292016-06-02 14:46:10 +0100138 num_locals = 3;
Ben Murdoch097c5b22016-05-18 11:27:45 +0100139 byte code[] = {
140 WASM_LOOP(1, WASM_IF(WASM_GET_LOCAL(0), WASM_BRV(1, WASM_SET_ZERO(1)))),
141 WASM_SET_ZERO(0)};
142
143 BitVector* assigned = Analyze(code, code + arraysize(code));
144 for (int j = 0; j < assigned->length(); j++) {
145 bool expected = j == 1;
146 CHECK_EQ(expected, assigned->Contains(j));
147 }
148}
149
150
151TEST_F(WasmLoopAssignmentAnalyzerTest, Loop1) {
Ben Murdochda12d292016-06-02 14:46:10 +0100152 num_locals = 5;
Ben Murdoch097c5b22016-05-18 11:27:45 +0100153 byte code[] = {
154 WASM_LOOP(1, WASM_IF(WASM_GET_LOCAL(0),
155 WASM_BRV(0, WASM_SET_LOCAL(
156 3, WASM_I32_SUB(WASM_GET_LOCAL(0),
157 WASM_I8(1)))))),
158 WASM_GET_LOCAL(0)};
159
160 BitVector* assigned = Analyze(code, code + arraysize(code));
161 for (int j = 0; j < assigned->length(); j++) {
162 bool expected = j == 3;
163 CHECK_EQ(expected, assigned->Contains(j));
164 }
165}
166
167
168TEST_F(WasmLoopAssignmentAnalyzerTest, Loop2) {
Ben Murdochda12d292016-06-02 14:46:10 +0100169 num_locals = 6;
Ben Murdoch097c5b22016-05-18 11:27:45 +0100170 const byte kIter = 0;
Ben Murdoch097c5b22016-05-18 11:27:45 +0100171 const byte kSum = 3;
172
173 byte code[] = {WASM_BLOCK(
174 3,
175 WASM_WHILE(
176 WASM_GET_LOCAL(kIter),
177 WASM_BLOCK(2, WASM_SET_LOCAL(
178 kSum, WASM_F32_ADD(
179 WASM_GET_LOCAL(kSum),
180 WASM_LOAD_MEM(MachineType::Float32(),
181 WASM_GET_LOCAL(kIter)))),
182 WASM_SET_LOCAL(kIter, WASM_I32_SUB(WASM_GET_LOCAL(kIter),
183 WASM_I8(4))))),
184 WASM_STORE_MEM(MachineType::Float32(), WASM_ZERO, WASM_GET_LOCAL(kSum)),
185 WASM_GET_LOCAL(kIter))};
186
187 BitVector* assigned = Analyze(code + 2, code + arraysize(code));
188 for (int j = 0; j < assigned->length(); j++) {
189 bool expected = j == kIter || j == kSum;
190 CHECK_EQ(expected, assigned->Contains(j));
191 }
192}
193
194
195} // namespace wasm
196} // namespace internal
197} // namespace v8