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

Side by Side Diff: test/cctest/compiler/test-control-reducer.cc

Issue 1192063002: [turbofan] Improve interplay of ControlReducer and CommonOperatorReducer. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 6 months 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 | « src/compiler/pipeline.cc ('k') | test/unittests/compiler/common-operator-reducer-unittest.cc » ('j') | 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/v8.h" 5 #include "src/v8.h"
6 #include "test/cctest/cctest.h" 6 #include "test/cctest/cctest.h"
7 7
8 #include "src/base/bits.h" 8 #include "src/base/bits.h"
9 #include "src/compiler/all-nodes.h" 9 #include "src/compiler/all-nodes.h"
10 #include "src/compiler/common-operator.h" 10 #include "src/compiler/common-operator.h"
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 } 136 }
137 return node; 137 return node;
138 } 138 }
139 139
140 const Operator* op(int count, bool effect) { 140 const Operator* op(int count, bool effect) {
141 return effect ? common.EffectPhi(count) : common.Phi(kMachAnyTagged, count); 141 return effect ? common.EffectPhi(count) : common.Phi(kMachAnyTagged, count);
142 } 142 }
143 143
144 void ReduceGraph() { ControlReducer::ReduceGraph(main_zone(), &jsgraph); } 144 void ReduceGraph() { ControlReducer::ReduceGraph(main_zone(), &jsgraph); }
145 145
146 // Checks one-step reduction of a phi.
147 void ReducePhi(Node* expect, Node* phi) {
148 Node* result = ControlReducer::ReducePhiForTesting(&jsgraph, phi);
149 CHECK_EQ(expect, result);
150 ReducePhiIterative(expect, phi); // iterative should give the same result.
151 }
152
153 // Checks one-step reduction of a phi.
154 void ReducePhiNonIterative(Node* expect, Node* phi) {
155 Node* result = ControlReducer::ReducePhiForTesting(&jsgraph, phi);
156 CHECK_EQ(expect, result);
157 }
158
159 void ReducePhiIterative(Node* expect, Node* phi) {
160 p0->ReplaceInput(0, start); // hack: parameters may be trimmed.
161 Node* ret = graph.NewNode(common.Return(), phi, start, start);
162 Node* end = graph.NewNode(common.End(1), ret);
163 graph.SetEnd(end);
164 ControlReducer::ReduceGraph(main_zone(), &jsgraph);
165 CheckInputs(end, ret);
166 CheckInputs(ret, expect, start, start);
167 }
168
169 void ReduceMerge(Node* expect, Node* merge) { 146 void ReduceMerge(Node* expect, Node* merge) {
170 Node* result = ControlReducer::ReduceMerge(&jsgraph, merge); 147 Node* result = ControlReducer::ReduceMerge(&jsgraph, merge);
171 CHECK_EQ(expect, result); 148 CHECK_EQ(expect, result);
172 } 149 }
173 150
174 void ReduceMergeIterative(Node* expect, Node* merge) { 151 void ReduceMergeIterative(Node* expect, Node* merge) {
175 p0->ReplaceInput(0, start); // hack: parameters may be trimmed. 152 p0->ReplaceInput(0, start); // hack: parameters may be trimmed.
176 Node* end = graph.NewNode(common.End(1), merge); 153 Node* end = graph.NewNode(common.End(1), merge);
177 graph.SetEnd(end); 154 graph.SetEnd(end);
178 ReduceGraph(); 155 ReduceGraph();
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
306 CHECK_EQ(3, d.phi->InputCount()); 283 CHECK_EQ(3, d.phi->InputCount());
307 CHECK_EQ(d.merge, d.phi->InputAt(2)); 284 CHECK_EQ(d.merge, d.phi->InputAt(2));
308 } else { 285 } else {
309 Check(d.phi); 286 Check(d.phi);
310 } 287 }
311 } 288 }
312 } 289 }
313 }; 290 };
314 291
315 292
316 TEST(CReducePhi1) {
317 ControlReducerTester R;
318
319 R.ReducePhi(R.leaf[0], R.Phi(R.leaf[0]));
320 R.ReducePhi(R.leaf[1], R.Phi(R.leaf[1]));
321 R.ReducePhi(R.leaf[2], R.Phi(R.leaf[2]));
322 R.ReducePhi(R.leaf[3], R.Phi(R.leaf[3]));
323 }
324
325
326 TEST(CReducePhi1_dead) {
327 ControlReducerTester R;
328
329 R.ReducePhi(R.leaf[0], R.Phi(R.leaf[0], R.dead));
330 R.ReducePhi(R.leaf[1], R.Phi(R.leaf[1], R.dead));
331 R.ReducePhi(R.leaf[2], R.Phi(R.leaf[2], R.dead));
332 R.ReducePhi(R.leaf[3], R.Phi(R.leaf[3], R.dead));
333
334 R.ReducePhi(R.leaf[0], R.Phi(R.dead, R.leaf[0]));
335 R.ReducePhi(R.leaf[1], R.Phi(R.dead, R.leaf[1]));
336 R.ReducePhi(R.leaf[2], R.Phi(R.dead, R.leaf[2]));
337 R.ReducePhi(R.leaf[3], R.Phi(R.dead, R.leaf[3]));
338 }
339
340
341 TEST(CReducePhi1_dead2) {
342 ControlReducerTester R;
343
344 R.ReducePhi(R.leaf[0], R.Phi(R.leaf[0], R.dead, R.dead));
345 R.ReducePhi(R.leaf[0], R.Phi(R.dead, R.leaf[0], R.dead));
346 R.ReducePhi(R.leaf[0], R.Phi(R.dead, R.dead, R.leaf[0]));
347 }
348
349
350 TEST(CReducePhi2a) {
351 ControlReducerTester R;
352
353 for (size_t i = 0; i < kNumLeafs; i++) {
354 Node* a = R.leaf[i];
355 R.ReducePhi(a, R.Phi(a, a));
356 }
357 }
358
359
360 TEST(CReducePhi2b) {
361 ControlReducerTester R;
362
363 for (size_t i = 0; i < kNumLeafs; i++) {
364 Node* a = R.leaf[i];
365 R.ReducePhi(a, R.Phi(R.self, a));
366 R.ReducePhi(a, R.Phi(a, R.self));
367 }
368 }
369
370
371 TEST(CReducePhi2c) {
372 ControlReducerTester R;
373
374 for (size_t i = 1; i < kNumLeafs; i++) {
375 Node* a = R.leaf[i], *b = R.leaf[0];
376 Node* phi1 = R.Phi(b, a);
377 R.ReducePhi(phi1, phi1);
378
379 Node* phi2 = R.Phi(a, b);
380 R.ReducePhi(phi2, phi2);
381 }
382 }
383
384
385 TEST(CReducePhi2_dead) {
386 ControlReducerTester R;
387
388 for (size_t i = 0; i < kNumLeafs; i++) {
389 Node* a = R.leaf[i];
390 R.ReducePhi(a, R.Phi(a, a, R.dead));
391 R.ReducePhi(a, R.Phi(a, R.dead, a));
392 R.ReducePhi(a, R.Phi(R.dead, a, a));
393 }
394
395 for (size_t i = 0; i < kNumLeafs; i++) {
396 Node* a = R.leaf[i];
397 R.ReducePhi(a, R.Phi(R.self, a));
398 R.ReducePhi(a, R.Phi(a, R.self));
399 R.ReducePhi(a, R.Phi(R.self, a, R.dead));
400 R.ReducePhi(a, R.Phi(a, R.self, R.dead));
401 }
402
403 for (size_t i = 1; i < kNumLeafs; i++) {
404 Node* a = R.leaf[i], *b = R.leaf[0];
405 Node* phi1 = R.Phi(b, a, R.dead);
406 R.ReducePhiNonIterative(phi1, phi1);
407
408 Node* phi2 = R.Phi(a, b, R.dead);
409 R.ReducePhiNonIterative(phi2, phi2);
410 }
411 }
412
413
414 TEST(CReducePhi3) {
415 ControlReducerTester R;
416
417 for (size_t i = 0; i < kNumLeafs; i++) {
418 Node* a = R.leaf[i];
419 R.ReducePhi(a, R.Phi(a, a, a));
420 }
421
422 for (size_t i = 0; i < kNumLeafs; i++) {
423 Node* a = R.leaf[i];
424 R.ReducePhi(a, R.Phi(R.self, a, a));
425 R.ReducePhi(a, R.Phi(a, R.self, a));
426 R.ReducePhi(a, R.Phi(a, a, R.self));
427 }
428
429 for (size_t i = 1; i < kNumLeafs; i++) {
430 Node* a = R.leaf[i], *b = R.leaf[0];
431 Node* phi1 = R.Phi(b, a, a);
432 R.ReducePhi(phi1, phi1);
433
434 Node* phi2 = R.Phi(a, b, a);
435 R.ReducePhi(phi2, phi2);
436
437 Node* phi3 = R.Phi(a, a, b);
438 R.ReducePhi(phi3, phi3);
439 }
440 }
441
442
443 TEST(CReducePhi4) {
444 ControlReducerTester R;
445
446 for (size_t i = 0; i < kNumLeafs; i++) {
447 Node* a = R.leaf[i];
448 R.ReducePhi(a, R.Phi(a, a, a, a));
449 }
450
451 for (size_t i = 0; i < kNumLeafs; i++) {
452 Node* a = R.leaf[i];
453 R.ReducePhi(a, R.Phi(R.self, a, a, a));
454 R.ReducePhi(a, R.Phi(a, R.self, a, a));
455 R.ReducePhi(a, R.Phi(a, a, R.self, a));
456 R.ReducePhi(a, R.Phi(a, a, a, R.self));
457
458 R.ReducePhi(a, R.Phi(R.self, R.self, a, a));
459 R.ReducePhi(a, R.Phi(a, R.self, R.self, a));
460 R.ReducePhi(a, R.Phi(a, a, R.self, R.self));
461 R.ReducePhi(a, R.Phi(R.self, a, a, R.self));
462 }
463
464 for (size_t i = 1; i < kNumLeafs; i++) {
465 Node* a = R.leaf[i], *b = R.leaf[0];
466 Node* phi1 = R.Phi(b, a, a, a);
467 R.ReducePhi(phi1, phi1);
468
469 Node* phi2 = R.Phi(a, b, a, a);
470 R.ReducePhi(phi2, phi2);
471
472 Node* phi3 = R.Phi(a, a, b, a);
473 R.ReducePhi(phi3, phi3);
474
475 Node* phi4 = R.Phi(a, a, a, b);
476 R.ReducePhi(phi4, phi4);
477 }
478 }
479
480
481 TEST(CReducePhi_iterative1) {
482 ControlReducerTester R;
483
484 R.ReducePhiIterative(R.leaf[0], R.Phi(R.leaf[0], R.Phi(R.leaf[0])));
485 R.ReducePhiIterative(R.leaf[0], R.Phi(R.Phi(R.leaf[0]), R.leaf[0]));
486 }
487
488
489 TEST(CReducePhi_iterative2) {
490 ControlReducerTester R;
491
492 R.ReducePhiIterative(R.leaf[0], R.Phi(R.Phi(R.leaf[0]), R.Phi(R.leaf[0])));
493 }
494
495
496 TEST(CReducePhi_iterative3) {
497 ControlReducerTester R;
498
499 R.ReducePhiIterative(R.leaf[0],
500 R.Phi(R.leaf[0], R.Phi(R.leaf[0], R.leaf[0])));
501 R.ReducePhiIterative(R.leaf[0],
502 R.Phi(R.Phi(R.leaf[0], R.leaf[0]), R.leaf[0]));
503 }
504
505
506 TEST(CReducePhi_iterative4) {
507 ControlReducerTester R;
508
509 R.ReducePhiIterative(R.leaf[0], R.Phi(R.Phi(R.leaf[0], R.leaf[0]),
510 R.Phi(R.leaf[0], R.leaf[0])));
511
512 Node* p1 = R.Phi(R.leaf[0], R.leaf[0]);
513 R.ReducePhiIterative(R.leaf[0], R.Phi(p1, p1));
514
515 Node* p2 = R.Phi(R.leaf[0], R.leaf[0], R.leaf[0]);
516 R.ReducePhiIterative(R.leaf[0], R.Phi(p2, p2, p2));
517
518 Node* p3 = R.Phi(R.leaf[0], R.leaf[0], R.leaf[0]);
519 R.ReducePhiIterative(R.leaf[0], R.Phi(p3, p3, R.leaf[0]));
520 }
521
522
523 TEST(CReducePhi_iterative_self1) {
524 ControlReducerTester R;
525
526 R.ReducePhiIterative(R.leaf[0], R.Phi(R.leaf[0], R.Phi(R.leaf[0], R.self)));
527 R.ReducePhiIterative(R.leaf[0], R.Phi(R.Phi(R.leaf[0], R.self), R.leaf[0]));
528 }
529
530
531 TEST(CReducePhi_iterative_self2) {
532 ControlReducerTester R;
533
534 R.ReducePhiIterative(
535 R.leaf[0], R.Phi(R.Phi(R.leaf[0], R.self), R.Phi(R.leaf[0], R.self)));
536 R.ReducePhiIterative(
537 R.leaf[0], R.Phi(R.Phi(R.self, R.leaf[0]), R.Phi(R.self, R.leaf[0])));
538
539 Node* p1 = R.Phi(R.leaf[0], R.self);
540 R.ReducePhiIterative(R.leaf[0], R.Phi(p1, p1));
541
542 Node* p2 = R.Phi(R.self, R.leaf[0]);
543 R.ReducePhiIterative(R.leaf[0], R.Phi(p2, p2));
544 }
545
546
547 TEST(EReducePhi1) {
548 ControlReducerTester R;
549
550 R.ReducePhi(R.leaf[0], R.EffectPhi(R.leaf[0]));
551 R.ReducePhi(R.leaf[1], R.EffectPhi(R.leaf[1]));
552 R.ReducePhi(R.leaf[2], R.EffectPhi(R.leaf[2]));
553 R.ReducePhi(R.leaf[3], R.EffectPhi(R.leaf[3]));
554 }
555
556
557 TEST(EReducePhi1_dead) {
558 ControlReducerTester R;
559
560 R.ReducePhi(R.leaf[0], R.EffectPhi(R.leaf[0], R.dead));
561 R.ReducePhi(R.leaf[1], R.EffectPhi(R.leaf[1], R.dead));
562 R.ReducePhi(R.leaf[2], R.EffectPhi(R.leaf[2], R.dead));
563 R.ReducePhi(R.leaf[3], R.EffectPhi(R.leaf[3], R.dead));
564
565 R.ReducePhi(R.leaf[0], R.EffectPhi(R.dead, R.leaf[0]));
566 R.ReducePhi(R.leaf[1], R.EffectPhi(R.dead, R.leaf[1]));
567 R.ReducePhi(R.leaf[2], R.EffectPhi(R.dead, R.leaf[2]));
568 R.ReducePhi(R.leaf[3], R.EffectPhi(R.dead, R.leaf[3]));
569 }
570
571
572 TEST(EReducePhi1_dead2) {
573 ControlReducerTester R;
574
575 R.ReducePhi(R.leaf[0], R.EffectPhi(R.leaf[0], R.dead, R.dead));
576 R.ReducePhi(R.leaf[0], R.EffectPhi(R.dead, R.leaf[0], R.dead));
577 R.ReducePhi(R.leaf[0], R.EffectPhi(R.dead, R.dead, R.leaf[0]));
578 }
579
580
581 TEST(CMergeReduce_simple1) { 293 TEST(CMergeReduce_simple1) {
582 ControlReducerTester R; 294 ControlReducerTester R;
583 295
584 Node* merge = R.graph.NewNode(R.common.Merge(1), R.start); 296 Node* merge = R.graph.NewNode(R.common.Merge(1), R.start);
585 R.ReduceMerge(R.start, merge); 297 R.ReduceMerge(R.start, merge);
586 } 298 }
587 299
588 300
589 TEST(CMergeReduce_simple2) { 301 TEST(CMergeReduce_simple2) {
590 ControlReducerTester R; 302 ControlReducerTester R;
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after
975 TEST(CChainedDiamondsReduce_phi1) { 687 TEST(CChainedDiamondsReduce_phi1) {
976 ControlReducerTester R; 688 ControlReducerTester R;
977 Diamond d1(R, R.zero, R.one, R.zero); // foldable branch, phi. 689 Diamond d1(R, R.zero, R.one, R.zero); // foldable branch, phi.
978 Diamond d2(R, d1.phi); 690 Diamond d2(R, d1.phi);
979 d2.chain(d1); 691 d2.chain(d1);
980 692
981 R.ReduceMergeIterative(R.start, d2.merge); 693 R.ReduceMergeIterative(R.start, d2.merge);
982 } 694 }
983 695
984 696
985 TEST(CChainedDiamondsReduce_phi2) {
986 ControlReducerTester R;
987 Diamond d1(R, R.p0, R.jsgraph.TrueConstant(),
988 R.jsgraph.TrueConstant()); // redundant phi.
989 Diamond d2(R, d1.phi);
990 d2.chain(d1);
991
992 R.ReduceMergeIterative(d1.merge, d2.merge);
993 }
994
995
996 TEST(CNestedDiamondsReduce_true_true_false) { 697 TEST(CNestedDiamondsReduce_true_true_false) {
997 ControlReducerTester R; 698 ControlReducerTester R;
998 Diamond d1(R, R.jsgraph.TrueConstant()); 699 Diamond d1(R, R.jsgraph.TrueConstant());
999 Diamond d2(R, R.jsgraph.FalseConstant()); 700 Diamond d2(R, R.jsgraph.FalseConstant());
1000 d2.nest(d1, true); 701 d2.nest(d1, true);
1001 702
1002 R.ReduceMergeIterative(R.start, d1.merge); 703 R.ReduceMergeIterative(R.start, d1.merge);
1003 } 704 }
1004 705
1005 706
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after
1409 1110
1410 R.ReduceGraph(); // d1 gets folded true. 1111 R.ReduceGraph(); // d1 gets folded true.
1411 1112
1412 CheckInputs(ret, y2, R.start, R.start); 1113 CheckInputs(ret, y2, R.start, R.start);
1413 1114
1414 DeadChecker dead(&R.graph); 1115 DeadChecker dead(&R.graph);
1415 dead.Check(d1); 1116 dead.Check(d1);
1416 dead.Check(d2); 1117 dead.Check(d2);
1417 dead.Check(d3); 1118 dead.Check(d3);
1418 } 1119 }
OLDNEW
« no previous file with comments | « src/compiler/pipeline.cc ('k') | test/unittests/compiler/common-operator-reducer-unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698