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/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 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 | 62 |
63 // A helper for all tests dealing with ControlTester. | 63 // A helper for all tests dealing with ControlTester. |
64 class ControlReducerTester : HandleAndZoneScope { | 64 class ControlReducerTester : HandleAndZoneScope { |
65 public: | 65 public: |
66 ControlReducerTester() | 66 ControlReducerTester() |
67 : isolate(main_isolate()), | 67 : isolate(main_isolate()), |
68 common(main_zone()), | 68 common(main_zone()), |
69 graph(main_zone()), | 69 graph(main_zone()), |
70 jsgraph(main_isolate(), &graph, &common, NULL, NULL), | 70 jsgraph(main_isolate(), &graph, &common, NULL, NULL), |
71 start(graph.NewNode(common.Start(1))), | 71 start(graph.NewNode(common.Start(1))), |
72 end(graph.NewNode(common.End(), start)), | 72 end(graph.NewNode(common.End(1), start)), |
73 p0(graph.NewNode(common.Parameter(0), start)), | 73 p0(graph.NewNode(common.Parameter(0), start)), |
74 zero(jsgraph.Int32Constant(0)), | 74 zero(jsgraph.Int32Constant(0)), |
75 one(jsgraph.OneConstant()), | 75 one(jsgraph.OneConstant()), |
76 half(jsgraph.Constant(0.5)), | 76 half(jsgraph.Constant(0.5)), |
77 self(graph.NewNode(common.Int32Constant(0xaabbccdd))), | 77 self(graph.NewNode(common.Int32Constant(0xaabbccdd))), |
78 dead(graph.NewNode(common.Dead())) { | 78 dead(graph.NewNode(common.Dead())) { |
79 graph.SetEnd(end); | 79 graph.SetEnd(end); |
80 graph.SetStart(start); | 80 graph.SetStart(start); |
81 leaf[0] = zero; | 81 leaf[0] = zero; |
82 leaf[1] = one; | 82 leaf[1] = one; |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 | 154 |
155 // Checks one-step reduction of a phi. | 155 // Checks one-step reduction of a phi. |
156 void ReducePhiNonIterative(Node* expect, Node* phi) { | 156 void ReducePhiNonIterative(Node* expect, Node* phi) { |
157 Node* result = ControlReducer::ReducePhiForTesting(&jsgraph, phi); | 157 Node* result = ControlReducer::ReducePhiForTesting(&jsgraph, phi); |
158 CHECK_EQ(expect, result); | 158 CHECK_EQ(expect, result); |
159 } | 159 } |
160 | 160 |
161 void ReducePhiIterative(Node* expect, Node* phi) { | 161 void ReducePhiIterative(Node* expect, Node* phi) { |
162 p0->ReplaceInput(0, start); // hack: parameters may be trimmed. | 162 p0->ReplaceInput(0, start); // hack: parameters may be trimmed. |
163 Node* ret = graph.NewNode(common.Return(), phi, start, start); | 163 Node* ret = graph.NewNode(common.Return(), phi, start, start); |
164 Node* end = graph.NewNode(common.End(), ret); | 164 Node* end = graph.NewNode(common.End(1), ret); |
165 graph.SetEnd(end); | 165 graph.SetEnd(end); |
166 ControlReducer::ReduceGraph(main_zone(), &jsgraph); | 166 ControlReducer::ReduceGraph(main_zone(), &jsgraph); |
167 CheckInputs(end, ret); | 167 CheckInputs(end, ret); |
168 CheckInputs(ret, expect, start, start); | 168 CheckInputs(ret, expect, start, start); |
169 } | 169 } |
170 | 170 |
171 void ReduceMerge(Node* expect, Node* merge) { | 171 void ReduceMerge(Node* expect, Node* merge) { |
172 Node* result = ControlReducer::ReduceMerge(&jsgraph, merge); | 172 Node* result = ControlReducer::ReduceMerge(&jsgraph, merge); |
173 CHECK_EQ(expect, result); | 173 CHECK_EQ(expect, result); |
174 } | 174 } |
175 | 175 |
176 void ReduceMergeIterative(Node* expect, Node* merge) { | 176 void ReduceMergeIterative(Node* expect, Node* merge) { |
177 p0->ReplaceInput(0, start); // hack: parameters may be trimmed. | 177 p0->ReplaceInput(0, start); // hack: parameters may be trimmed. |
178 Node* end = graph.NewNode(common.End(), merge); | 178 Node* end = graph.NewNode(common.End(1), merge); |
179 graph.SetEnd(end); | 179 graph.SetEnd(end); |
180 ReduceGraph(); | 180 ReduceGraph(); |
181 CheckInputs(end, expect); | 181 CheckInputs(end, expect); |
182 } | 182 } |
183 | 183 |
184 void ReduceBranch(Decision expected, Node* branch) { | 184 void ReduceBranch(Decision expected, Node* branch) { |
185 Node* control = branch->InputAt(1); | 185 Node* control = branch->InputAt(1); |
186 for (Node* use : branch->uses()) { | 186 for (Node* use : branch->uses()) { |
187 if (use->opcode() == IrOpcode::kIfTrue) { | 187 if (use->opcode() == IrOpcode::kIfTrue) { |
188 Node* result = ControlReducer::ReduceIfNodeForTesting(&jsgraph, use); | 188 Node* result = ControlReducer::ReduceIfNodeForTesting(&jsgraph, use); |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
405 CHECK_EQ(i == 0 ? NULL : dead[i - 1], dead[i]->InputAt(0)); | 405 CHECK_EQ(i == 0 ? NULL : dead[i - 1], dead[i]->InputAt(0)); |
406 CHECK_EQ(i == 0 ? T.start : live[i - 1], live[i]->InputAt(0)); | 406 CHECK_EQ(i == 0 ? T.start : live[i - 1], live[i]->InputAt(0)); |
407 } | 407 } |
408 } | 408 } |
409 | 409 |
410 | 410 |
411 TEST(Trim_cycle1) { | 411 TEST(Trim_cycle1) { |
412 ControlReducerTester T; | 412 ControlReducerTester T; |
413 Node* loop = T.graph.NewNode(T.common.Loop(1), T.start, T.start); | 413 Node* loop = T.graph.NewNode(T.common.Loop(1), T.start, T.start); |
414 loop->ReplaceInput(1, loop); | 414 loop->ReplaceInput(1, loop); |
415 Node* end = T.graph.NewNode(T.common.End(), loop); | 415 Node* end = T.graph.NewNode(T.common.End(1), loop); |
416 T.graph.SetEnd(end); | 416 T.graph.SetEnd(end); |
417 | 417 |
418 CHECK(IsUsedBy(T.start, loop)); | 418 CHECK(IsUsedBy(T.start, loop)); |
419 CHECK(IsUsedBy(loop, end)); | 419 CHECK(IsUsedBy(loop, end)); |
420 CHECK(IsUsedBy(loop, loop)); | 420 CHECK(IsUsedBy(loop, loop)); |
421 | 421 |
422 T.Trim(); | 422 T.Trim(); |
423 | 423 |
424 // nothing should have happened to the loop itself. | 424 // nothing should have happened to the loop itself. |
425 CHECK(IsUsedBy(T.start, loop)); | 425 CHECK(IsUsedBy(T.start, loop)); |
426 CHECK(IsUsedBy(loop, end)); | 426 CHECK(IsUsedBy(loop, end)); |
427 CHECK(IsUsedBy(loop, loop)); | 427 CHECK(IsUsedBy(loop, loop)); |
428 CheckInputs(loop, T.start, loop); | 428 CheckInputs(loop, T.start, loop); |
429 CheckInputs(end, loop); | 429 CheckInputs(end, loop); |
430 } | 430 } |
431 | 431 |
432 | 432 |
433 TEST(Trim_cycle2) { | 433 TEST(Trim_cycle2) { |
434 ControlReducerTester T; | 434 ControlReducerTester T; |
435 Node* loop = T.graph.NewNode(T.common.Loop(2), T.start, T.start); | 435 Node* loop = T.graph.NewNode(T.common.Loop(2), T.start, T.start); |
436 loop->ReplaceInput(1, loop); | 436 loop->ReplaceInput(1, loop); |
437 Node* end = T.graph.NewNode(T.common.End(), loop); | 437 Node* end = T.graph.NewNode(T.common.End(1), loop); |
438 Node* phi = | 438 Node* phi = |
439 T.graph.NewNode(T.common.Phi(kMachAnyTagged, 2), T.one, T.half, loop); | 439 T.graph.NewNode(T.common.Phi(kMachAnyTagged, 2), T.one, T.half, loop); |
440 T.graph.SetEnd(end); | 440 T.graph.SetEnd(end); |
441 | 441 |
442 CHECK(IsUsedBy(T.start, loop)); | 442 CHECK(IsUsedBy(T.start, loop)); |
443 CHECK(IsUsedBy(loop, end)); | 443 CHECK(IsUsedBy(loop, end)); |
444 CHECK(IsUsedBy(loop, loop)); | 444 CHECK(IsUsedBy(loop, loop)); |
445 CHECK(IsUsedBy(loop, phi)); | 445 CHECK(IsUsedBy(loop, phi)); |
446 CHECK(IsUsedBy(T.one, phi)); | 446 CHECK(IsUsedBy(T.one, phi)); |
447 CHECK(IsUsedBy(T.half, phi)); | 447 CHECK(IsUsedBy(T.half, phi)); |
(...skipping 617 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1065 } | 1065 } |
1066 | 1066 |
1067 | 1067 |
1068 TEST(CMergeReduce_dead_chain1) { | 1068 TEST(CMergeReduce_dead_chain1) { |
1069 ControlReducerTester R; | 1069 ControlReducerTester R; |
1070 for (int i = 0; i < 5; i++) { | 1070 for (int i = 0; i < 5; i++) { |
1071 Node* merge = R.graph.NewNode(R.common.Merge(1), R.dead); | 1071 Node* merge = R.graph.NewNode(R.common.Merge(1), R.dead); |
1072 for (int j = 0; j < i; j++) { | 1072 for (int j = 0; j < i; j++) { |
1073 merge = R.graph.NewNode(R.common.Merge(1), merge); | 1073 merge = R.graph.NewNode(R.common.Merge(1), merge); |
1074 } | 1074 } |
1075 Node* end = R.graph.NewNode(R.common.End(), merge); | 1075 Node* end = R.graph.NewNode(R.common.End(1), merge); |
1076 R.graph.SetEnd(end); | 1076 R.graph.SetEnd(end); |
1077 R.ReduceGraph(); | 1077 R.ReduceGraph(); |
1078 CHECK(merge->IsDead()); | 1078 CHECK(merge->IsDead()); |
1079 CHECK(!end->InputAt(0)); // end dies. | 1079 CHECK(!end->InputAt(0)); // end dies. |
1080 } | 1080 } |
1081 } | 1081 } |
1082 | 1082 |
1083 | 1083 |
1084 TEST(CMergeReduce_dead_chain2) { | 1084 TEST(CMergeReduce_dead_chain2) { |
1085 ControlReducerTester R; | 1085 ControlReducerTester R; |
(...skipping 546 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1632 | 1632 |
1633 R.ReduceGraph(); // d1 gets folded true. | 1633 R.ReduceGraph(); // d1 gets folded true. |
1634 | 1634 |
1635 CheckInputs(ret, y2, R.start, R.start); | 1635 CheckInputs(ret, y2, R.start, R.start); |
1636 | 1636 |
1637 DeadChecker dead(&R.graph); | 1637 DeadChecker dead(&R.graph); |
1638 dead.Check(d1); | 1638 dead.Check(d1); |
1639 dead.Check(d2); | 1639 dead.Check(d2); |
1640 dead.Check(d3); | 1640 dead.Check(d3); |
1641 } | 1641 } |
OLD | NEW |