| 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 19 matching lines...) Expand all Loading... |
| 30 if (i1 != NULL) CHECK_EQ(i1, node->InputAt(1)); | 30 if (i1 != NULL) CHECK_EQ(i1, node->InputAt(1)); |
| 31 if (i2 != NULL) CHECK_EQ(i2, node->InputAt(2)); | 31 if (i2 != NULL) CHECK_EQ(i2, node->InputAt(2)); |
| 32 return count; | 32 return count; |
| 33 } | 33 } |
| 34 | 34 |
| 35 | 35 |
| 36 static int CheckMerge(Node* node, Node* i0 = NULL, Node* i1 = NULL, | 36 static int CheckMerge(Node* node, Node* i0 = NULL, Node* i1 = NULL, |
| 37 Node* i2 = NULL) { | 37 Node* i2 = NULL) { |
| 38 CHECK_EQ(IrOpcode::kMerge, node->opcode()); | 38 CHECK_EQ(IrOpcode::kMerge, node->opcode()); |
| 39 int count = CheckInputs(node, i0, i1, i2); | 39 int count = CheckInputs(node, i0, i1, i2); |
| 40 CHECK_EQ(count, OperatorProperties::GetControlInputCount(node->op())); | 40 CHECK_EQ(count, node->op()->ControlInputCount()); |
| 41 return count; | 41 return count; |
| 42 } | 42 } |
| 43 | 43 |
| 44 | 44 |
| 45 static int CheckLoop(Node* node, Node* i0 = NULL, Node* i1 = NULL, | 45 static int CheckLoop(Node* node, Node* i0 = NULL, Node* i1 = NULL, |
| 46 Node* i2 = NULL) { | 46 Node* i2 = NULL) { |
| 47 CHECK_EQ(IrOpcode::kLoop, node->opcode()); | 47 CHECK_EQ(IrOpcode::kLoop, node->opcode()); |
| 48 int count = CheckInputs(node, i0, i1, i2); | 48 int count = CheckInputs(node, i0, i1, i2); |
| 49 CHECK_EQ(count, OperatorProperties::GetControlInputCount(node->op())); | 49 CHECK_EQ(count, node->op()->ControlInputCount()); |
| 50 return count; | 50 return count; |
| 51 } | 51 } |
| 52 | 52 |
| 53 | 53 |
| 54 bool IsUsedBy(Node* a, Node* b) { | 54 bool IsUsedBy(Node* a, Node* b) { |
| 55 for (UseIter i = a->uses().begin(); i != a->uses().end(); ++i) { | 55 for (UseIter i = a->uses().begin(); i != a->uses().end(); ++i) { |
| 56 if (b == *i) return true; | 56 if (b == *i) return true; |
| 57 } | 57 } |
| 58 return false; | 58 return false; |
| 59 } | 59 } |
| (...skipping 725 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 785 ControlReducerTester R; | 785 ControlReducerTester R; |
| 786 | 786 |
| 787 for (int i = 0; i < 3; i++) { | 787 for (int i = 0; i < 3; i++) { |
| 788 Node* merge = R.graph.NewNode(R.common.Merge(3), R.start, R.start, R.start); | 788 Node* merge = R.graph.NewNode(R.common.Merge(3), R.start, R.start, R.start); |
| 789 merge->ReplaceInput(i, R.dead); | 789 merge->ReplaceInput(i, R.dead); |
| 790 Node* phi = R.graph.NewNode(R.common.EffectPhi(3), R.leaf[0], R.leaf[1], | 790 Node* phi = R.graph.NewNode(R.common.EffectPhi(3), R.leaf[0], R.leaf[1], |
| 791 R.leaf[2], merge); | 791 R.leaf[2], merge); |
| 792 R.ReduceMerge(merge, merge); | 792 R.ReduceMerge(merge, merge); |
| 793 CHECK_EQ(IrOpcode::kEffectPhi, phi->opcode()); | 793 CHECK_EQ(IrOpcode::kEffectPhi, phi->opcode()); |
| 794 CHECK_EQ(0, phi->op()->InputCount()); | 794 CHECK_EQ(0, phi->op()->InputCount()); |
| 795 CHECK_EQ(2, OperatorProperties::GetEffectInputCount(phi->op())); | 795 CHECK_EQ(2, phi->op()->EffectInputCount()); |
| 796 CHECK_EQ(3, phi->InputCount()); | 796 CHECK_EQ(3, phi->InputCount()); |
| 797 CHECK_EQ(R.leaf[i < 1 ? 1 : 0], phi->InputAt(0)); | 797 CHECK_EQ(R.leaf[i < 1 ? 1 : 0], phi->InputAt(0)); |
| 798 CHECK_EQ(R.leaf[i < 2 ? 2 : 1], phi->InputAt(1)); | 798 CHECK_EQ(R.leaf[i < 2 ? 2 : 1], phi->InputAt(1)); |
| 799 CHECK_EQ(merge, phi->InputAt(2)); | 799 CHECK_EQ(merge, phi->InputAt(2)); |
| 800 } | 800 } |
| 801 } | 801 } |
| 802 | 802 |
| 803 | 803 |
| 804 static const int kSelectorSize = 4; | 804 static const int kSelectorSize = 4; |
| 805 | 805 |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 878 } else { | 878 } else { |
| 879 // Otherwise, nodes should be edited in place. | 879 // Otherwise, nodes should be edited in place. |
| 880 CHECK_EQ(merge, result); | 880 CHECK_EQ(merge, result); |
| 881 selector.CheckNode(merge, IrOpcode::kMerge, controls, NULL); | 881 selector.CheckNode(merge, IrOpcode::kMerge, controls, NULL); |
| 882 selector.CheckNode(phi, IrOpcode::kPhi, values, merge); | 882 selector.CheckNode(phi, IrOpcode::kPhi, values, merge); |
| 883 selector.CheckNode(ephi, IrOpcode::kEffectPhi, effects, merge); | 883 selector.CheckNode(ephi, IrOpcode::kEffectPhi, effects, merge); |
| 884 CHECK_EQ(phi, phi_use->InputAt(0)); | 884 CHECK_EQ(phi, phi_use->InputAt(0)); |
| 885 CHECK_EQ(ephi, ephi_use->InputAt(0)); | 885 CHECK_EQ(ephi, ephi_use->InputAt(0)); |
| 886 CHECK_EQ(count, phi->op()->InputCount()); | 886 CHECK_EQ(count, phi->op()->InputCount()); |
| 887 CHECK_EQ(count + 1, phi->InputCount()); | 887 CHECK_EQ(count + 1, phi->InputCount()); |
| 888 CHECK_EQ(count, OperatorProperties::GetEffectInputCount(ephi->op())); | 888 CHECK_EQ(count, ephi->op()->EffectInputCount()); |
| 889 CHECK_EQ(count + 1, ephi->InputCount()); | 889 CHECK_EQ(count + 1, ephi->InputCount()); |
| 890 } | 890 } |
| 891 } | 891 } |
| 892 } | 892 } |
| 893 | 893 |
| 894 | 894 |
| 895 TEST(CMergeReduce_edit_many_phis1) { | 895 TEST(CMergeReduce_edit_many_phis1) { |
| 896 ControlReducerTester R; | 896 ControlReducerTester R; |
| 897 | 897 |
| 898 const int kPhiCount = 10; | 898 const int kPhiCount = 10; |
| (...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1267 Node* end = R.graph.end(); | 1267 Node* end = R.graph.end(); |
| 1268 end->ReplaceInput(0, b.if_false); | 1268 end->ReplaceInput(0, b.if_false); |
| 1269 | 1269 |
| 1270 R.ReduceGraph(); | 1270 R.ReduceGraph(); |
| 1271 | 1271 |
| 1272 CHECK_EQ(end, R.graph.end()); | 1272 CHECK_EQ(end, R.graph.end()); |
| 1273 CheckLoop(loop, R.start, loop); | 1273 CheckLoop(loop, R.start, loop); |
| 1274 Node* terminate = end->InputAt(0); | 1274 Node* terminate = end->InputAt(0); |
| 1275 CHECK_EQ(IrOpcode::kTerminate, terminate->opcode()); | 1275 CHECK_EQ(IrOpcode::kTerminate, terminate->opcode()); |
| 1276 CHECK_EQ(2, terminate->InputCount()); | 1276 CHECK_EQ(2, terminate->InputCount()); |
| 1277 CHECK_EQ(1, OperatorProperties::GetEffectInputCount(terminate->op())); | 1277 CHECK_EQ(1, terminate->op()->EffectInputCount()); |
| 1278 CHECK_EQ(1, OperatorProperties::GetControlInputCount(terminate->op())); | 1278 CHECK_EQ(1, terminate->op()->ControlInputCount()); |
| 1279 CheckInputs(terminate, effect, loop); | 1279 CheckInputs(terminate, effect, loop); |
| 1280 } | 1280 } |
| 1281 | 1281 |
| 1282 | 1282 |
| 1283 TEST(CNonTermLoop_terminate2) { | 1283 TEST(CNonTermLoop_terminate2) { |
| 1284 ControlReducerTester R; | 1284 ControlReducerTester R; |
| 1285 Node* loop = R.graph.NewNode(R.common.Loop(2), R.start, R.start); | 1285 Node* loop = R.graph.NewNode(R.common.Loop(2), R.start, R.start); |
| 1286 Node* effect1 = R.SetSelfReferences( | 1286 Node* effect1 = R.SetSelfReferences( |
| 1287 R.graph.NewNode(R.common.EffectPhi(2), R.start, R.self, loop)); | 1287 R.graph.NewNode(R.common.EffectPhi(2), R.start, R.self, loop)); |
| 1288 Node* effect2 = R.SetSelfReferences( | 1288 Node* effect2 = R.SetSelfReferences( |
| 1289 R.graph.NewNode(R.common.EffectPhi(2), R.start, R.self, loop)); | 1289 R.graph.NewNode(R.common.EffectPhi(2), R.start, R.self, loop)); |
| 1290 Branch b(R, R.one, loop); | 1290 Branch b(R, R.one, loop); |
| 1291 loop->ReplaceInput(1, b.if_true); | 1291 loop->ReplaceInput(1, b.if_true); |
| 1292 Node* end = R.graph.end(); | 1292 Node* end = R.graph.end(); |
| 1293 end->ReplaceInput(0, b.if_false); | 1293 end->ReplaceInput(0, b.if_false); |
| 1294 | 1294 |
| 1295 R.ReduceGraph(); | 1295 R.ReduceGraph(); |
| 1296 | 1296 |
| 1297 CheckLoop(loop, R.start, loop); | 1297 CheckLoop(loop, R.start, loop); |
| 1298 CHECK_EQ(end, R.graph.end()); | 1298 CHECK_EQ(end, R.graph.end()); |
| 1299 Node* terminate = end->InputAt(0); | 1299 Node* terminate = end->InputAt(0); |
| 1300 CHECK_EQ(IrOpcode::kTerminate, terminate->opcode()); | 1300 CHECK_EQ(IrOpcode::kTerminate, terminate->opcode()); |
| 1301 CHECK_EQ(3, terminate->InputCount()); | 1301 CHECK_EQ(3, terminate->InputCount()); |
| 1302 CHECK_EQ(2, OperatorProperties::GetEffectInputCount(terminate->op())); | 1302 CHECK_EQ(2, terminate->op()->EffectInputCount()); |
| 1303 CHECK_EQ(1, OperatorProperties::GetControlInputCount(terminate->op())); | 1303 CHECK_EQ(1, terminate->op()->ControlInputCount()); |
| 1304 Node* e0 = terminate->InputAt(0); | 1304 Node* e0 = terminate->InputAt(0); |
| 1305 Node* e1 = terminate->InputAt(1); | 1305 Node* e1 = terminate->InputAt(1); |
| 1306 CHECK(e0 == effect1 || e1 == effect1); | 1306 CHECK(e0 == effect1 || e1 == effect1); |
| 1307 CHECK(e0 == effect2 || e1 == effect2); | 1307 CHECK(e0 == effect2 || e1 == effect2); |
| 1308 CHECK_EQ(loop, terminate->InputAt(2)); | 1308 CHECK_EQ(loop, terminate->InputAt(2)); |
| 1309 } | 1309 } |
| 1310 | 1310 |
| 1311 | 1311 |
| 1312 TEST(CNonTermLoop_terminate_m1) { | 1312 TEST(CNonTermLoop_terminate_m1) { |
| 1313 ControlReducerTester R; | 1313 ControlReducerTester R; |
| 1314 Node* loop = | 1314 Node* loop = |
| 1315 R.SetSelfReferences(R.graph.NewNode(R.common.Loop(2), R.start, R.self)); | 1315 R.SetSelfReferences(R.graph.NewNode(R.common.Loop(2), R.start, R.self)); |
| 1316 Node* effect = R.SetSelfReferences( | 1316 Node* effect = R.SetSelfReferences( |
| 1317 R.graph.NewNode(R.common.EffectPhi(2), R.start, R.self, loop)); | 1317 R.graph.NewNode(R.common.EffectPhi(2), R.start, R.self, loop)); |
| 1318 R.ReduceGraph(); | 1318 R.ReduceGraph(); |
| 1319 Node* end = R.graph.end(); | 1319 Node* end = R.graph.end(); |
| 1320 CHECK_EQ(R.start, loop->InputAt(0)); | 1320 CHECK_EQ(R.start, loop->InputAt(0)); |
| 1321 CHECK_EQ(loop, loop->InputAt(1)); | 1321 CHECK_EQ(loop, loop->InputAt(1)); |
| 1322 Node* merge = end->InputAt(0); | 1322 Node* merge = end->InputAt(0); |
| 1323 CHECK_EQ(IrOpcode::kMerge, merge->opcode()); | 1323 CHECK_EQ(IrOpcode::kMerge, merge->opcode()); |
| 1324 CHECK_EQ(2, merge->InputCount()); | 1324 CHECK_EQ(2, merge->InputCount()); |
| 1325 CHECK_EQ(2, OperatorProperties::GetControlInputCount(merge->op())); | 1325 CHECK_EQ(2, merge->op()->ControlInputCount()); |
| 1326 CHECK_EQ(R.start, merge->InputAt(0)); | 1326 CHECK_EQ(R.start, merge->InputAt(0)); |
| 1327 | 1327 |
| 1328 Node* terminate = merge->InputAt(1); | 1328 Node* terminate = merge->InputAt(1); |
| 1329 CHECK_EQ(IrOpcode::kTerminate, terminate->opcode()); | 1329 CHECK_EQ(IrOpcode::kTerminate, terminate->opcode()); |
| 1330 CHECK_EQ(2, terminate->InputCount()); | 1330 CHECK_EQ(2, terminate->InputCount()); |
| 1331 CHECK_EQ(1, OperatorProperties::GetEffectInputCount(terminate->op())); | 1331 CHECK_EQ(1, terminate->op()->EffectInputCount()); |
| 1332 CHECK_EQ(1, OperatorProperties::GetControlInputCount(terminate->op())); | 1332 CHECK_EQ(1, terminate->op()->ControlInputCount()); |
| 1333 CHECK_EQ(effect, terminate->InputAt(0)); | 1333 CHECK_EQ(effect, terminate->InputAt(0)); |
| 1334 CHECK_EQ(loop, terminate->InputAt(1)); | 1334 CHECK_EQ(loop, terminate->InputAt(1)); |
| 1335 } | 1335 } |
| 1336 | 1336 |
| 1337 | 1337 |
| 1338 TEST(CNonTermLoop_big1) { | 1338 TEST(CNonTermLoop_big1) { |
| 1339 ControlReducerTester R; | 1339 ControlReducerTester R; |
| 1340 Branch b1(R, R.p0); | 1340 Branch b1(R, R.p0); |
| 1341 Node* rt = R.graph.NewNode(R.common.Return(), R.one, R.start, b1.if_true); | 1341 Node* rt = R.graph.NewNode(R.common.Return(), R.one, R.start, b1.if_true); |
| 1342 | 1342 |
| (...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1671 | 1671 |
| 1672 Node* ret = R.Return(d1.phi, R.start, d1.merge); | 1672 Node* ret = R.Return(d1.phi, R.start, d1.merge); |
| 1673 | 1673 |
| 1674 R.ReduceGraph(); // d1 gets folded true. | 1674 R.ReduceGraph(); // d1 gets folded true. |
| 1675 | 1675 |
| 1676 CheckInputs(ret, y2, R.start, R.start); | 1676 CheckInputs(ret, y2, R.start, R.start); |
| 1677 CheckDeadDiamond(d1); | 1677 CheckDeadDiamond(d1); |
| 1678 CheckDeadDiamond(d2); | 1678 CheckDeadDiamond(d2); |
| 1679 CheckDeadDiamond(d3); | 1679 CheckDeadDiamond(d3); |
| 1680 } | 1680 } |
| OLD | NEW |