| Index: src/compiler/load-elimination.cc
|
| diff --git a/src/compiler/load-elimination.cc b/src/compiler/load-elimination.cc
|
| index d216b0dc4cd3b01cec5b0e712b2e7464597d058d..f6ee350457480538a4ffdf202f29c6ffe68215bd 100644
|
| --- a/src/compiler/load-elimination.cc
|
| +++ b/src/compiler/load-elimination.cc
|
| @@ -195,13 +195,23 @@ void LoadElimination::AbstractChecks::Print() const {
|
| }
|
| }
|
|
|
| -Node* LoadElimination::AbstractElements::Lookup(Node* object,
|
| - Node* index) const {
|
| +namespace {
|
| +
|
| +bool IsCompatible(MachineRepresentation r1, MachineRepresentation r2) {
|
| + if (r1 == r2) return true;
|
| + return IsAnyTagged(r1) && IsAnyTagged(r2);
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +Node* LoadElimination::AbstractElements::Lookup(
|
| + Node* object, Node* index, MachineRepresentation representation) const {
|
| for (Element const element : elements_) {
|
| if (element.object == nullptr) continue;
|
| DCHECK_NOT_NULL(element.index);
|
| DCHECK_NOT_NULL(element.value);
|
| - if (MustAlias(object, element.object) && MustAlias(index, element.index)) {
|
| + if (MustAlias(object, element.object) && MustAlias(index, element.index) &&
|
| + IsCompatible(representation, element.representation)) {
|
| return element.value;
|
| }
|
| }
|
| @@ -470,22 +480,26 @@ LoadElimination::AbstractState const* LoadElimination::AbstractState::KillMaps(
|
| return this;
|
| }
|
|
|
| -Node* LoadElimination::AbstractState::LookupElement(Node* object,
|
| - Node* index) const {
|
| +Node* LoadElimination::AbstractState::LookupElement(
|
| + Node* object, Node* index, MachineRepresentation representation) const {
|
| if (this->elements_) {
|
| - return this->elements_->Lookup(object, index);
|
| + return this->elements_->Lookup(object, index, representation);
|
| }
|
| return nullptr;
|
| }
|
|
|
| LoadElimination::AbstractState const*
|
| LoadElimination::AbstractState::AddElement(Node* object, Node* index,
|
| - Node* value, Zone* zone) const {
|
| + Node* value,
|
| + MachineRepresentation representation,
|
| + Zone* zone) const {
|
| AbstractState* that = new (zone) AbstractState(*this);
|
| if (that->elements_) {
|
| - that->elements_ = that->elements_->Extend(object, index, value, zone);
|
| + that->elements_ =
|
| + that->elements_->Extend(object, index, value, representation, zone);
|
| } else {
|
| - that->elements_ = new (zone) AbstractElements(object, index, value, zone);
|
| + that->elements_ =
|
| + new (zone) AbstractElements(object, index, value, representation, zone);
|
| }
|
| return that;
|
| }
|
| @@ -823,7 +837,8 @@ Reduction LoadElimination::ReduceLoadElement(Node* node) {
|
| case MachineRepresentation::kTaggedSigned:
|
| case MachineRepresentation::kTaggedPointer:
|
| case MachineRepresentation::kTagged:
|
| - if (Node* replacement = state->LookupElement(object, index)) {
|
| + if (Node* replacement = state->LookupElement(
|
| + object, index, access.machine_type.representation())) {
|
| // Make sure we don't resurrect dead {replacement} nodes.
|
| if (!replacement->IsDead()) {
|
| // We might need to guard the {replacement} if the type of the
|
| @@ -838,7 +853,8 @@ Reduction LoadElimination::ReduceLoadElement(Node* node) {
|
| return Replace(replacement);
|
| }
|
| }
|
| - state = state->AddElement(object, index, node, zone());
|
| + state = state->AddElement(object, index, node,
|
| + access.machine_type.representation(), zone());
|
| return UpdateState(node, state);
|
| }
|
| return NoChange();
|
| @@ -852,7 +868,8 @@ Reduction LoadElimination::ReduceStoreElement(Node* node) {
|
| Node* const effect = NodeProperties::GetEffectInput(node);
|
| AbstractState const* state = node_states_.Get(effect);
|
| if (state == nullptr) return NoChange();
|
| - Node* const old_value = state->LookupElement(object, index);
|
| + Node* const old_value =
|
| + state->LookupElement(object, index, access.machine_type.representation());
|
| if (old_value == new_value) {
|
| // This store is fully redundant.
|
| return Replace(effect);
|
| @@ -880,7 +897,8 @@ Reduction LoadElimination::ReduceStoreElement(Node* node) {
|
| case MachineRepresentation::kTaggedSigned:
|
| case MachineRepresentation::kTaggedPointer:
|
| case MachineRepresentation::kTagged:
|
| - state = state->AddElement(object, index, new_value, zone());
|
| + state = state->AddElement(object, index, new_value,
|
| + access.machine_type.representation(), zone());
|
| break;
|
| }
|
| return UpdateState(node, state);
|
|
|