| Index: src/compiler/state-values-utils.cc
|
| diff --git a/src/compiler/state-values-utils.cc b/src/compiler/state-values-utils.cc
|
| index 2d643d78ab429478da472acbb3b77853e8456c2a..de783b1a4f16837fd2d7de62f1e36c6139c9ddaf 100644
|
| --- a/src/compiler/state-values-utils.cc
|
| +++ b/src/compiler/state-values-utils.cc
|
| @@ -173,6 +173,7 @@ Node* StateValuesCache::GetNodeForValues(Node** values, size_t count) {
|
| #if DEBUG
|
| for (size_t i = 0; i < count; i++) {
|
| DCHECK_NE(values[i]->opcode(), IrOpcode::kStateValues);
|
| + DCHECK_NE(values[i]->opcode(), IrOpcode::kTypedStateValues);
|
| }
|
| #endif
|
| if (count == 0) {
|
| @@ -190,7 +191,8 @@ Node* StateValuesCache::GetNodeForValues(Node** values, size_t count) {
|
| Node* tree = BuildTree(&it, height);
|
|
|
| // If the 'tree' is a single node, equip it with a StateValues wrapper.
|
| - if (tree->opcode() != IrOpcode::kStateValues) {
|
| + if (tree->opcode() != IrOpcode::kStateValues &&
|
| + tree->opcode() != IrOpcode::kTypedStateValues) {
|
| tree = GetValuesNodeFromCache(&tree, 1);
|
| }
|
|
|
| @@ -249,7 +251,8 @@ void StateValuesAccess::iterator::Advance() {
|
| return;
|
| }
|
| Top()->index++;
|
| - } else if (node->InputAt(index)->opcode() == IrOpcode::kStateValues) {
|
| + } else if (node->InputAt(index)->opcode() == IrOpcode::kStateValues ||
|
| + node->InputAt(index)->opcode() == IrOpcode::kTypedStateValues) {
|
| // Nested state, we need to push to the stack.
|
| Push(node->InputAt(index));
|
| } else {
|
| @@ -265,6 +268,19 @@ Node* StateValuesAccess::iterator::node() {
|
| }
|
|
|
|
|
| +MachineType StateValuesAccess::iterator::type() {
|
| + Node* state = Top()->node;
|
| + if (state->opcode() == IrOpcode::kStateValues) {
|
| + return kMachAnyTagged;
|
| + } else {
|
| + DCHECK_EQ(IrOpcode::kTypedStateValues, state->opcode());
|
| + ZoneVector<MachineType>* types =
|
| + OpParameter<ZoneVector<MachineType>*>(state);
|
| + return (*types)[Top()->index];
|
| + }
|
| +}
|
| +
|
| +
|
| bool StateValuesAccess::iterator::operator!=(iterator& other) {
|
| // We only allow comparison with end().
|
| CHECK(other.done());
|
| @@ -278,13 +294,16 @@ StateValuesAccess::iterator& StateValuesAccess::iterator::operator++() {
|
| }
|
|
|
|
|
| -Node* StateValuesAccess::iterator::operator*() { return node(); }
|
| +StateValuesAccess::TypedNode StateValuesAccess::iterator::operator*() {
|
| + return TypedNode(node(), type());
|
| +}
|
|
|
|
|
| size_t StateValuesAccess::size() {
|
| size_t count = 0;
|
| for (int i = 0; i < node_->InputCount(); i++) {
|
| - if (node_->InputAt(i)->opcode() == IrOpcode::kStateValues) {
|
| + if (node_->InputAt(i)->opcode() == IrOpcode::kStateValues ||
|
| + node_->InputAt(i)->opcode() == IrOpcode::kTypedStateValues) {
|
| count += StateValuesAccess(node_->InputAt(i)).size();
|
| } else {
|
| count++;
|
|
|