aboutsummaryrefslogtreecommitdiff
path: root/deps/v8/src/compiler/load-elimination.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/compiler/load-elimination.cc')
-rw-r--r--deps/v8/src/compiler/load-elimination.cc28
1 files changed, 16 insertions, 12 deletions
diff --git a/deps/v8/src/compiler/load-elimination.cc b/deps/v8/src/compiler/load-elimination.cc
index c42bfd839a..f9998723f3 100644
--- a/deps/v8/src/compiler/load-elimination.cc
+++ b/deps/v8/src/compiler/load-elimination.cc
@@ -419,14 +419,15 @@ bool LoadElimination::AbstractState::Equals(AbstractState const* that) const {
}
void LoadElimination::AbstractState::FieldsMerge(
- AbstractFields& this_fields, AbstractFields const& that_fields,
+ AbstractFields* this_fields, AbstractFields const& that_fields,
Zone* zone) {
- for (size_t i = 0; i < this_fields.size(); ++i) {
- if (this_fields[i]) {
+ for (size_t i = 0; i < this_fields->size(); ++i) {
+ AbstractField const*& this_field = (*this_fields)[i];
+ if (this_field) {
if (that_fields[i]) {
- this_fields[i] = this_fields[i]->Merge(that_fields[i], zone);
+ this_field = this_field->Merge(that_fields[i], zone);
} else {
- this_fields[i] = nullptr;
+ this_field = nullptr;
}
}
}
@@ -442,8 +443,8 @@ void LoadElimination::AbstractState::Merge(AbstractState const* that,
}
// Merge the information we have about the fields.
- FieldsMerge(this->fields_, that->fields_, zone);
- FieldsMerge(this->const_fields_, that->const_fields_, zone);
+ FieldsMerge(&this->fields_, that->fields_, zone);
+ FieldsMerge(&this->const_fields_, that->const_fields_, zone);
// Merge the information we have about the maps.
if (this->maps_) {
@@ -923,20 +924,23 @@ Reduction LoadElimination::ReduceStoreField(Node* node,
FieldInfo const* lookup_result =
state->LookupField(object, field_index, constness);
- if (lookup_result && constness == PropertyConstness::kMutable) {
+ if (lookup_result && (constness == PropertyConstness::kMutable ||
+ V8_ENABLE_DOUBLE_CONST_STORE_CHECK_BOOL)) {
// At runtime, we should never encounter
// - any store replacing existing info with a different, incompatible
// representation, nor
// - two consecutive const stores.
// However, we may see such code statically, so we guard against
// executing it by emitting Unreachable.
- // TODO(gsps): Re-enable the double const store check once we have
- // identified other FieldAccesses that should be marked mutable
- // instead of const (cf. JSCreateLowering::AllocateFastLiteral).
+ // TODO(gsps): Re-enable the double const store check even for
+ // non-debug builds once we have identified other FieldAccesses
+ // that should be marked mutable instead of const
+ // (cf. JSCreateLowering::AllocateFastLiteral).
bool incompatible_representation =
!lookup_result->name.is_null() &&
!IsCompatible(representation, lookup_result->representation);
- if (incompatible_representation) {
+ if (incompatible_representation ||
+ constness == PropertyConstness::kConst) {
Node* control = NodeProperties::GetControlInput(node);
Node* unreachable =
graph()->NewNode(common()->Unreachable(), effect, control);