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/common-operator.h" | 5 #include "src/compiler/common-operator.h" |
6 #include "src/compiler/graph.h" | 6 #include "src/compiler/graph.h" |
7 #include "src/compiler/loop-peeling.h" | 7 #include "src/compiler/loop-peeling.h" |
8 #include "src/compiler/node.h" | 8 #include "src/compiler/node.h" |
9 #include "src/compiler/node-marker.h" | 9 #include "src/compiler/node-marker.h" |
10 #include "src/compiler/node-properties-inl.h" | 10 #include "src/compiler/node-properties-inl.h" |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 // TODO(turbofan): we use a simple linear search, since the peeled iteration | 154 // TODO(turbofan): we use a simple linear search, since the peeled iteration |
155 // is really only used in testing. | 155 // is really only used in testing. |
156 PeeledIterationImpl* impl = static_cast<PeeledIterationImpl*>(this); | 156 PeeledIterationImpl* impl = static_cast<PeeledIterationImpl*>(this); |
157 for (size_t i = 0; i < impl->node_pairs_.size(); i += 2) { | 157 for (size_t i = 0; i < impl->node_pairs_.size(); i += 2) { |
158 if (impl->node_pairs_[i] == node) return impl->node_pairs_[i + 1]; | 158 if (impl->node_pairs_[i] == node) return impl->node_pairs_[i + 1]; |
159 } | 159 } |
160 return node; | 160 return node; |
161 } | 161 } |
162 | 162 |
163 | 163 |
164 static const Operator* ResizeMergeOrPhi(CommonOperatorBuilder* common, | |
165 const Operator* op, int size) { | |
166 if (op->opcode() == IrOpcode::kPhi) { | |
167 return common->Phi(OpParameter<MachineType>(op), size); | |
168 } else if (op->opcode() == IrOpcode::kEffectPhi) { | |
169 return common->EffectPhi(size); | |
170 } else if (op->opcode() == IrOpcode::kMerge) { | |
171 return common->Merge(size); | |
172 } else if (op->opcode() == IrOpcode::kLoop) { | |
173 return common->Loop(size); | |
174 } else { | |
175 UNREACHABLE(); | |
176 return nullptr; | |
177 } | |
178 } | |
179 | |
180 | |
181 PeeledIteration* LoopPeeler::Peel(Graph* graph, CommonOperatorBuilder* common, | 164 PeeledIteration* LoopPeeler::Peel(Graph* graph, CommonOperatorBuilder* common, |
182 LoopTree* loop_tree, LoopTree::Loop* loop, | 165 LoopTree* loop_tree, LoopTree::Loop* loop, |
183 Zone* tmp_zone) { | 166 Zone* tmp_zone) { |
184 PeeledIterationImpl* iter = new (tmp_zone) PeeledIterationImpl(tmp_zone); | 167 PeeledIterationImpl* iter = new (tmp_zone) PeeledIterationImpl(tmp_zone); |
185 Peeling peeling(graph, tmp_zone, loop->TotalSize() * 2 + 2, | 168 Peeling peeling(graph, tmp_zone, loop->TotalSize() * 2 + 2, |
186 &iter->node_pairs_); | 169 &iter->node_pairs_); |
187 | 170 |
188 //============================================================================ | 171 //============================================================================ |
189 // Construct the peeled iteration. | 172 // Construct the peeled iteration. |
190 //============================================================================ | 173 //============================================================================ |
(...skipping 27 matching lines...) Expand all Loading... |
218 // Merge values from the multiple output edges of the peeled iteration. | 201 // Merge values from the multiple output edges of the peeled iteration. |
219 for (Node* node : loop_tree->HeaderNodes(loop)) { | 202 for (Node* node : loop_tree->HeaderNodes(loop)) { |
220 if (node->opcode() == IrOpcode::kLoop) continue; // already done. | 203 if (node->opcode() == IrOpcode::kLoop) continue; // already done. |
221 inputs.clear(); | 204 inputs.clear(); |
222 for (int i = 0; i < backedges; i++) { | 205 for (int i = 0; i < backedges; i++) { |
223 inputs.push_back(peeling.map(node->InputAt(1 + i))); | 206 inputs.push_back(peeling.map(node->InputAt(1 + i))); |
224 } | 207 } |
225 for (Node* input : inputs) { | 208 for (Node* input : inputs) { |
226 if (input != inputs[0]) { // Non-redundant phi. | 209 if (input != inputs[0]) { // Non-redundant phi. |
227 inputs.push_back(merge); | 210 inputs.push_back(merge); |
228 const Operator* op = ResizeMergeOrPhi(common, node->op(), backedges); | 211 const Operator* op = common->ResizeMergeOrPhi(node->op(), backedges); |
229 Node* phi = graph->NewNode(op, backedges + 1, &inputs[0]); | 212 Node* phi = graph->NewNode(op, backedges + 1, &inputs[0]); |
230 node->ReplaceInput(0, phi); | 213 node->ReplaceInput(0, phi); |
231 break; | 214 break; |
232 } | 215 } |
233 } | 216 } |
234 } | 217 } |
235 new_entry = merge; | 218 new_entry = merge; |
236 } else { | 219 } else { |
237 // Only one backedge, simply replace the input to loop with output of | 220 // Only one backedge, simply replace the input to loop with output of |
238 // peeling. | 221 // peeling. |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
347 } | 330 } |
348 } | 331 } |
349 } | 332 } |
350 | 333 |
351 return iter; | 334 return iter; |
352 } | 335 } |
353 | 336 |
354 } // namespace compiler | 337 } // namespace compiler |
355 } // namespace internal | 338 } // namespace internal |
356 } // namespace v8 | 339 } // namespace v8 |
OLD | NEW |