OLD | NEW |
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/control-reducer.h" | 5 #include "src/compiler/control-reducer.h" |
6 #include "src/compiler/diamond.h" | 6 #include "src/compiler/diamond.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/js-operator.h" | 9 #include "src/compiler/js-operator.h" |
10 #include "src/compiler/machine-operator.h" | 10 #include "src/compiler/machine-operator.h" |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 OFStream os(stdout); | 46 OFStream os(stdout); |
47 os << "-- Graph after control reduction" << std::endl; | 47 os << "-- Graph after control reduction" << std::endl; |
48 os << AsRPO(*graph()); | 48 os << AsRPO(*graph()); |
49 } | 49 } |
50 } | 50 } |
51 | 51 |
52 JSGraph* jsgraph() { return &jsgraph_; } | 52 JSGraph* jsgraph() { return &jsgraph_; } |
53 }; | 53 }; |
54 | 54 |
55 | 55 |
56 TEST_F(ControlReducerTest, NonTerminatingLoop) { | |
57 Node* loop = graph()->NewNode(common()->Loop(2), graph()->start()); | |
58 loop->AppendInput(graph()->zone(), loop); | |
59 ReduceGraph(); | |
60 EXPECT_THAT(graph()->end(), | |
61 IsEnd(graph()->start(), | |
62 IsTerminate(graph()->start(), | |
63 AllOf(loop, IsLoop(graph()->start(), loop))))); | |
64 } | |
65 | |
66 | |
67 TEST_F(ControlReducerTest, NonTerminatingLoopWithEffectPhi) { | |
68 Node* loop = graph()->NewNode(common()->Loop(2), graph()->start()); | |
69 loop->AppendInput(graph()->zone(), loop); | |
70 Node* ephi = graph()->NewNode(common()->EffectPhi(2), graph()->start()); | |
71 ephi->AppendInput(graph()->zone(), ephi); | |
72 ephi->AppendInput(graph()->zone(), loop); | |
73 ReduceGraph(); | |
74 EXPECT_THAT( | |
75 graph()->end(), | |
76 IsEnd(graph()->start(), | |
77 IsTerminate(AllOf(ephi, IsEffectPhi(graph()->start(), ephi, loop)), | |
78 AllOf(loop, IsLoop(graph()->start(), loop))))); | |
79 } | |
80 | |
81 | |
82 TEST_F(ControlReducerTest, NonTerminatingLoopWithTwoEffectPhis) { | |
83 Node* loop = graph()->NewNode(common()->Loop(2), graph()->start()); | |
84 loop->AppendInput(graph()->zone(), loop); | |
85 Node* ephi1 = graph()->NewNode(common()->EffectPhi(2), graph()->start()); | |
86 ephi1->AppendInput(graph()->zone(), ephi1); | |
87 ephi1->AppendInput(graph()->zone(), loop); | |
88 Node* ephi2 = graph()->NewNode(common()->EffectPhi(2), graph()->start()); | |
89 ephi2->AppendInput(graph()->zone(), ephi2); | |
90 ephi2->AppendInput(graph()->zone(), loop); | |
91 ReduceGraph(); | |
92 EXPECT_THAT( | |
93 graph()->end(), | |
94 IsEnd(graph()->start(), | |
95 IsTerminate( | |
96 IsEffectSet( | |
97 AllOf(ephi1, IsEffectPhi(graph()->start(), ephi1, loop)), | |
98 AllOf(ephi2, IsEffectPhi(graph()->start(), ephi2, loop))), | |
99 AllOf(loop, IsLoop(graph()->start(), loop))))); | |
100 } | |
101 | |
102 | |
103 TEST_F(ControlReducerTest, NonTerminatingLoopWithDeadEnd) { | |
104 Node* loop = graph()->NewNode(common()->Loop(2), graph()->start()); | |
105 loop->AppendInput(graph()->zone(), loop); | |
106 graph()->end()->ReplaceInput(0, graph()->NewNode(common()->Dead())); | |
107 ReduceGraph(); | |
108 EXPECT_THAT(graph()->end(), | |
109 IsEnd(IsTerminate(graph()->start(), | |
110 AllOf(loop, IsLoop(graph()->start(), loop))))); | |
111 } | |
112 | |
113 | |
114 TEST_F(ControlReducerTest, PhiAsInputToBranch_true) { | 56 TEST_F(ControlReducerTest, PhiAsInputToBranch_true) { |
115 Node* p0 = Parameter(0); | 57 Node* p0 = Parameter(0); |
116 Node* branch1 = graph()->NewNode(common()->Branch(), p0, graph()->start()); | 58 Node* branch1 = graph()->NewNode(common()->Branch(), p0, graph()->start()); |
117 Node* if_true1 = graph()->NewNode(common()->IfTrue(), branch1); | 59 Node* if_true1 = graph()->NewNode(common()->IfTrue(), branch1); |
118 Node* if_false1 = graph()->NewNode(common()->IfFalse(), branch1); | 60 Node* if_false1 = graph()->NewNode(common()->IfFalse(), branch1); |
119 Node* merge1 = graph()->NewNode(common()->Merge(2), if_true1, if_false1); | 61 Node* merge1 = graph()->NewNode(common()->Merge(2), if_true1, if_false1); |
120 Node* phi1 = graph()->NewNode(common()->Phi(kMachInt32, 2), | 62 Node* phi1 = graph()->NewNode(common()->Phi(kMachInt32, 2), |
121 jsgraph()->Int32Constant(1), | 63 jsgraph()->Int32Constant(1), |
122 jsgraph()->Int32Constant(2), merge1); | 64 jsgraph()->Int32Constant(2), merge1); |
123 | 65 |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
313 IsReturn(IsInt32Add( | 255 IsReturn(IsInt32Add( |
314 IsSelect(kType, p0, IsInt32Constant(1), IsInt32Constant(2)), | 256 IsSelect(kType, p0, IsInt32Constant(1), IsInt32Constant(2)), |
315 IsSelect(kType, p0, IsInt32Constant(2), IsInt32Constant(3))), | 257 IsSelect(kType, p0, IsInt32Constant(2), IsInt32Constant(3))), |
316 graph()->start(), graph()->start())); | 258 graph()->start(), graph()->start())); |
317 EXPECT_THAT(graph()->end(), IsEnd(ret)); | 259 EXPECT_THAT(graph()->end(), IsEnd(ret)); |
318 } | 260 } |
319 | 261 |
320 } // namespace compiler | 262 } // namespace compiler |
321 } // namespace internal | 263 } // namespace internal |
322 } // namespace v8 | 264 } // namespace v8 |
OLD | NEW |