diff options
author | Michaël Zasso <targos@protonmail.com> | 2019-08-01 08:38:30 +0200 |
---|---|---|
committer | Michaël Zasso <targos@protonmail.com> | 2019-08-01 12:53:56 +0200 |
commit | 2dcc3665abf57c3607cebffdeeca062f5894885d (patch) | |
tree | 4f560748132edcfb4c22d6f967a7e80d23d7ea2c /deps/v8/src/compiler/map-inference.cc | |
parent | 1ee47d550c6de132f06110aa13eceb7551d643b3 (diff) | |
download | android-node-v8-2dcc3665abf57c3607cebffdeeca062f5894885d.tar.gz android-node-v8-2dcc3665abf57c3607cebffdeeca062f5894885d.tar.bz2 android-node-v8-2dcc3665abf57c3607cebffdeeca062f5894885d.zip |
deps: update V8 to 7.6.303.28
PR-URL: https://github.com/nodejs/node/pull/28016
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Refael Ackermann (רפאל פלחי) <refack@gmail.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com>
Reviewed-By: Jiawen Geng <technicalcute@gmail.com>
Diffstat (limited to 'deps/v8/src/compiler/map-inference.cc')
-rw-r--r-- | deps/v8/src/compiler/map-inference.cc | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/deps/v8/src/compiler/map-inference.cc b/deps/v8/src/compiler/map-inference.cc new file mode 100644 index 0000000000..f43ba0d155 --- /dev/null +++ b/deps/v8/src/compiler/map-inference.cc @@ -0,0 +1,149 @@ +// Copyright 2019 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "src/compiler/map-inference.h" + +#include "src/compiler/compilation-dependencies.h" +#include "src/compiler/js-graph.h" +#include "src/compiler/simplified-operator.h" +#include "src/compiler/vector-slot-pair.h" +#include "src/objects/map-inl.h" +#include "src/zone/zone-handle-set.h" + +namespace v8 { +namespace internal { +namespace compiler { + +MapInference::MapInference(JSHeapBroker* broker, Node* object, Node* effect) + : broker_(broker), object_(object) { + ZoneHandleSet<Map> maps; + auto result = + NodeProperties::InferReceiverMaps(broker_, object_, effect, &maps); + maps_.insert(maps_.end(), maps.begin(), maps.end()); + maps_state_ = (result == NodeProperties::kUnreliableReceiverMaps) + ? kUnreliableDontNeedGuard + : kReliableOrGuarded; + DCHECK_EQ(maps_.empty(), result == NodeProperties::kNoReceiverMaps); +} + +MapInference::~MapInference() { CHECK(Safe()); } + +bool MapInference::Safe() const { return maps_state_ != kUnreliableNeedGuard; } + +void MapInference::SetNeedGuardIfUnreliable() { + CHECK(HaveMaps()); + if (maps_state_ == kUnreliableDontNeedGuard) { + maps_state_ = kUnreliableNeedGuard; + } +} + +void MapInference::SetGuarded() { maps_state_ = kReliableOrGuarded; } + +bool MapInference::HaveMaps() const { return !maps_.empty(); } + +bool MapInference::AllOfInstanceTypesAreJSReceiver() const { + return AllOfInstanceTypesUnsafe(InstanceTypeChecker::IsJSReceiver); +} + +bool MapInference::AllOfInstanceTypesAre(InstanceType type) const { + CHECK(!InstanceTypeChecker::IsString(type)); + return AllOfInstanceTypesUnsafe( + [type](InstanceType other) { return type == other; }); +} + +bool MapInference::AnyOfInstanceTypesAre(InstanceType type) const { + CHECK(!InstanceTypeChecker::IsString(type)); + return AnyOfInstanceTypesUnsafe( + [type](InstanceType other) { return type == other; }); +} + +bool MapInference::AllOfInstanceTypes(std::function<bool(InstanceType)> f) { + SetNeedGuardIfUnreliable(); + return AllOfInstanceTypesUnsafe(f); +} + +bool MapInference::AllOfInstanceTypesUnsafe( + std::function<bool(InstanceType)> f) const { + // TODO(neis): Brokerize the MapInference. + AllowHandleDereference allow_handle_deref; + CHECK(HaveMaps()); + + return std::all_of(maps_.begin(), maps_.end(), + [f](Handle<Map> map) { return f(map->instance_type()); }); +} + +bool MapInference::AnyOfInstanceTypesUnsafe( + std::function<bool(InstanceType)> f) const { + AllowHandleDereference allow_handle_deref; + CHECK(HaveMaps()); + + return std::any_of(maps_.begin(), maps_.end(), + [f](Handle<Map> map) { return f(map->instance_type()); }); +} + +MapHandles const& MapInference::GetMaps() { + SetNeedGuardIfUnreliable(); + return maps_; +} + +void MapInference::InsertMapChecks(JSGraph* jsgraph, Node** effect, + Node* control, + const VectorSlotPair& feedback) { + CHECK(HaveMaps()); + CHECK(feedback.IsValid()); + ZoneHandleSet<Map> maps; + for (Handle<Map> map : maps_) maps.insert(map, jsgraph->graph()->zone()); + *effect = jsgraph->graph()->NewNode( + jsgraph->simplified()->CheckMaps(CheckMapsFlag::kNone, maps, feedback), + object_, *effect, control); + SetGuarded(); +} + +bool MapInference::RelyOnMapsViaStability( + CompilationDependencies* dependencies) { + CHECK(HaveMaps()); + return RelyOnMapsHelper(dependencies, nullptr, nullptr, nullptr, {}); +} + +bool MapInference::RelyOnMapsPreferStability( + CompilationDependencies* dependencies, JSGraph* jsgraph, Node** effect, + Node* control, const VectorSlotPair& feedback) { + CHECK(HaveMaps()); + if (Safe()) return false; + if (RelyOnMapsViaStability(dependencies)) return true; + CHECK(RelyOnMapsHelper(nullptr, jsgraph, effect, control, feedback)); + return false; +} + +bool MapInference::RelyOnMapsHelper(CompilationDependencies* dependencies, + JSGraph* jsgraph, Node** effect, + Node* control, + const VectorSlotPair& feedback) { + if (Safe()) return true; + + auto is_stable = [](Handle<Map> map) { return map->is_stable(); }; + if (dependencies != nullptr && + std::all_of(maps_.cbegin(), maps_.cend(), is_stable)) { + for (Handle<Map> map : maps_) { + dependencies->DependOnStableMap(MapRef(broker_, map)); + } + SetGuarded(); + return true; + } else if (feedback.IsValid()) { + InsertMapChecks(jsgraph, effect, control, feedback); + return true; + } else { + return false; + } +} + +Reduction MapInference::NoChange() { + SetGuarded(); + maps_.clear(); // Just to make some CHECKs fail if {this} gets used after. + return Reducer::NoChange(); +} + +} // namespace compiler +} // namespace internal +} // namespace v8 |