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

Side by Side Diff: test/unittests/compiler/loop-peeling-unittest.cc

Issue 1513543003: [turbofan] Make MachineType a pair of enums. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Moar rebase Created 5 years 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
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 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/access-builder.h" 5 #include "src/compiler/access-builder.h"
6 #include "src/compiler/graph.h" 6 #include "src/compiler/graph.h"
7 #include "src/compiler/graph-visualizer.h" 7 #include "src/compiler/graph-visualizer.h"
8 #include "src/compiler/js-graph.h" 8 #include "src/compiler/js-graph.h"
9 #include "src/compiler/loop-peeling.h" 9 #include "src/compiler/loop-peeling.h"
10 #include "src/compiler/machine-operator.h" 10 #include "src/compiler/machine-operator.h"
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 loop->ReplaceInput(1, if_true); 112 loop->ReplaceInput(1, if_true);
113 return {loop, branch, if_true, exit}; 113 return {loop, branch, if_true, exit};
114 } 114 }
115 115
116 void Chain(While* a, Node* control) { a->loop->ReplaceInput(0, control); } 116 void Chain(While* a, Node* control) { a->loop->ReplaceInput(0, control); }
117 void Nest(While* a, While* b) { 117 void Nest(While* a, While* b) {
118 b->loop->ReplaceInput(1, a->exit); 118 b->loop->ReplaceInput(1, a->exit);
119 a->loop->ReplaceInput(0, b->if_true); 119 a->loop->ReplaceInput(0, b->if_true);
120 } 120 }
121 Node* NewPhi(While* w, Node* a, Node* b) { 121 Node* NewPhi(While* w, Node* a, Node* b) {
122 return graph()->NewNode(common()->Phi(kMachAnyTagged, 2), a, b, w->loop); 122 return graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2), a,
123 b, w->loop);
123 } 124 }
124 125
125 Branch NewBranch(Node* cond, Node* control = nullptr) { 126 Branch NewBranch(Node* cond, Node* control = nullptr) {
126 if (control == nullptr) control = start(); 127 if (control == nullptr) control = start();
127 Node* branch = graph()->NewNode(common()->Branch(), cond, control); 128 Node* branch = graph()->NewNode(common()->Branch(), cond, control);
128 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); 129 Node* if_true = graph()->NewNode(common()->IfTrue(), branch);
129 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); 130 Node* if_false = graph()->NewNode(common()->IfFalse(), branch);
130 return {branch, if_true, if_false}; 131 return {branch, if_true, if_false};
131 } 132 }
132 133
133 Counter NewCounter(While* w, int32_t b, int32_t k) { 134 Counter NewCounter(While* w, int32_t b, int32_t k) {
134 Node* base = Int32Constant(b); 135 Node* base = Int32Constant(b);
135 Node* inc = Int32Constant(k); 136 Node* inc = Int32Constant(k);
136 Node* phi = 137 Node* phi = graph()->NewNode(
137 graph()->NewNode(common()->Phi(kMachAnyTagged, 2), base, base, w->loop); 138 common()->Phi(MachineRepresentation::kTagged, 2), base, base, w->loop);
138 Node* add = graph()->NewNode(machine()->Int32Add(), phi, inc); 139 Node* add = graph()->NewNode(machine()->Int32Add(), phi, inc);
139 phi->ReplaceInput(1, add); 140 phi->ReplaceInput(1, add);
140 return {base, inc, phi, add}; 141 return {base, inc, phi, add};
141 } 142 }
142 }; 143 };
143 144
144 145
145 TEST_F(LoopPeelingTest, SimpleLoop) { 146 TEST_F(LoopPeelingTest, SimpleLoop) {
146 Node* p0 = Parameter(0); 147 Node* p0 = Parameter(0);
147 While w = NewWhile(p0); 148 While w = NewWhile(p0);
(...skipping 28 matching lines...) Expand all
176 177
177 EXPECT_THAT(br1, IsBranch(p0, start())); 178 EXPECT_THAT(br1, IsBranch(p0, start()));
178 EXPECT_THAT(if_true1, IsIfTrue(br1)); 179 EXPECT_THAT(if_true1, IsIfTrue(br1));
179 EXPECT_THAT(if_false1, IsIfFalse(br1)); 180 EXPECT_THAT(if_false1, IsIfFalse(br1));
180 EXPECT_THAT(w.loop, IsLoop(if_true1, w.if_true)); 181 EXPECT_THAT(w.loop, IsLoop(if_true1, w.if_true));
181 182
182 EXPECT_THAT(peeled->map(c.add), IsInt32Add(c.base, c.inc)); 183 EXPECT_THAT(peeled->map(c.add), IsInt32Add(c.base, c.inc));
183 184
184 Capture<Node*> merge; 185 Capture<Node*> merge;
185 EXPECT_THAT( 186 EXPECT_THAT(
186 r, IsReturn(IsPhi(kMachAnyTagged, c.phi, c.base, 187 r, IsReturn(IsPhi(MachineRepresentation::kTagged, c.phi, c.base,
187 AllOf(CaptureEq(&merge), IsMerge(w.exit, if_false1))), 188 AllOf(CaptureEq(&merge), IsMerge(w.exit, if_false1))),
188 start(), CaptureEq(&merge))); 189 start(), CaptureEq(&merge)));
189 } 190 }
190 191
191 192
192 TEST_F(LoopPeelingTest, SimpleNestedLoopWithCounter_peel_outer) { 193 TEST_F(LoopPeelingTest, SimpleNestedLoopWithCounter_peel_outer) {
193 Node* p0 = Parameter(0); 194 Node* p0 = Parameter(0);
194 While outer = NewWhile(p0); 195 While outer = NewWhile(p0);
195 While inner = NewWhile(p0); 196 While inner = NewWhile(p0);
196 Nest(&inner, &outer); 197 Nest(&inner, &outer);
(...skipping 18 matching lines...) Expand all
215 EXPECT_THAT(bri, IsBranch(p0, ExpectPeeled(inner.loop, peeled))); 216 EXPECT_THAT(bri, IsBranch(p0, ExpectPeeled(inner.loop, peeled)));
216 EXPECT_THAT(if_truei, IsIfTrue(bri)); 217 EXPECT_THAT(if_truei, IsIfTrue(bri));
217 EXPECT_THAT(if_falsei, IsIfFalse(bri)); 218 EXPECT_THAT(if_falsei, IsIfFalse(bri));
218 219
219 EXPECT_THAT(outer.loop, IsLoop(if_falsei, inner.exit)); 220 EXPECT_THAT(outer.loop, IsLoop(if_falsei, inner.exit));
220 EXPECT_THAT(peeled->map(c.add), IsInt32Add(c.base, c.inc)); 221 EXPECT_THAT(peeled->map(c.add), IsInt32Add(c.base, c.inc));
221 222
222 Capture<Node*> merge; 223 Capture<Node*> merge;
223 EXPECT_THAT( 224 EXPECT_THAT(
224 r, 225 r,
225 IsReturn(IsPhi(kMachAnyTagged, c.phi, c.base, 226 IsReturn(IsPhi(MachineRepresentation::kTagged, c.phi, c.base,
226 AllOf(CaptureEq(&merge), IsMerge(outer.exit, if_falseo))), 227 AllOf(CaptureEq(&merge), IsMerge(outer.exit, if_falseo))),
227 start(), CaptureEq(&merge))); 228 start(), CaptureEq(&merge)));
228 } 229 }
229 230
230 231
231 TEST_F(LoopPeelingTest, SimpleNestedLoopWithCounter_peel_inner) { 232 TEST_F(LoopPeelingTest, SimpleNestedLoopWithCounter_peel_inner) {
232 Node* p0 = Parameter(0); 233 Node* p0 = Parameter(0);
233 While outer = NewWhile(p0); 234 While outer = NewWhile(p0);
234 While inner = NewWhile(p0); 235 While inner = NewWhile(p0);
235 Nest(&inner, &outer); 236 Nest(&inner, &outer);
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
291 Node* if_falsei = ExpectPeeled(inner.exit, peeled); 292 Node* if_falsei = ExpectPeeled(inner.exit, peeled);
292 293
293 EXPECT_THAT(bri, IsBranch(p0, ExpectPeeled(inner.loop, peeled))); 294 EXPECT_THAT(bri, IsBranch(p0, ExpectPeeled(inner.loop, peeled)));
294 EXPECT_THAT(if_truei, IsIfTrue(bri)); 295 EXPECT_THAT(if_truei, IsIfTrue(bri));
295 EXPECT_THAT(if_falsei, IsIfFalse(bri)); 296 EXPECT_THAT(if_falsei, IsIfFalse(bri));
296 297
297 EXPECT_THAT(outer.loop, IsLoop(start(), IsMerge(inner.exit, if_falsei))); 298 EXPECT_THAT(outer.loop, IsLoop(start(), IsMerge(inner.exit, if_falsei)));
298 EXPECT_THAT(peeled->map(c.add), IsInt32Add(c.base, c.inc)); 299 EXPECT_THAT(peeled->map(c.add), IsInt32Add(c.base, c.inc));
299 300
300 Node* back = phi->InputAt(1); 301 Node* back = phi->InputAt(1);
301 EXPECT_THAT(back, IsPhi(kMachAnyTagged, c.phi, c.base, 302 EXPECT_THAT(back, IsPhi(MachineRepresentation::kTagged, c.phi, c.base,
302 IsMerge(inner.exit, if_falsei))); 303 IsMerge(inner.exit, if_falsei)));
303 304
304 EXPECT_THAT(phi, 305 EXPECT_THAT(phi, IsPhi(MachineRepresentation::kTagged, IsInt32Constant(11),
305 IsPhi(kMachAnyTagged, IsInt32Constant(11), back, outer.loop)); 306 back, outer.loop));
306 307
307 EXPECT_THAT(r, IsReturn(phi, start(), outer.exit)); 308 EXPECT_THAT(r, IsReturn(phi, start(), outer.exit));
308 } 309 }
309 310
310 311
311 TEST_F(LoopPeelingTest, TwoBackedgeLoop) { 312 TEST_F(LoopPeelingTest, TwoBackedgeLoop) {
312 Node* p0 = Parameter(0); 313 Node* p0 = Parameter(0);
313 Node* loop = graph()->NewNode(common()->Loop(3), start(), start(), start()); 314 Node* loop = graph()->NewNode(common()->Loop(3), start(), start(), start());
314 Branch b1 = NewBranch(p0, loop); 315 Branch b1 = NewBranch(p0, loop);
315 Branch b2 = NewBranch(p0, b1.if_true); 316 Branch b2 = NewBranch(p0, b1.if_true);
(...skipping 24 matching lines...) Expand all
340 EXPECT_THAT(loop, IsLoop(IsMerge(b2t, b2f), b2.if_true, b2.if_false)); 341 EXPECT_THAT(loop, IsLoop(IsMerge(b2t, b2f), b2.if_true, b2.if_false));
341 EXPECT_THAT(r, IsReturn(p0, start(), IsMerge(b1.if_false, b1f))); 342 EXPECT_THAT(r, IsReturn(p0, start(), IsMerge(b1.if_false, b1f)));
342 } 343 }
343 344
344 345
345 TEST_F(LoopPeelingTest, TwoBackedgeLoopWithPhi) { 346 TEST_F(LoopPeelingTest, TwoBackedgeLoopWithPhi) {
346 Node* p0 = Parameter(0); 347 Node* p0 = Parameter(0);
347 Node* loop = graph()->NewNode(common()->Loop(3), start(), start(), start()); 348 Node* loop = graph()->NewNode(common()->Loop(3), start(), start(), start());
348 Branch b1 = NewBranch(p0, loop); 349 Branch b1 = NewBranch(p0, loop);
349 Branch b2 = NewBranch(p0, b1.if_true); 350 Branch b2 = NewBranch(p0, b1.if_true);
350 Node* phi = 351 Node* phi = graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 3),
351 graph()->NewNode(common()->Phi(kMachAnyTagged, 3), Int32Constant(0), 352 Int32Constant(0), Int32Constant(1),
352 Int32Constant(1), Int32Constant(2), loop); 353 Int32Constant(2), loop);
353 354
354 loop->ReplaceInput(1, b2.if_true); 355 loop->ReplaceInput(1, b2.if_true);
355 loop->ReplaceInput(2, b2.if_false); 356 loop->ReplaceInput(2, b2.if_false);
356 357
357 Node* r = InsertReturn(phi, start(), b1.if_false); 358 Node* r = InsertReturn(phi, start(), b1.if_false);
358 359
359 PeeledIteration* peeled = PeelOne(); 360 PeeledIteration* peeled = PeelOne();
360 361
361 Node* b1b = ExpectPeeled(b1.branch, peeled); 362 Node* b1b = ExpectPeeled(b1.branch, peeled);
362 Node* b1t = ExpectPeeled(b1.if_true, peeled); 363 Node* b1t = ExpectPeeled(b1.if_true, peeled);
363 Node* b1f = ExpectPeeled(b1.if_false, peeled); 364 Node* b1f = ExpectPeeled(b1.if_false, peeled);
364 365
365 EXPECT_THAT(b1b, IsBranch(p0, start())); 366 EXPECT_THAT(b1b, IsBranch(p0, start()));
366 EXPECT_THAT(ExpectPeeled(b1.if_true, peeled), IsIfTrue(b1b)); 367 EXPECT_THAT(ExpectPeeled(b1.if_true, peeled), IsIfTrue(b1b));
367 EXPECT_THAT(b1f, IsIfFalse(b1b)); 368 EXPECT_THAT(b1f, IsIfFalse(b1b));
368 369
369 Node* b2b = ExpectPeeled(b2.branch, peeled); 370 Node* b2b = ExpectPeeled(b2.branch, peeled);
370 Node* b2t = ExpectPeeled(b2.if_true, peeled); 371 Node* b2t = ExpectPeeled(b2.if_true, peeled);
371 Node* b2f = ExpectPeeled(b2.if_false, peeled); 372 Node* b2f = ExpectPeeled(b2.if_false, peeled);
372 373
373 EXPECT_THAT(b2b, IsBranch(p0, b1t)); 374 EXPECT_THAT(b2b, IsBranch(p0, b1t));
374 EXPECT_THAT(b2t, IsIfTrue(b2b)); 375 EXPECT_THAT(b2t, IsIfTrue(b2b));
375 EXPECT_THAT(b2f, IsIfFalse(b2b)); 376 EXPECT_THAT(b2f, IsIfFalse(b2b));
376 377
377 EXPECT_THAT(loop, IsLoop(IsMerge(b2t, b2f), b2.if_true, b2.if_false)); 378 EXPECT_THAT(loop, IsLoop(IsMerge(b2t, b2f), b2.if_true, b2.if_false));
378 379
379 EXPECT_THAT( 380 EXPECT_THAT(phi,
380 phi, IsPhi(kMachAnyTagged, IsPhi(kMachAnyTagged, IsInt32Constant(1), 381 IsPhi(MachineRepresentation::kTagged,
381 IsInt32Constant(2), IsMerge(b2t, b2f)), 382 IsPhi(MachineRepresentation::kTagged, IsInt32Constant(1),
382 IsInt32Constant(1), IsInt32Constant(2), loop)); 383 IsInt32Constant(2), IsMerge(b2t, b2f)),
384 IsInt32Constant(1), IsInt32Constant(2), loop));
383 385
384 Capture<Node*> merge; 386 Capture<Node*> merge;
385 EXPECT_THAT( 387 EXPECT_THAT(
386 r, IsReturn(IsPhi(kMachAnyTagged, phi, IsInt32Constant(0), 388 r, IsReturn(IsPhi(MachineRepresentation::kTagged, phi, IsInt32Constant(0),
387 AllOf(CaptureEq(&merge), IsMerge(b1.if_false, b1f))), 389 AllOf(CaptureEq(&merge), IsMerge(b1.if_false, b1f))),
388 start(), CaptureEq(&merge))); 390 start(), CaptureEq(&merge)));
389 } 391 }
390 392
391 393
392 TEST_F(LoopPeelingTest, TwoBackedgeLoopWithCounter) { 394 TEST_F(LoopPeelingTest, TwoBackedgeLoopWithCounter) {
393 Node* p0 = Parameter(0); 395 Node* p0 = Parameter(0);
394 Node* loop = graph()->NewNode(common()->Loop(3), start(), start(), start()); 396 Node* loop = graph()->NewNode(common()->Loop(3), start(), start(), start());
395 Branch b1 = NewBranch(p0, loop); 397 Branch b1 = NewBranch(p0, loop);
396 Branch b2 = NewBranch(p0, b1.if_true); 398 Branch b2 = NewBranch(p0, b1.if_true);
397 Node* phi = 399 Node* phi = graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 3),
398 graph()->NewNode(common()->Phi(kMachAnyTagged, 3), Int32Constant(0), 400 Int32Constant(0), Int32Constant(1),
399 Int32Constant(1), Int32Constant(2), loop); 401 Int32Constant(2), loop);
400 402
401 phi->ReplaceInput( 403 phi->ReplaceInput(
402 1, graph()->NewNode(machine()->Int32Add(), phi, Int32Constant(1))); 404 1, graph()->NewNode(machine()->Int32Add(), phi, Int32Constant(1)));
403 phi->ReplaceInput( 405 phi->ReplaceInput(
404 2, graph()->NewNode(machine()->Int32Add(), phi, Int32Constant(2))); 406 2, graph()->NewNode(machine()->Int32Add(), phi, Int32Constant(2)));
405 407
406 loop->ReplaceInput(1, b2.if_true); 408 loop->ReplaceInput(1, b2.if_true);
407 loop->ReplaceInput(2, b2.if_false); 409 loop->ReplaceInput(2, b2.if_false);
408 410
409 Node* r = InsertReturn(phi, start(), b1.if_false); 411 Node* r = InsertReturn(phi, start(), b1.if_false);
(...skipping 15 matching lines...) Expand all
425 EXPECT_THAT(b2b, IsBranch(p0, b1t)); 427 EXPECT_THAT(b2b, IsBranch(p0, b1t));
426 EXPECT_THAT(b2t, IsIfTrue(b2b)); 428 EXPECT_THAT(b2t, IsIfTrue(b2b));
427 EXPECT_THAT(b2f, IsIfFalse(b2b)); 429 EXPECT_THAT(b2f, IsIfFalse(b2b));
428 430
429 Capture<Node*> entry; 431 Capture<Node*> entry;
430 EXPECT_THAT(loop, IsLoop(AllOf(CaptureEq(&entry), IsMerge(b2t, b2f)), 432 EXPECT_THAT(loop, IsLoop(AllOf(CaptureEq(&entry), IsMerge(b2t, b2f)),
431 b2.if_true, b2.if_false)); 433 b2.if_true, b2.if_false));
432 434
433 Node* eval = phi->InputAt(0); 435 Node* eval = phi->InputAt(0);
434 436
435 EXPECT_THAT(eval, IsPhi(kMachAnyTagged, 437 EXPECT_THAT(eval, IsPhi(MachineRepresentation::kTagged,
436 IsInt32Add(IsInt32Constant(0), IsInt32Constant(1)), 438 IsInt32Add(IsInt32Constant(0), IsInt32Constant(1)),
437 IsInt32Add(IsInt32Constant(0), IsInt32Constant(2)), 439 IsInt32Add(IsInt32Constant(0), IsInt32Constant(2)),
438 CaptureEq(&entry))); 440 CaptureEq(&entry)));
439 441
440 EXPECT_THAT(phi, 442 EXPECT_THAT(phi, IsPhi(MachineRepresentation::kTagged, eval,
441 IsPhi(kMachAnyTagged, eval, IsInt32Add(phi, IsInt32Constant(1)), 443 IsInt32Add(phi, IsInt32Constant(1)),
442 IsInt32Add(phi, IsInt32Constant(2)), loop)); 444 IsInt32Add(phi, IsInt32Constant(2)), loop));
443 445
444 Capture<Node*> merge; 446 Capture<Node*> merge;
445 EXPECT_THAT( 447 EXPECT_THAT(
446 r, IsReturn(IsPhi(kMachAnyTagged, phi, IsInt32Constant(0), 448 r, IsReturn(IsPhi(MachineRepresentation::kTagged, phi, IsInt32Constant(0),
447 AllOf(CaptureEq(&merge), IsMerge(b1.if_false, b1f))), 449 AllOf(CaptureEq(&merge), IsMerge(b1.if_false, b1f))),
448 start(), CaptureEq(&merge))); 450 start(), CaptureEq(&merge)));
449 } 451 }
450 452
451 453
452 TEST_F(LoopPeelingTest, TwoExitLoop_nope) { 454 TEST_F(LoopPeelingTest, TwoExitLoop_nope) {
453 Node* p0 = Parameter(0); 455 Node* p0 = Parameter(0);
454 Node* loop = graph()->NewNode(common()->Loop(2), start(), start()); 456 Node* loop = graph()->NewNode(common()->Loop(2), start(), start());
455 Branch b1 = NewBranch(p0, loop); 457 Branch b1 = NewBranch(p0, loop);
456 Branch b2 = NewBranch(p0, b1.if_true); 458 Branch b2 = NewBranch(p0, b1.if_true);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
489 LoopTree* loop_tree = GetLoopTree(); 491 LoopTree* loop_tree = GetLoopTree();
490 LoopTree::Loop* loop = loop_tree->outer_loops()[0]; 492 LoopTree::Loop* loop = loop_tree->outer_loops()[0];
491 EXPECT_FALSE(LoopPeeler::CanPeel(loop_tree, loop)); 493 EXPECT_FALSE(LoopPeeler::CanPeel(loop_tree, loop));
492 } 494 }
493 } 495 }
494 496
495 497
496 } // namespace compiler 498 } // namespace compiler
497 } // namespace internal 499 } // namespace internal
498 } // namespace v8 500 } // namespace v8
OLDNEW
« no previous file with comments | « test/unittests/compiler/liveness-analyzer-unittest.cc ('k') | test/unittests/compiler/machine-operator-reducer-unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698