Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(94)

Side by Side Diff: test/unittests/compiler/linkage-tail-call-unittest.cc

Issue 1439613003: [turbofan] Better and more sane support for tail calls (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Skip test in ignition configuration Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « test/mjsunit/tail-call-intrinsic.js ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/compiler/common-operator.h" 5 #include "src/compiler/common-operator.h"
6 #include "src/compiler/graph.h" 6 #include "src/compiler/graph.h"
7 #include "src/compiler/linkage.h" 7 #include "src/compiler/linkage.h"
8 #include "src/compiler/node.h" 8 #include "src/compiler/node.h"
9 #include "test/unittests/test-utils.h" 9 #include "test/unittests/test-utils.h"
10 10
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 } 48 }
49 }; 49 };
50 50
51 51
52 TEST_F(LinkageTailCall, EmptyToEmpty) { 52 TEST_F(LinkageTailCall, EmptyToEmpty) {
53 LocationSignature locations(0, 0, nullptr); 53 LocationSignature locations(0, 0, nullptr);
54 CallDescriptor* desc = NewStandardCallDescriptor(&locations); 54 CallDescriptor* desc = NewStandardCallDescriptor(&locations);
55 CommonOperatorBuilder common(zone()); 55 CommonOperatorBuilder common(zone());
56 const Operator* op = common.Call(desc); 56 const Operator* op = common.Call(desc);
57 Node* const node = Node::New(zone(), 1, op, 0, nullptr, false); 57 Node* const node = Node::New(zone(), 1, op, 0, nullptr, false);
58 EXPECT_TRUE(desc->CanTailCall(node)); 58 int stack_param_delta = 0;
59 EXPECT_TRUE(desc->CanTailCall(node, &stack_param_delta));
60 EXPECT_EQ(0, stack_param_delta);
59 } 61 }
60 62
61 63
62 TEST_F(LinkageTailCall, SameReturn) { 64 TEST_F(LinkageTailCall, SameReturn) {
63 // Caller 65 // Caller
64 LinkageLocation location_array[] = {RegisterLocation(0)}; 66 LinkageLocation location_array[] = {RegisterLocation(0)};
65 LocationSignature locations1(1, 0, location_array); 67 LocationSignature locations1(1, 0, location_array);
66 CallDescriptor* desc1 = NewStandardCallDescriptor(&locations1); 68 CallDescriptor* desc1 = NewStandardCallDescriptor(&locations1);
67 69
68 // Callee 70 // Callee
69 CallDescriptor* desc2 = NewStandardCallDescriptor(&locations1); 71 CallDescriptor* desc2 = NewStandardCallDescriptor(&locations1);
70 72
71 CommonOperatorBuilder common(zone()); 73 CommonOperatorBuilder common(zone());
72 const Operator* op = common.Call(desc2); 74 const Operator* op = common.Call(desc2);
73 Node* const node = Node::New(zone(), 1, op, 0, nullptr, false); 75 Node* const node = Node::New(zone(), 1, op, 0, nullptr, false);
74 EXPECT_TRUE(desc1->CanTailCall(node)); 76 int stack_param_delta = 0;
77 EXPECT_TRUE(desc1->CanTailCall(node, &stack_param_delta));
78 EXPECT_EQ(0, stack_param_delta);
75 } 79 }
76 80
77 81
78 TEST_F(LinkageTailCall, DifferingReturn) { 82 TEST_F(LinkageTailCall, DifferingReturn) {
79 // Caller 83 // Caller
80 LinkageLocation location_array1[] = {RegisterLocation(0)}; 84 LinkageLocation location_array1[] = {RegisterLocation(0)};
81 LocationSignature locations1(1, 0, location_array1); 85 LocationSignature locations1(1, 0, location_array1);
82 CallDescriptor* desc1 = NewStandardCallDescriptor(&locations1); 86 CallDescriptor* desc1 = NewStandardCallDescriptor(&locations1);
83 87
84 // Callee 88 // Callee
85 LinkageLocation location_array2[] = {RegisterLocation(1)}; 89 LinkageLocation location_array2[] = {RegisterLocation(1)};
86 LocationSignature locations2(1, 0, location_array2); 90 LocationSignature locations2(1, 0, location_array2);
87 CallDescriptor* desc2 = NewStandardCallDescriptor(&locations2); 91 CallDescriptor* desc2 = NewStandardCallDescriptor(&locations2);
88 92
89 CommonOperatorBuilder common(zone()); 93 CommonOperatorBuilder common(zone());
90 const Operator* op = common.Call(desc2); 94 const Operator* op = common.Call(desc2);
91 Node* const node = Node::New(zone(), 1, op, 0, nullptr, false); 95 Node* const node = Node::New(zone(), 1, op, 0, nullptr, false);
92 EXPECT_FALSE(desc1->CanTailCall(node)); 96 int stack_param_delta = 0;
97 EXPECT_FALSE(desc1->CanTailCall(node, &stack_param_delta));
98 EXPECT_EQ(0, stack_param_delta);
93 } 99 }
94 100
95 101
96 TEST_F(LinkageTailCall, MoreRegisterParametersCallee) { 102 TEST_F(LinkageTailCall, MoreRegisterParametersCallee) {
97 // Caller 103 // Caller
98 LinkageLocation location_array1[] = {RegisterLocation(0)}; 104 LinkageLocation location_array1[] = {RegisterLocation(0)};
99 LocationSignature locations1(1, 0, location_array1); 105 LocationSignature locations1(1, 0, location_array1);
100 CallDescriptor* desc1 = NewStandardCallDescriptor(&locations1); 106 CallDescriptor* desc1 = NewStandardCallDescriptor(&locations1);
101 107
102 // Callee 108 // Callee
103 LinkageLocation location_array2[] = {RegisterLocation(0), 109 LinkageLocation location_array2[] = {RegisterLocation(0),
104 RegisterLocation(0)}; 110 RegisterLocation(0)};
105 LocationSignature locations2(1, 1, location_array2); 111 LocationSignature locations2(1, 1, location_array2);
106 CallDescriptor* desc2 = NewStandardCallDescriptor(&locations2); 112 CallDescriptor* desc2 = NewStandardCallDescriptor(&locations2);
107 113
108 CommonOperatorBuilder common(zone()); 114 CommonOperatorBuilder common(zone());
109 const Operator* op = common.Call(desc2); 115 const Operator* op = common.Call(desc2);
110 Node* const node = Node::New(zone(), 1, op, 0, nullptr, false); 116 Node* const node = Node::New(zone(), 1, op, 0, nullptr, false);
111 EXPECT_TRUE(desc1->CanTailCall(node)); 117 int stack_param_delta = 0;
118 EXPECT_TRUE(desc1->CanTailCall(node, &stack_param_delta));
119 EXPECT_EQ(0, stack_param_delta);
112 } 120 }
113 121
114 122
115 TEST_F(LinkageTailCall, MoreRegisterParametersCaller) { 123 TEST_F(LinkageTailCall, MoreRegisterParametersCaller) {
116 // Caller 124 // Caller
117 LinkageLocation location_array1[] = {RegisterLocation(0), 125 LinkageLocation location_array1[] = {RegisterLocation(0),
118 RegisterLocation(0)}; 126 RegisterLocation(0)};
119 LocationSignature locations1(1, 1, location_array1); 127 LocationSignature locations1(1, 1, location_array1);
120 CallDescriptor* desc1 = NewStandardCallDescriptor(&locations1); 128 CallDescriptor* desc1 = NewStandardCallDescriptor(&locations1);
121 129
122 // Callee 130 // Callee
123 LinkageLocation location_array2[] = {RegisterLocation(0)}; 131 LinkageLocation location_array2[] = {RegisterLocation(0)};
124 LocationSignature locations2(1, 0, location_array2); 132 LocationSignature locations2(1, 0, location_array2);
125 CallDescriptor* desc2 = NewStandardCallDescriptor(&locations2); 133 CallDescriptor* desc2 = NewStandardCallDescriptor(&locations2);
126 134
127 CommonOperatorBuilder common(zone()); 135 CommonOperatorBuilder common(zone());
128 const Operator* op = common.Call(desc2); 136 const Operator* op = common.Call(desc2);
129 Node* const node = Node::New(zone(), 1, op, 0, nullptr, false); 137 Node* const node = Node::New(zone(), 1, op, 0, nullptr, false);
130 EXPECT_TRUE(desc1->CanTailCall(node)); 138 int stack_param_delta = 0;
139 EXPECT_TRUE(desc1->CanTailCall(node, &stack_param_delta));
140 EXPECT_EQ(0, stack_param_delta);
131 } 141 }
132 142
133 143
134 TEST_F(LinkageTailCall, MoreRegisterAndStackParametersCallee) { 144 TEST_F(LinkageTailCall, MoreRegisterAndStackParametersCallee) {
135 // Caller 145 // Caller
136 LinkageLocation location_array1[] = {RegisterLocation(0)}; 146 LinkageLocation location_array1[] = {RegisterLocation(0)};
137 LocationSignature locations1(1, 0, location_array1); 147 LocationSignature locations1(1, 0, location_array1);
138 CallDescriptor* desc1 = NewStandardCallDescriptor(&locations1); 148 CallDescriptor* desc1 = NewStandardCallDescriptor(&locations1);
139 149
140 // Callee 150 // Callee
141 LinkageLocation location_array2[] = {RegisterLocation(0), RegisterLocation(0), 151 LinkageLocation location_array2[] = {RegisterLocation(0), RegisterLocation(0),
142 RegisterLocation(1), StackLocation(1)}; 152 RegisterLocation(1), StackLocation(1)};
143 LocationSignature locations2(1, 3, location_array2); 153 LocationSignature locations2(1, 3, location_array2);
144 CallDescriptor* desc2 = NewStandardCallDescriptor(&locations2); 154 CallDescriptor* desc2 = NewStandardCallDescriptor(&locations2);
145 155
146 CommonOperatorBuilder common(zone()); 156 CommonOperatorBuilder common(zone());
147 const Operator* op = common.Call(desc2); 157 const Operator* op = common.Call(desc2);
148 Node* const node = Node::New(zone(), 1, op, 0, nullptr, false); 158 Node* const node = Node::New(zone(), 1, op, 0, nullptr, false);
149 EXPECT_FALSE(desc1->CanTailCall(node)); 159 int stack_param_delta = 0;
160 EXPECT_FALSE(desc1->CanTailCall(node, &stack_param_delta));
161 EXPECT_EQ(1, stack_param_delta);
150 } 162 }
151 163
152 164
153 TEST_F(LinkageTailCall, MoreRegisterAndStackParametersCaller) { 165 TEST_F(LinkageTailCall, MoreRegisterAndStackParametersCaller) {
154 // Caller 166 // Caller
155 LinkageLocation location_array[] = {RegisterLocation(0), RegisterLocation(0), 167 LinkageLocation location_array[] = {RegisterLocation(0), RegisterLocation(0),
156 RegisterLocation(1), StackLocation(1)}; 168 RegisterLocation(1), StackLocation(1)};
157 LocationSignature locations1(1, 3, location_array); 169 LocationSignature locations1(1, 3, location_array);
158 CallDescriptor* desc1 = NewStandardCallDescriptor(&locations1); 170 CallDescriptor* desc1 = NewStandardCallDescriptor(&locations1);
159 171
160 // Callee 172 // Callee
161 LinkageLocation location_array2[] = {RegisterLocation(0)}; 173 LinkageLocation location_array2[] = {RegisterLocation(0)};
162 LocationSignature locations2(1, 0, location_array2); 174 LocationSignature locations2(1, 0, location_array2);
163 CallDescriptor* desc2 = NewStandardCallDescriptor(&locations2); 175 CallDescriptor* desc2 = NewStandardCallDescriptor(&locations2);
164 176
165 CommonOperatorBuilder common(zone()); 177 CommonOperatorBuilder common(zone());
166 const Operator* op = common.Call(desc2); 178 const Operator* op = common.Call(desc2);
167 Node* const node = Node::New(zone(), 1, op, 0, nullptr, false); 179 Node* const node = Node::New(zone(), 1, op, 0, nullptr, false);
168 EXPECT_FALSE(desc1->CanTailCall(node)); 180 int stack_param_delta = 0;
181 EXPECT_TRUE(desc1->CanTailCall(node, &stack_param_delta));
182 EXPECT_EQ(-1, stack_param_delta);
169 } 183 }
170 184
171 185
172 TEST_F(LinkageTailCall, MatchingStackParameters) { 186 TEST_F(LinkageTailCall, MatchingStackParameters) {
173 // Caller 187 // Caller
174 LinkageLocation location_array[] = {RegisterLocation(0), StackLocation(3), 188 LinkageLocation location_array[] = {RegisterLocation(0), StackLocation(3),
175 StackLocation(2), StackLocation(1)}; 189 StackLocation(2), StackLocation(1)};
176 LocationSignature locations1(1, 3, location_array); 190 LocationSignature locations1(1, 3, location_array);
177 CallDescriptor* desc1 = NewStandardCallDescriptor(&locations1); 191 CallDescriptor* desc1 = NewStandardCallDescriptor(&locations1);
178 192
179 // Caller 193 // Caller
180 LocationSignature locations2(1, 3, location_array); 194 LocationSignature locations2(1, 3, location_array);
181 CallDescriptor* desc2 = NewStandardCallDescriptor(&locations1); 195 CallDescriptor* desc2 = NewStandardCallDescriptor(&locations1);
182 196
183 CommonOperatorBuilder common(zone()); 197 CommonOperatorBuilder common(zone());
184 Node* p0 = Node::New(zone(), 0, nullptr, 0, nullptr, false); 198 Node* p0 = Node::New(zone(), 0, nullptr, 0, nullptr, false);
185 Node* p1 = Node::New(zone(), 0, common.Parameter(0), 0, nullptr, false); 199 Node* p1 = Node::New(zone(), 0, common.Parameter(0), 0, nullptr, false);
186 Node* p2 = Node::New(zone(), 0, common.Parameter(1), 0, nullptr, false); 200 Node* p2 = Node::New(zone(), 0, common.Parameter(1), 0, nullptr, false);
187 Node* p3 = Node::New(zone(), 0, common.Parameter(2), 0, nullptr, false); 201 Node* p3 = Node::New(zone(), 0, common.Parameter(2), 0, nullptr, false);
188 Node* parameters[] = {p0, p1, p2, p3}; 202 Node* parameters[] = {p0, p1, p2, p3};
189 const Operator* op = common.Call(desc2); 203 const Operator* op = common.Call(desc2);
190 Node* const node = 204 Node* const node =
191 Node::New(zone(), 1, op, arraysize(parameters), parameters, false); 205 Node::New(zone(), 1, op, arraysize(parameters), parameters, false);
192 EXPECT_TRUE(desc1->CanTailCall(node)); 206 int stack_param_delta = 0;
207 EXPECT_TRUE(desc1->CanTailCall(node, &stack_param_delta));
208 EXPECT_EQ(0, stack_param_delta);
193 } 209 }
194 210
195 211
196 TEST_F(LinkageTailCall, NonMatchingStackParameters) { 212 TEST_F(LinkageTailCall, NonMatchingStackParameters) {
197 // Caller 213 // Caller
198 LinkageLocation location_array[] = {RegisterLocation(0), StackLocation(3), 214 LinkageLocation location_array[] = {RegisterLocation(0), StackLocation(3),
199 StackLocation(2), StackLocation(1)}; 215 StackLocation(2), StackLocation(1)};
200 LocationSignature locations1(1, 3, location_array); 216 LocationSignature locations1(1, 3, location_array);
201 CallDescriptor* desc1 = NewStandardCallDescriptor(&locations1); 217 CallDescriptor* desc1 = NewStandardCallDescriptor(&locations1);
202 218
203 // Caller 219 // Caller
204 LocationSignature locations2(1, 3, location_array); 220 LocationSignature locations2(1, 3, location_array);
205 CallDescriptor* desc2 = NewStandardCallDescriptor(&locations1); 221 CallDescriptor* desc2 = NewStandardCallDescriptor(&locations1);
206 222
207 CommonOperatorBuilder common(zone()); 223 CommonOperatorBuilder common(zone());
208 Node* p0 = Node::New(zone(), 0, nullptr, 0, nullptr, false); 224 Node* p0 = Node::New(zone(), 0, nullptr, 0, nullptr, false);
209 Node* p1 = Node::New(zone(), 0, common.Parameter(0), 0, nullptr, false); 225 Node* p1 = Node::New(zone(), 0, common.Parameter(0), 0, nullptr, false);
210 Node* p2 = Node::New(zone(), 0, common.Parameter(2), 0, nullptr, false); 226 Node* p2 = Node::New(zone(), 0, common.Parameter(2), 0, nullptr, false);
211 Node* p3 = Node::New(zone(), 0, common.Parameter(1), 0, nullptr, false); 227 Node* p3 = Node::New(zone(), 0, common.Parameter(1), 0, nullptr, false);
212 Node* parameters[] = {p0, p1, p2, p3}; 228 Node* parameters[] = {p0, p1, p2, p3};
213 const Operator* op = common.Call(desc2); 229 const Operator* op = common.Call(desc2);
214 Node* const node = 230 Node* const node =
215 Node::New(zone(), 1, op, arraysize(parameters), parameters, false); 231 Node::New(zone(), 1, op, arraysize(parameters), parameters, false);
216 EXPECT_FALSE(desc1->CanTailCall(node)); 232 int stack_param_delta = 0;
233 EXPECT_TRUE(desc1->CanTailCall(node, &stack_param_delta));
234 EXPECT_EQ(0, stack_param_delta);
217 } 235 }
218 236
219 237
220 TEST_F(LinkageTailCall, MatchingStackParametersExtraCallerRegisters) { 238 TEST_F(LinkageTailCall, MatchingStackParametersExtraCallerRegisters) {
221 // Caller 239 // Caller
222 LinkageLocation location_array[] = {RegisterLocation(0), StackLocation(3), 240 LinkageLocation location_array[] = {RegisterLocation(0), StackLocation(3),
223 StackLocation(2), StackLocation(1), 241 StackLocation(2), StackLocation(1),
224 RegisterLocation(0), RegisterLocation(1)}; 242 RegisterLocation(0), RegisterLocation(1)};
225 LocationSignature locations1(1, 5, location_array); 243 LocationSignature locations1(1, 5, location_array);
226 CallDescriptor* desc1 = NewStandardCallDescriptor(&locations1); 244 CallDescriptor* desc1 = NewStandardCallDescriptor(&locations1);
227 245
228 // Caller 246 // Caller
229 LocationSignature locations2(1, 3, location_array); 247 LocationSignature locations2(1, 3, location_array);
230 CallDescriptor* desc2 = NewStandardCallDescriptor(&locations1); 248 CallDescriptor* desc2 = NewStandardCallDescriptor(&locations1);
231 249
232 CommonOperatorBuilder common(zone()); 250 CommonOperatorBuilder common(zone());
233 Node* p0 = Node::New(zone(), 0, nullptr, 0, nullptr, false); 251 Node* p0 = Node::New(zone(), 0, nullptr, 0, nullptr, false);
234 Node* p1 = Node::New(zone(), 0, common.Parameter(0), 0, nullptr, false); 252 Node* p1 = Node::New(zone(), 0, common.Parameter(0), 0, nullptr, false);
235 Node* p2 = Node::New(zone(), 0, common.Parameter(1), 0, nullptr, false); 253 Node* p2 = Node::New(zone(), 0, common.Parameter(1), 0, nullptr, false);
236 Node* p3 = Node::New(zone(), 0, common.Parameter(2), 0, nullptr, false); 254 Node* p3 = Node::New(zone(), 0, common.Parameter(2), 0, nullptr, false);
237 Node* parameters[] = {p0, p1, p2, p3}; 255 Node* parameters[] = {p0, p1, p2, p3};
238 const Operator* op = common.Call(desc2); 256 const Operator* op = common.Call(desc2);
239 Node* const node = 257 Node* const node =
240 Node::New(zone(), 1, op, arraysize(parameters), parameters, false); 258 Node::New(zone(), 1, op, arraysize(parameters), parameters, false);
241 EXPECT_TRUE(desc1->CanTailCall(node)); 259 int stack_param_delta = 0;
260 EXPECT_TRUE(desc1->CanTailCall(node, &stack_param_delta));
261 EXPECT_EQ(0, stack_param_delta);
242 } 262 }
243 263
244 264
245 TEST_F(LinkageTailCall, MatchingStackParametersExtraCalleeRegisters) { 265 TEST_F(LinkageTailCall, MatchingStackParametersExtraCalleeRegisters) {
246 // Caller 266 // Caller
247 LinkageLocation location_array[] = {RegisterLocation(0), StackLocation(3), 267 LinkageLocation location_array[] = {RegisterLocation(0), StackLocation(3),
248 StackLocation(2), StackLocation(1), 268 StackLocation(2), StackLocation(1),
249 RegisterLocation(0), RegisterLocation(1)}; 269 RegisterLocation(0), RegisterLocation(1)};
250 LocationSignature locations1(1, 3, location_array); 270 LocationSignature locations1(1, 3, location_array);
251 CallDescriptor* desc1 = NewStandardCallDescriptor(&locations1); 271 CallDescriptor* desc1 = NewStandardCallDescriptor(&locations1);
252 272
253 // Caller 273 // Caller
254 LocationSignature locations2(1, 5, location_array); 274 LocationSignature locations2(1, 5, location_array);
255 CallDescriptor* desc2 = NewStandardCallDescriptor(&locations1); 275 CallDescriptor* desc2 = NewStandardCallDescriptor(&locations1);
256 276
257 CommonOperatorBuilder common(zone()); 277 CommonOperatorBuilder common(zone());
258 Node* p0 = Node::New(zone(), 0, nullptr, 0, nullptr, false); 278 Node* p0 = Node::New(zone(), 0, nullptr, 0, nullptr, false);
259 Node* p1 = Node::New(zone(), 0, common.Parameter(0), 0, nullptr, false); 279 Node* p1 = Node::New(zone(), 0, common.Parameter(0), 0, nullptr, false);
260 Node* p2 = Node::New(zone(), 0, common.Parameter(1), 0, nullptr, false); 280 Node* p2 = Node::New(zone(), 0, common.Parameter(1), 0, nullptr, false);
261 Node* p3 = Node::New(zone(), 0, common.Parameter(2), 0, nullptr, false); 281 Node* p3 = Node::New(zone(), 0, common.Parameter(2), 0, nullptr, false);
262 Node* p4 = Node::New(zone(), 0, common.Parameter(3), 0, nullptr, false); 282 Node* p4 = Node::New(zone(), 0, common.Parameter(3), 0, nullptr, false);
263 Node* parameters[] = {p0, p1, p2, p3, p4}; 283 Node* parameters[] = {p0, p1, p2, p3, p4};
264 const Operator* op = common.Call(desc2); 284 const Operator* op = common.Call(desc2);
265 Node* const node = 285 Node* const node =
266 Node::New(zone(), 1, op, arraysize(parameters), parameters, false); 286 Node::New(zone(), 1, op, arraysize(parameters), parameters, false);
267 EXPECT_TRUE(desc1->CanTailCall(node)); 287 int stack_param_delta = 0;
288 EXPECT_TRUE(desc1->CanTailCall(node, &stack_param_delta));
289 EXPECT_EQ(0, stack_param_delta);
268 } 290 }
269 291
270 292
271 TEST_F(LinkageTailCall, MatchingStackParametersExtraCallerRegistersAndStack) { 293 TEST_F(LinkageTailCall, MatchingStackParametersExtraCallerRegistersAndStack) {
272 // Caller 294 // Caller
273 LinkageLocation location_array[] = {RegisterLocation(0), StackLocation(3), 295 LinkageLocation location_array[] = {RegisterLocation(0), StackLocation(3),
274 StackLocation(2), StackLocation(1), 296 StackLocation(2), StackLocation(1),
275 RegisterLocation(0), StackLocation(4)}; 297 RegisterLocation(0), StackLocation(4)};
276 LocationSignature locations1(1, 5, location_array); 298 LocationSignature locations1(1, 5, location_array);
277 CallDescriptor* desc1 = NewStandardCallDescriptor(&locations1); 299 CallDescriptor* desc1 = NewStandardCallDescriptor(&locations1);
278 300
279 // Caller 301 // Caller
280 LocationSignature locations2(1, 3, location_array); 302 LocationSignature locations2(1, 3, location_array);
281 CallDescriptor* desc2 = NewStandardCallDescriptor(&locations2); 303 CallDescriptor* desc2 = NewStandardCallDescriptor(&locations2);
282 304
283 CommonOperatorBuilder common(zone()); 305 CommonOperatorBuilder common(zone());
284 Node* p0 = Node::New(zone(), 0, nullptr, 0, nullptr, false); 306 Node* p0 = Node::New(zone(), 0, nullptr, 0, nullptr, false);
285 Node* p1 = Node::New(zone(), 0, common.Parameter(0), 0, nullptr, false); 307 Node* p1 = Node::New(zone(), 0, common.Parameter(0), 0, nullptr, false);
286 Node* p2 = Node::New(zone(), 0, common.Parameter(1), 0, nullptr, false); 308 Node* p2 = Node::New(zone(), 0, common.Parameter(1), 0, nullptr, false);
287 Node* p3 = Node::New(zone(), 0, common.Parameter(2), 0, nullptr, false); 309 Node* p3 = Node::New(zone(), 0, common.Parameter(2), 0, nullptr, false);
288 Node* p4 = Node::New(zone(), 0, common.Parameter(3), 0, nullptr, false); 310 Node* p4 = Node::New(zone(), 0, common.Parameter(3), 0, nullptr, false);
289 Node* parameters[] = {p0, p1, p2, p3, p4}; 311 Node* parameters[] = {p0, p1, p2, p3, p4};
290 const Operator* op = common.Call(desc2); 312 const Operator* op = common.Call(desc2);
291 Node* const node = 313 Node* const node =
292 Node::New(zone(), 1, op, arraysize(parameters), parameters, false); 314 Node::New(zone(), 1, op, arraysize(parameters), parameters, false);
293 EXPECT_FALSE(desc1->CanTailCall(node)); 315 int stack_param_delta = 0;
316 EXPECT_TRUE(desc1->CanTailCall(node, &stack_param_delta));
317 EXPECT_EQ(-1, stack_param_delta);
294 } 318 }
295 319
296 320
297 TEST_F(LinkageTailCall, MatchingStackParametersExtraCalleeRegistersAndStack) { 321 TEST_F(LinkageTailCall, MatchingStackParametersExtraCalleeRegistersAndStack) {
298 // Caller 322 // Caller
299 LinkageLocation location_array[] = {RegisterLocation(0), StackLocation(3), 323 LinkageLocation location_array[] = {RegisterLocation(0), StackLocation(3),
300 StackLocation(2), RegisterLocation(0), 324 StackLocation(2), RegisterLocation(0),
301 RegisterLocation(1), StackLocation(4)}; 325 RegisterLocation(1), StackLocation(4)};
302 LocationSignature locations1(1, 3, location_array); 326 LocationSignature locations1(1, 3, location_array);
303 CallDescriptor* desc1 = NewStandardCallDescriptor(&locations1); 327 CallDescriptor* desc1 = NewStandardCallDescriptor(&locations1);
304 328
305 // Caller 329 // Caller
306 LocationSignature locations2(1, 5, location_array); 330 LocationSignature locations2(1, 5, location_array);
307 CallDescriptor* desc2 = NewStandardCallDescriptor(&locations2); 331 CallDescriptor* desc2 = NewStandardCallDescriptor(&locations2);
308 332
309 CommonOperatorBuilder common(zone()); 333 CommonOperatorBuilder common(zone());
310 Node* p0 = Node::New(zone(), 0, nullptr, 0, nullptr, false); 334 Node* p0 = Node::New(zone(), 0, nullptr, 0, nullptr, false);
311 Node* p1 = Node::New(zone(), 0, common.Parameter(0), 0, nullptr, false); 335 Node* p1 = Node::New(zone(), 0, common.Parameter(0), 0, nullptr, false);
312 Node* p2 = Node::New(zone(), 0, common.Parameter(1), 0, nullptr, false); 336 Node* p2 = Node::New(zone(), 0, common.Parameter(1), 0, nullptr, false);
313 Node* p3 = Node::New(zone(), 0, common.Parameter(2), 0, nullptr, false); 337 Node* p3 = Node::New(zone(), 0, common.Parameter(2), 0, nullptr, false);
314 Node* p4 = Node::New(zone(), 0, common.Parameter(3), 0, nullptr, false); 338 Node* p4 = Node::New(zone(), 0, common.Parameter(3), 0, nullptr, false);
315 Node* parameters[] = {p0, p1, p2, p3, p4}; 339 Node* parameters[] = {p0, p1, p2, p3, p4};
316 const Operator* op = common.Call(desc2); 340 const Operator* op = common.Call(desc2);
317 Node* const node = 341 Node* const node =
318 Node::New(zone(), 1, op, arraysize(parameters), parameters, false); 342 Node::New(zone(), 1, op, arraysize(parameters), parameters, false);
319 EXPECT_FALSE(desc1->CanTailCall(node)); 343 int stack_param_delta = 0;
344 EXPECT_FALSE(desc1->CanTailCall(node, &stack_param_delta));
345 EXPECT_EQ(1, stack_param_delta);
320 } 346 }
321 347
322 } // namespace compiler 348 } // namespace compiler
323 } // namespace internal 349 } // namespace internal
324 } // namespace v8 350 } // namespace v8
OLDNEW
« no previous file with comments | « test/mjsunit/tail-call-intrinsic.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698