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/compiler/simplified-lowering.h" | 5 #include "src/compiler/simplified-lowering.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 i < NodeProperties::PastEffectIndex(node); ++i) { | 243 i < NodeProperties::PastEffectIndex(node); ++i) { |
244 Enqueue(node->InputAt(i)); // Effect inputs: just visit | 244 Enqueue(node->InputAt(i)); // Effect inputs: just visit |
245 } | 245 } |
246 for (int i = std::max(index, NodeProperties::FirstControlIndex(node)); | 246 for (int i = std::max(index, NodeProperties::FirstControlIndex(node)); |
247 i < NodeProperties::PastControlIndex(node); ++i) { | 247 i < NodeProperties::PastControlIndex(node); ++i) { |
248 Enqueue(node->InputAt(i)); // Control inputs: just visit | 248 Enqueue(node->InputAt(i)); // Control inputs: just visit |
249 } | 249 } |
250 } | 250 } |
251 | 251 |
252 // The default, most general visitation case. For {node}, process all value, | 252 // The default, most general visitation case. For {node}, process all value, |
253 // context, effect, and control inputs, assuming that value inputs should have | 253 // context, frame state, effect, and control inputs, assuming that value |
254 // {kRepTagged} representation and can observe all output values {kTypeAny}. | 254 // inputs should have {kRepTagged} representation and can observe all output |
| 255 // values {kTypeAny}. |
255 void VisitInputs(Node* node) { | 256 void VisitInputs(Node* node) { |
256 auto i = node->input_edges().begin(); | 257 int tagged_count = node->op()->ValueInputCount() + |
257 for (int j = node->op()->ValueInputCount(); j > 0; ++i, j--) { | 258 OperatorProperties::GetContextInputCount(node->op()); |
258 ProcessInput(node, (*i).index(), kMachAnyTagged); // Value inputs | 259 // Visit value and context inputs as tagged. |
| 260 for (int i = 0; i < tagged_count; i++) { |
| 261 ProcessInput(node, i, kMachAnyTagged); |
259 } | 262 } |
260 for (int j = OperatorProperties::GetContextInputCount(node->op()); j > 0; | 263 // Only enqueue other inputs (framestates, effects, control). |
261 ++i, j--) { | 264 for (int i = tagged_count; i < node->InputCount(); i++) { |
262 ProcessInput(node, (*i).index(), kMachAnyTagged); // Context inputs | 265 Enqueue(node->InputAt(i)); |
263 } | 266 } |
264 for (int j = OperatorProperties::GetFrameStateInputCount(node->op()); j > 0; | 267 // Assume the output is tagged. |
265 ++i, j--) { | |
266 Enqueue((*i).to()); // FrameState inputs: just visit | |
267 } | |
268 for (int j = node->op()->EffectInputCount(); j > 0; ++i, j--) { | |
269 Enqueue((*i).to()); // Effect inputs: just visit | |
270 } | |
271 for (int j = node->op()->ControlInputCount(); j > 0; ++i, j--) { | |
272 Enqueue((*i).to()); // Control inputs: just visit | |
273 } | |
274 DCHECK(i == node->input_edges().end()); | |
275 SetOutput(node, kMachAnyTagged); | 268 SetOutput(node, kMachAnyTagged); |
276 } | 269 } |
277 | 270 |
278 // Helper for binops of the R x L -> O variety. | 271 // Helper for binops of the R x L -> O variety. |
279 void VisitBinop(Node* node, MachineTypeUnion left_use, | 272 void VisitBinop(Node* node, MachineTypeUnion left_use, |
280 MachineTypeUnion right_use, MachineTypeUnion output) { | 273 MachineTypeUnion right_use, MachineTypeUnion output) { |
281 DCHECK_EQ(2, node->InputCount()); | 274 DCHECK_EQ(2, node->InputCount()); |
282 ProcessInput(node, 0, left_use); | 275 ProcessInput(node, 0, left_use); |
283 ProcessInput(node, 1, right_use); | 276 ProcessInput(node, 1, right_use); |
284 SetOutput(node, output); | 277 SetOutput(node, output); |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
400 int values = node->op()->ValueInputCount(); | 393 int values = node->op()->ValueInputCount(); |
401 | 394 |
402 if (lower()) { | 395 if (lower()) { |
403 // Update the phi operator. | 396 // Update the phi operator. |
404 MachineType type = static_cast<MachineType>(output_type); | 397 MachineType type = static_cast<MachineType>(output_type); |
405 if (type != OpParameter<MachineType>(node)) { | 398 if (type != OpParameter<MachineType>(node)) { |
406 node->set_op(lowering->common()->Phi(type, values)); | 399 node->set_op(lowering->common()->Phi(type, values)); |
407 } | 400 } |
408 | 401 |
409 // Convert inputs to the output representation of this phi. | 402 // Convert inputs to the output representation of this phi. |
410 for (Edge const edge : node->input_edges()) { | 403 for (int i = 0; i < node->InputCount(); i++) { |
411 // TODO(titzer): it'd be nice to have distinguished edge kinds here. | 404 ProcessInput(node, i, i < values ? output_type : 0); |
412 ProcessInput(node, edge.index(), values > 0 ? output_type : 0); | |
413 values--; | |
414 } | 405 } |
415 } else { | 406 } else { |
416 // Propagate {use} of the phi to value inputs, and 0 to control. | 407 // Propagate {use} of the phi to value inputs, and 0 to control. |
417 MachineType use_type = | 408 MachineType use_type = |
418 static_cast<MachineType>((use & kTypeMask) | output); | 409 static_cast<MachineType>((use & kTypeMask) | output); |
419 for (Edge const edge : node->input_edges()) { | 410 for (int i = 0; i < node->InputCount(); i++) { |
420 // TODO(titzer): it'd be nice to have distinguished edge kinds here. | 411 ProcessInput(node, i, i < values ? use_type : 0); |
421 ProcessInput(node, edge.index(), values > 0 ? use_type : 0); | |
422 values--; | |
423 } | 412 } |
424 } | 413 } |
425 } | 414 } |
426 | 415 |
427 void VisitStateValues(Node* node) { | 416 void VisitStateValues(Node* node) { |
428 if (phase_ == PROPAGATE) { | 417 if (phase_ == PROPAGATE) { |
429 for (int i = 0; i < node->InputCount(); i++) { | 418 for (int i = 0; i < node->InputCount(); i++) { |
430 Enqueue(node->InputAt(i), kTypeAny); | 419 Enqueue(node->InputAt(i), kTypeAny); |
431 } | 420 } |
432 } else { | 421 } else { |
(...skipping 1162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1595 | 1584 |
1596 void SimplifiedLowering::DoStringLessThanOrEqual(Node* node) { | 1585 void SimplifiedLowering::DoStringLessThanOrEqual(Node* node) { |
1597 node->set_op(machine()->IntLessThanOrEqual()); | 1586 node->set_op(machine()->IntLessThanOrEqual()); |
1598 node->ReplaceInput(0, StringComparison(node, true)); | 1587 node->ReplaceInput(0, StringComparison(node, true)); |
1599 node->ReplaceInput(1, jsgraph()->SmiConstant(EQUAL)); | 1588 node->ReplaceInput(1, jsgraph()->SmiConstant(EQUAL)); |
1600 } | 1589 } |
1601 | 1590 |
1602 } // namespace compiler | 1591 } // namespace compiler |
1603 } // namespace internal | 1592 } // namespace internal |
1604 } // namespace v8 | 1593 } // namespace v8 |
OLD | NEW |