summaryrefslogtreecommitdiff
path: root/deps/v8/src/compiler/simplified-lowering.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/compiler/simplified-lowering.cc')
-rw-r--r--deps/v8/src/compiler/simplified-lowering.cc119
1 files changed, 83 insertions, 36 deletions
diff --git a/deps/v8/src/compiler/simplified-lowering.cc b/deps/v8/src/compiler/simplified-lowering.cc
index bbdbdfefd8..15d682bd29 100644
--- a/deps/v8/src/compiler/simplified-lowering.cc
+++ b/deps/v8/src/compiler/simplified-lowering.cc
@@ -23,6 +23,7 @@
#include "src/compiler/operation-typer.h"
#include "src/compiler/operator-properties.h"
#include "src/compiler/representation-change.h"
+#include "src/compiler/simplified-lowering-verifier.h"
#include "src/compiler/simplified-operator.h"
#include "src/compiler/type-cache.h"
#include "src/numbers/conversions-inl.h"
@@ -160,7 +161,7 @@ UseInfo TruncatingUseInfoFromRepresentation(MachineRepresentation rep) {
return UseInfo::Bool();
case MachineRepresentation::kCompressedPointer:
case MachineRepresentation::kCompressed:
- case MachineRepresentation::kCagedPointer:
+ case MachineRepresentation::kSandboxedPointer:
case MachineRepresentation::kSimd128:
case MachineRepresentation::kNone:
break;
@@ -312,7 +313,8 @@ class RepresentationSelector {
SourcePositionTable* source_positions,
NodeOriginTable* node_origins,
TickCounter* tick_counter, Linkage* linkage,
- ObserveNodeManager* observe_node_manager)
+ ObserveNodeManager* observe_node_manager,
+ SimplifiedLoweringVerifier* verifier)
: jsgraph_(jsgraph),
zone_(zone),
might_need_revisit_(zone),
@@ -331,9 +333,12 @@ class RepresentationSelector {
op_typer_(broker, graph_zone()),
tick_counter_(tick_counter),
linkage_(linkage),
- observe_node_manager_(observe_node_manager) {
+ observe_node_manager_(observe_node_manager),
+ verifier_(verifier) {
}
+ bool verification_enabled() const { return verifier_ != nullptr; }
+
void ResetNodeInfoState() {
// Clean up for the next phase.
for (NodeInfo& info : info_) {
@@ -553,6 +558,12 @@ class RepresentationSelector {
// Generates a pre-order traversal of the nodes, starting with End.
void GenerateTraversal() {
+ // Reset previous state.
+ ResetNodeInfoState();
+ traversal_nodes_.clear();
+ count_ = graph()->NodeCount();
+ info_.resize(count_);
+
ZoneStack<NodeState> stack(zone_);
stack.push({graph()->end(), 0});
@@ -710,11 +721,46 @@ class RepresentationSelector {
}
}
+ void RunVerifyPhase() {
+ DCHECK_NOT_NULL(verifier_);
+
+ TRACE("--{Verify Phase}--\n");
+
+ // Generate a new traversal containing all the new nodes created during
+ // lowering.
+ GenerateTraversal();
+
+ // Set node types to the refined types computed during retyping.
+ for (Node* node : traversal_nodes_) {
+ NodeInfo* info = GetInfo(node);
+ if (!info->feedback_type().IsInvalid()) {
+ NodeProperties::SetType(node, info->feedback_type());
+ }
+ }
+
+ // Verify all nodes.
+ for (Node* node : traversal_nodes_) verifier_->VisitNode(node, op_typer_);
+
+ // Eliminate all introduced TypeGuard nodes.
+ for (Node* node : verifier_->recorded_type_guards()) {
+ Node* input = node->InputAt(0);
+ DCHECK_EQ(node->InputAt(1), graph()->start());
+ DCHECK_EQ(node->InputAt(2), graph()->start());
+ DisconnectFromEffectAndControl(node);
+ node->ReplaceUses(input);
+ node->Kill();
+ }
+ }
+
void Run(SimplifiedLowering* lowering) {
GenerateTraversal();
RunPropagatePhase();
RunRetypePhase();
RunLowerPhase(lowering);
+
+ if (verification_enabled()) {
+ RunVerifyPhase();
+ }
}
// Just assert for Retype and Lower. Propagate specialized below.
@@ -1074,8 +1120,7 @@ class RepresentationSelector {
} else if (type.Is(Type::BigInt()) && use.IsUsedAsWord64()) {
return MachineRepresentation::kWord64;
} else if (type.Is(Type::ExternalPointer()) ||
- type.Is(Type::SandboxedExternalPointer()) ||
- type.Is(Type::CagedPointer())) {
+ type.Is(Type::SandboxedPointer())) {
return MachineType::PointerRepresentation();
}
return MachineRepresentation::kTagged;
@@ -2061,7 +2106,10 @@ class RepresentationSelector {
VisitLeaf<T>(node, MachineRepresentation::kTaggedSigned);
if (lower<T>()) {
intptr_t smi = bit_cast<intptr_t>(Smi::FromInt(value_as_int));
- DeferReplacement(node, lowering->jsgraph()->IntPtrConstant(smi));
+ Node* constant = InsertTypeGuardForVerifier(
+ NodeProperties::GetType(node),
+ lowering->jsgraph()->IntPtrConstant(smi));
+ DeferReplacement(node, constant);
}
return;
}
@@ -2100,17 +2148,6 @@ class RepresentationSelector {
//------------------------------------------------------------------
// JavaScript operators.
//------------------------------------------------------------------
- case IrOpcode::kToBoolean: {
- if (truncation.IsUsedAsBool()) {
- ProcessInput<T>(node, 0, UseInfo::Bool());
- SetOutput<T>(node, MachineRepresentation::kBit);
- if (lower<T>()) DeferReplacement(node, node->InputAt(0));
- } else {
- VisitInputs<T>(node);
- SetOutput<T>(node, MachineRepresentation::kTaggedPointer);
- }
- return;
- }
case IrOpcode::kJSToNumber:
case IrOpcode::kJSToNumberConvertBigInt:
case IrOpcode::kJSToNumeric: {
@@ -2135,6 +2172,17 @@ class RepresentationSelector {
//------------------------------------------------------------------
// Simplified operators.
//------------------------------------------------------------------
+ case IrOpcode::kToBoolean: {
+ if (truncation.IsUsedAsBool()) {
+ ProcessInput<T>(node, 0, UseInfo::Bool());
+ SetOutput<T>(node, MachineRepresentation::kBit);
+ if (lower<T>()) DeferReplacement(node, node->InputAt(0));
+ } else {
+ VisitInputs<T>(node);
+ SetOutput<T>(node, MachineRepresentation::kTaggedPointer);
+ }
+ return;
+ }
case IrOpcode::kBooleanNot: {
if (lower<T>()) {
NodeInfo* input_info = GetInfo(node->InputAt(0));
@@ -3075,22 +3123,6 @@ class RepresentationSelector {
return VisitUnop<T>(node, UseInfo::AnyTagged(),
MachineRepresentation::kTaggedPointer);
}
- case IrOpcode::kTierUpCheck: {
- ProcessInput<T>(node, 0, UseInfo::AnyTagged());
- ProcessInput<T>(node, 1, UseInfo::AnyTagged());
- ProcessInput<T>(node, 2, UseInfo::AnyTagged());
- ProcessInput<T>(node, 3, UseInfo::TruncatingWord32());
- ProcessInput<T>(node, 4, UseInfo::AnyTagged());
- ProcessRemainingInputs<T>(node, 5);
- SetOutput<T>(node, MachineRepresentation::kNone);
- return;
- }
- case IrOpcode::kUpdateInterruptBudget: {
- ProcessInput<T>(node, 0, UseInfo::AnyTagged());
- ProcessRemainingInputs<T>(node, 1);
- SetOutput<T>(node, MachineRepresentation::kNone);
- return;
- }
case IrOpcode::kNewConsString: {
ProcessInput<T>(node, 0, UseInfo::TruncatingWord32()); // length
ProcessInput<T>(node, 1, UseInfo::AnyTagged()); // first
@@ -4058,6 +4090,16 @@ class RepresentationSelector {
NotifyNodeReplaced(node, replacement);
}
+ Node* InsertTypeGuardForVerifier(const Type& type, Node* node) {
+ if (verification_enabled()) {
+ DCHECK(!type.IsInvalid());
+ node = graph()->NewNode(common()->TypeGuard(type), node, graph()->start(),
+ graph()->start());
+ verifier_->RecordTypeGuard(node);
+ }
+ return node;
+ }
+
private:
void ChangeOp(Node* node, const Operator* new_op) {
compiler::NodeProperties::ChangeOp(node, new_op);
@@ -4077,7 +4119,7 @@ class RepresentationSelector {
Zone* zone_; // Temporary zone.
// Map from node to its uses that might need to be revisited.
ZoneMap<Node*, ZoneVector<Node*>> might_need_revisit_;
- size_t const count_; // number of nodes in the graph
+ size_t count_; // number of nodes in the graph
ZoneVector<NodeInfo> info_; // node id -> usage information
#ifdef DEBUG
ZoneVector<InputUseInfos> node_input_use_infos_; // Debug information about
@@ -4104,6 +4146,7 @@ class RepresentationSelector {
TickCounter* const tick_counter_;
Linkage* const linkage_;
ObserveNodeManager* const observe_node_manager_;
+ SimplifiedLoweringVerifier* verifier_; // Used to verify output graph.
NodeInfo* GetInfo(Node* node) {
DCHECK(node->id() < count_);
@@ -4286,10 +4329,14 @@ SimplifiedLowering::SimplifiedLowering(JSGraph* jsgraph, JSHeapBroker* broker,
observe_node_manager_(observe_node_manager) {}
void SimplifiedLowering::LowerAllNodes() {
- RepresentationChanger changer(jsgraph(), broker_);
+ SimplifiedLoweringVerifier* verifier = nullptr;
+ if (FLAG_verify_simplified_lowering) {
+ verifier = zone_->New<SimplifiedLoweringVerifier>(zone_, graph());
+ }
+ RepresentationChanger changer(jsgraph(), broker_, verifier);
RepresentationSelector selector(
jsgraph(), broker_, zone_, &changer, source_positions_, node_origins_,
- tick_counter_, linkage_, observe_node_manager_);
+ tick_counter_, linkage_, observe_node_manager_, verifier);
selector.Run(this);
}