diff options
Diffstat (limited to 'deps/v8/src/compiler/simplified-lowering.cc')
-rw-r--r-- | deps/v8/src/compiler/simplified-lowering.cc | 119 |
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); } |