Index: src/compiler/simplified-lowering.cc |
diff --git a/src/compiler/simplified-lowering.cc b/src/compiler/simplified-lowering.cc |
index 06df207149cccaf3d71405360b3695cf8fd093d0..ab5551ace6592aa344459fe0e18d345a5b8ed503 100644 |
--- a/src/compiler/simplified-lowering.cc |
+++ b/src/compiler/simplified-lowering.cc |
@@ -188,6 +188,19 @@ class RepresentationSelector { |
} |
} |
+ void ProcessRemainingInputs(Node* node, int index) { |
+ DCHECK_GE(index, NodeProperties::PastValueIndex(node)); |
+ DCHECK_GE(index, NodeProperties::PastContextIndex(node)); |
+ for (int i = std::max(index, NodeProperties::FirstEffectIndex(node)); |
+ i < NodeProperties::PastEffectIndex(node); ++i) { |
+ Enqueue(node->InputAt(i)); // Effect inputs: just visit |
+ } |
+ for (int i = std::max(index, NodeProperties::FirstControlIndex(node)); |
+ i < NodeProperties::PastControlIndex(node); ++i) { |
+ Enqueue(node->InputAt(i)); // Control inputs: just visit |
+ } |
+ } |
+ |
// The default, most general visitation case. For {node}, process all value, |
// context, effect, and control inputs, assuming that value inputs should have |
// {kRepTagged} representation and can observe all output values {kTypeAny}. |
@@ -529,6 +542,7 @@ class RepresentationSelector { |
case IrOpcode::kLoadField: { |
FieldAccess access = FieldAccessOf(node->op()); |
ProcessInput(node, 0, changer_->TypeForBasePointer(access)); |
+ ProcessRemainingInputs(node, 1); |
SetOutput(node, access.machine_type); |
if (lower()) lowering->DoLoadField(node); |
break; |
@@ -537,6 +551,7 @@ class RepresentationSelector { |
FieldAccess access = FieldAccessOf(node->op()); |
ProcessInput(node, 0, changer_->TypeForBasePointer(access)); |
ProcessInput(node, 1, access.machine_type); |
+ ProcessRemainingInputs(node, 2); |
SetOutput(node, 0); |
if (lower()) lowering->DoStoreField(node); |
break; |
@@ -545,6 +560,7 @@ class RepresentationSelector { |
ElementAccess access = ElementAccessOf(node->op()); |
ProcessInput(node, 0, changer_->TypeForBasePointer(access)); |
ProcessInput(node, 1, kMachInt32); // element index |
+ ProcessRemainingInputs(node, 2); |
SetOutput(node, access.machine_type); |
if (lower()) lowering->DoLoadElement(node); |
break; |
@@ -554,6 +570,7 @@ class RepresentationSelector { |
ProcessInput(node, 0, changer_->TypeForBasePointer(access)); |
ProcessInput(node, 1, kMachInt32); // element index |
ProcessInput(node, 2, access.machine_type); |
+ ProcessRemainingInputs(node, 3); |
SetOutput(node, 0); |
if (lower()) lowering->DoStoreElement(node); |
break; |
@@ -568,6 +585,7 @@ class RepresentationSelector { |
MachineType machine_type = OpParameter<MachineType>(node); |
ProcessInput(node, 0, tBase); // pointer or object |
ProcessInput(node, 1, kMachInt32); // index |
+ ProcessRemainingInputs(node, 2); |
SetOutput(node, machine_type); |
break; |
} |
@@ -578,6 +596,7 @@ class RepresentationSelector { |
ProcessInput(node, 0, tBase); // pointer or object |
ProcessInput(node, 1, kMachInt32); // index |
ProcessInput(node, 2, rep.machine_type); |
+ ProcessRemainingInputs(node, 3); |
SetOutput(node, 0); |
break; |
} |