| OLD | NEW |
| 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/common-operator.h" | 9 #include "src/compiler/common-operator.h" |
| 10 #include "src/compiler/control-reducer.h" | 10 #include "src/compiler/control-reducer.h" |
| (...skipping 676 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 687 ControlReducerTester R; | 687 ControlReducerTester R; |
| 688 | 688 |
| 689 Node* merge = R.graph.NewNode(R.common.Merge(2), R.start, R.start); | 689 Node* merge = R.graph.NewNode(R.common.Merge(2), R.start, R.start); |
| 690 R.ReduceMerge(merge, merge); | 690 R.ReduceMerge(merge, merge); |
| 691 } | 691 } |
| 692 | 692 |
| 693 | 693 |
| 694 TEST(CMergeReduce_none2) { | 694 TEST(CMergeReduce_none2) { |
| 695 ControlReducerTester R; | 695 ControlReducerTester R; |
| 696 | 696 |
| 697 Node* t = R.graph.NewNode(R.common.IfTrue(), R.start); | 697 Node* t1 = R.graph.NewNode(R.common.IfTrue(), R.start); |
| 698 Node* f = R.graph.NewNode(R.common.IfFalse(), R.start); | 698 Node* t2 = R.graph.NewNode(R.common.IfTrue(), R.start); |
| 699 Node* merge = R.graph.NewNode(R.common.Merge(2), t, f); | 699 Node* merge = R.graph.NewNode(R.common.Merge(2), t1, t2); |
| 700 R.ReduceMerge(merge, merge); | 700 R.ReduceMerge(merge, merge); |
| 701 } | 701 } |
| 702 | 702 |
| 703 | 703 |
| 704 TEST(CMergeReduce_self3) { | 704 TEST(CMergeReduce_self3) { |
| 705 ControlReducerTester R; | 705 ControlReducerTester R; |
| 706 | 706 |
| 707 Node* merge = | 707 Node* merge = |
| 708 R.SetSelfReferences(R.graph.NewNode(R.common.Merge(2), R.start, R.self)); | 708 R.SetSelfReferences(R.graph.NewNode(R.common.Merge(2), R.start, R.self)); |
| 709 R.ReduceMerge(merge, merge); | 709 R.ReduceMerge(merge, merge); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 737 R.ReduceMerge(merge, merge); | 737 R.ReduceMerge(merge, merge); |
| 738 CheckMerge(merge, R.start, R.start); | 738 CheckMerge(merge, R.start, R.start); |
| 739 } | 739 } |
| 740 } | 740 } |
| 741 | 741 |
| 742 | 742 |
| 743 TEST(CMergeReduce_dead_rm1b) { | 743 TEST(CMergeReduce_dead_rm1b) { |
| 744 ControlReducerTester R; | 744 ControlReducerTester R; |
| 745 | 745 |
| 746 Node* t = R.graph.NewNode(R.common.IfTrue(), R.start); | 746 Node* t = R.graph.NewNode(R.common.IfTrue(), R.start); |
| 747 Node* f = R.graph.NewNode(R.common.IfFalse(), R.start); | 747 Node* f = R.graph.NewNode(R.common.IfTrue(), R.start); |
| 748 for (int i = 0; i < 2; i++) { | 748 for (int i = 0; i < 2; i++) { |
| 749 Node* merge = R.graph.NewNode(R.common.Merge(3), R.dead, R.dead, R.dead); | 749 Node* merge = R.graph.NewNode(R.common.Merge(3), R.dead, R.dead, R.dead); |
| 750 for (int j = i + 1; j < 3; j++) { | 750 for (int j = i + 1; j < 3; j++) { |
| 751 merge->ReplaceInput(i, t); | 751 merge->ReplaceInput(i, t); |
| 752 merge->ReplaceInput(j, f); | 752 merge->ReplaceInput(j, f); |
| 753 R.ReduceMerge(merge, merge); | 753 R.ReduceMerge(merge, merge); |
| 754 CheckMerge(merge, t, f); | 754 CheckMerge(merge, t, f); |
| 755 } | 755 } |
| 756 } | 756 } |
| 757 } | 757 } |
| (...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1111 R.ReduceMergeIterative(R.start, d2.merge); | 1111 R.ReduceMergeIterative(R.start, d2.merge); |
| 1112 } | 1112 } |
| 1113 | 1113 |
| 1114 | 1114 |
| 1115 TEST(CChainedDiamondsReduce_x_false) { | 1115 TEST(CChainedDiamondsReduce_x_false) { |
| 1116 ControlReducerTester R; | 1116 ControlReducerTester R; |
| 1117 Diamond d1(R, R.p0); | 1117 Diamond d1(R, R.p0); |
| 1118 Diamond d2(R, R.zero); | 1118 Diamond d2(R, R.zero); |
| 1119 d2.chain(d1); | 1119 d2.chain(d1); |
| 1120 | 1120 |
| 1121 R.ReduceMergeIterative(d1.merge, d2.merge); | 1121 R.ReduceMergeIterative(R.start, d2.merge); |
| 1122 } | 1122 } |
| 1123 | 1123 |
| 1124 | 1124 |
| 1125 TEST(CChainedDiamondsReduce_false_x) { | 1125 TEST(CChainedDiamondsReduce_false_x) { |
| 1126 ControlReducerTester R; | 1126 ControlReducerTester R; |
| 1127 Diamond d1(R, R.zero); | 1127 Diamond d1(R, R.zero); |
| 1128 Diamond d2(R, R.p0); | 1128 Diamond d2(R, R.p0); |
| 1129 d2.chain(d1); | 1129 d2.chain(d1); |
| 1130 | 1130 |
| 1131 R.ReduceMergeIterative(d2.merge, d2.merge); | 1131 R.ReduceMergeIterative(R.start, d2.merge); |
| 1132 CheckInputs(d2.branch, R.p0, R.start); | |
| 1133 } | 1132 } |
| 1134 | 1133 |
| 1135 | 1134 |
| 1136 TEST(CChainedDiamondsReduce_phi1) { | 1135 TEST(CChainedDiamondsReduce_phi1) { |
| 1137 ControlReducerTester R; | 1136 ControlReducerTester R; |
| 1138 Diamond d1(R, R.zero, R.one, R.zero); // foldable branch, phi. | 1137 Diamond d1(R, R.zero, R.one, R.zero); // foldable branch, phi. |
| 1139 Diamond d2(R, d1.phi); | 1138 Diamond d2(R, d1.phi); |
| 1140 d2.chain(d1); | 1139 d2.chain(d1); |
| 1141 | 1140 |
| 1142 R.ReduceMergeIterative(R.start, d2.merge); | 1141 R.ReduceMergeIterative(R.start, d2.merge); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1183 Diamond d2(R, R.jsgraph.Int32Constant(b)); | 1182 Diamond d2(R, R.jsgraph.Int32Constant(b)); |
| 1184 d2.nest(d1, c); | 1183 d2.nest(d1, c); |
| 1185 | 1184 |
| 1186 R.ReduceMergeIterative(R.start, d1.merge); | 1185 R.ReduceMergeIterative(R.start, d1.merge); |
| 1187 } | 1186 } |
| 1188 } | 1187 } |
| 1189 } | 1188 } |
| 1190 } | 1189 } |
| 1191 | 1190 |
| 1192 | 1191 |
| 1192 TEST(CDeadDiamond) { |
| 1193 ControlReducerTester R; |
| 1194 // if (p0) { } else { } |
| 1195 Diamond d(R, R.p0); |
| 1196 R.ReduceMergeIterative(R.start, d.merge); |
| 1197 } |
| 1198 |
| 1199 |
| 1193 TEST(CDeadLoop1) { | 1200 TEST(CDeadLoop1) { |
| 1194 ControlReducerTester R; | 1201 ControlReducerTester R; |
| 1195 | 1202 |
| 1196 Node* loop = R.graph.NewNode(R.common.Loop(1), R.start); | 1203 Node* loop = R.graph.NewNode(R.common.Loop(1), R.start); |
| 1197 Branch b(R, R.p0, loop); | 1204 Branch b(R, R.p0, loop); |
| 1198 loop->ReplaceInput(0, b.if_true); // loop is not connected to start. | 1205 loop->ReplaceInput(0, b.if_true); // loop is not connected to start. |
| 1199 Node* merge = R.graph.NewNode(R.common.Merge(2), R.start, b.if_false); | 1206 Node* merge = R.graph.NewNode(R.common.Merge(2), R.start, b.if_false); |
| 1200 R.ReduceMergeIterative(R.start, merge); | 1207 R.ReduceMergeIterative(R.start, merge); |
| 1201 CHECK(b.if_true->IsDead()); | 1208 CHECK(b.if_true->IsDead()); |
| 1202 CHECK(b.if_false->IsDead()); | 1209 CHECK(b.if_false->IsDead()); |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1322 | 1329 |
| 1323 d2.nest(d1, true); | 1330 d2.nest(d1, true); |
| 1324 d3.nest(d1, false); | 1331 d3.nest(d1, false); |
| 1325 | 1332 |
| 1326 Node* ret = R.Return(d1.phi, R.start, d1.merge); | 1333 Node* ret = R.Return(d1.phi, R.start, d1.merge); |
| 1327 | 1334 |
| 1328 R.ReduceGraph(); // nothing should happen. | 1335 R.ReduceGraph(); // nothing should happen. |
| 1329 | 1336 |
| 1330 CheckInputs(ret, d1.phi, R.start, d1.merge); | 1337 CheckInputs(ret, d1.phi, R.start, d1.merge); |
| 1331 CheckInputs(d1.phi, R.one, R.zero, d1.merge); | 1338 CheckInputs(d1.phi, R.one, R.zero, d1.merge); |
| 1332 CheckInputs(d1.merge, d2.merge, d3.merge); | 1339 CheckInputs(d1.merge, d1.if_true, d1.if_false); |
| 1333 CheckLiveDiamond(d2); | |
| 1334 CheckLiveDiamond(d3); | |
| 1335 } | 1340 } |
| 1336 | 1341 |
| 1337 | 1342 |
| 1338 TEST(Return_nested_diamonds_true1) { | 1343 TEST(Return_nested_diamonds_true1) { |
| 1339 ControlReducerTester R; | 1344 ControlReducerTester R; |
| 1340 Diamond d1(R, R.one, R.one, R.zero); | 1345 Diamond d1(R, R.one, R.one, R.zero); |
| 1341 Diamond d2(R, R.p0); | 1346 Diamond d2(R, R.p0); |
| 1342 Diamond d3(R, R.p0); | 1347 Diamond d3(R, R.p0); |
| 1343 | 1348 |
| 1344 d2.nest(d1, true); | 1349 d2.nest(d1, true); |
| 1345 d3.nest(d1, false); | 1350 d3.nest(d1, false); |
| 1346 | 1351 |
| 1347 Node* ret = R.Return(d1.phi, R.start, d1.merge); | 1352 Node* ret = R.Return(d1.phi, R.start, d1.merge); |
| 1348 | 1353 |
| 1349 R.ReduceGraph(); // d1 gets folded true. | 1354 R.ReduceGraph(); // d1 gets folded true. |
| 1350 | 1355 |
| 1351 CheckInputs(ret, R.one, R.start, d2.merge); | 1356 CheckInputs(ret, R.one, R.start, R.start); |
| 1352 CheckInputs(d2.branch, R.p0, R.start); | |
| 1353 CheckDeadDiamond(d1); | |
| 1354 CheckLiveDiamond(d2); | |
| 1355 CheckDeadDiamond(d3); | |
| 1356 } | 1357 } |
| 1357 | 1358 |
| 1358 | 1359 |
| 1359 TEST(Return_nested_diamonds_false1) { | 1360 TEST(Return_nested_diamonds_false1) { |
| 1360 ControlReducerTester R; | 1361 ControlReducerTester R; |
| 1361 Diamond d1(R, R.zero, R.one, R.zero); | 1362 Diamond d1(R, R.zero, R.one, R.zero); |
| 1362 Diamond d2(R, R.p0); | 1363 Diamond d2(R, R.p0); |
| 1363 Diamond d3(R, R.p0); | 1364 Diamond d3(R, R.p0); |
| 1364 | 1365 |
| 1365 d2.nest(d1, true); | 1366 d2.nest(d1, true); |
| 1366 d3.nest(d1, false); | 1367 d3.nest(d1, false); |
| 1367 | 1368 |
| 1368 Node* ret = R.Return(d1.phi, R.start, d1.merge); | 1369 Node* ret = R.Return(d1.phi, R.start, d1.merge); |
| 1369 | 1370 |
| 1370 R.ReduceGraph(); // d1 gets folded false. | 1371 R.ReduceGraph(); // d1 gets folded false. |
| 1371 | 1372 |
| 1372 CheckInputs(ret, R.zero, R.start, d3.merge); | 1373 CheckInputs(ret, R.zero, R.start, R.start); |
| 1373 CheckInputs(d3.branch, R.p0, R.start); | |
| 1374 CheckDeadDiamond(d1); | |
| 1375 CheckDeadDiamond(d2); | |
| 1376 CheckLiveDiamond(d3); | |
| 1377 } | 1374 } |
| 1378 | 1375 |
| 1379 | 1376 |
| 1380 TEST(Return_nested_diamonds_true_true1) { | 1377 TEST(Return_nested_diamonds_true_true1) { |
| 1381 ControlReducerTester R; | 1378 ControlReducerTester R; |
| 1382 Diamond d1(R, R.one, R.one, R.zero); | 1379 Diamond d1(R, R.one, R.one, R.zero); |
| 1383 Diamond d2(R, R.one); | 1380 Diamond d2(R, R.one); |
| 1384 Diamond d3(R, R.p0); | 1381 Diamond d3(R, R.p0); |
| 1385 | 1382 |
| 1386 d2.nest(d1, true); | 1383 d2.nest(d1, true); |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1510 | 1507 |
| 1511 Node* ret = R.Return(d1.phi, R.start, d1.merge); | 1508 Node* ret = R.Return(d1.phi, R.start, d1.merge); |
| 1512 | 1509 |
| 1513 R.ReduceGraph(); // d1 gets folded true. | 1510 R.ReduceGraph(); // d1 gets folded true. |
| 1514 | 1511 |
| 1515 CheckInputs(ret, y2, R.start, R.start); | 1512 CheckInputs(ret, y2, R.start, R.start); |
| 1516 CheckDeadDiamond(d1); | 1513 CheckDeadDiamond(d1); |
| 1517 CheckDeadDiamond(d2); | 1514 CheckDeadDiamond(d2); |
| 1518 CheckDeadDiamond(d3); | 1515 CheckDeadDiamond(d3); |
| 1519 } | 1516 } |
| OLD | NEW |