[turbofan] Remove support for LazyBailout operators.
The LazyBailout operator (modelled as a nop-call) was introduced for placing a deoptimization point into exception handlers. Now that we are no longer re-entering lazy deoptimized code, the support can be removed. R=jarin@chromium.org BUG=v8:4195 LOG=n Review URL: https://codereview.chromium.org/1697503002 Cr-Commit-Position: refs/heads/master@{#34020}
This commit is contained in:
parent
d057adc83e
commit
aa31ff31a8
@ -306,7 +306,6 @@ void AstNumberingVisitor::VisitWhileStatement(WhileStatement* node) {
|
||||
void AstNumberingVisitor::VisitTryCatchStatement(TryCatchStatement* node) {
|
||||
IncrementNodeCount();
|
||||
DisableOptimization(kTryCatchStatement);
|
||||
node->set_base_id(ReserveIdRange(TryCatchStatement::num_ids()));
|
||||
Visit(node->try_block());
|
||||
Visit(node->catch_block());
|
||||
}
|
||||
@ -315,7 +314,6 @@ void AstNumberingVisitor::VisitTryCatchStatement(TryCatchStatement* node) {
|
||||
void AstNumberingVisitor::VisitTryFinallyStatement(TryFinallyStatement* node) {
|
||||
IncrementNodeCount();
|
||||
DisableOptimization(kTryFinallyStatement);
|
||||
node->set_base_id(ReserveIdRange(TryFinallyStatement::num_ids()));
|
||||
Visit(node->try_block());
|
||||
Visit(node->finally_block());
|
||||
}
|
||||
|
@ -1183,27 +1183,12 @@ class TryStatement : public Statement {
|
||||
Block* try_block() const { return try_block_; }
|
||||
void set_try_block(Block* b) { try_block_ = b; }
|
||||
|
||||
void set_base_id(int id) { base_id_ = id; }
|
||||
static int num_ids() { return parent_num_ids() + 1; }
|
||||
BailoutId HandlerId() const { return BailoutId(local_id(0)); }
|
||||
|
||||
protected:
|
||||
TryStatement(Zone* zone, Block* try_block, int pos)
|
||||
: Statement(zone, pos),
|
||||
try_block_(try_block),
|
||||
base_id_(BailoutId::None().ToInt()) {}
|
||||
static int parent_num_ids() { return 0; }
|
||||
|
||||
int base_id() const {
|
||||
DCHECK(!BailoutId(base_id_).IsNone());
|
||||
return base_id_;
|
||||
}
|
||||
: Statement(zone, pos), try_block_(try_block) {}
|
||||
|
||||
private:
|
||||
int local_id(int n) const { return base_id() + parent_num_ids() + n; }
|
||||
|
||||
Block* try_block_;
|
||||
int base_id_;
|
||||
};
|
||||
|
||||
|
||||
|
@ -473,11 +473,6 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
|
||||
frame_access_state()->ClearSPDelta();
|
||||
break;
|
||||
}
|
||||
case kArchLazyBailout: {
|
||||
EnsureSpaceForLazyDeopt();
|
||||
RecordCallPosition(instr);
|
||||
break;
|
||||
}
|
||||
case kArchPrepareCallCFunction: {
|
||||
int const num_parameters = MiscField::decode(instr->opcode());
|
||||
__ PrepareCallCFunction(num_parameters, kScratchReg);
|
||||
|
@ -573,11 +573,6 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
|
||||
frame_access_state()->ClearSPDelta();
|
||||
break;
|
||||
}
|
||||
case kArchLazyBailout: {
|
||||
EnsureSpaceForLazyDeopt();
|
||||
RecordCallPosition(instr);
|
||||
break;
|
||||
}
|
||||
case kArchPrepareCallCFunction:
|
||||
// We don't need kArchPrepareCallCFunction on arm64 as the instruction
|
||||
// selector already perform a Claim to reserve space on the stack and
|
||||
|
@ -1449,14 +1449,6 @@ void AstGraphBuilder::VisitTryCatchStatement(TryCatchStatement* stmt) {
|
||||
}
|
||||
try_control.EndTry();
|
||||
|
||||
// Insert lazy bailout point.
|
||||
// TODO(mstarzinger): We are only using a 'call' to get a lazy bailout
|
||||
// point. Ideally, we whould not re-enter optimized code when deoptimized
|
||||
// lazily. Tracked by issue v8:4195.
|
||||
NewNode(common()->LazyBailout(),
|
||||
jsgraph()->ZeroConstant(), // dummy target.
|
||||
environment()->Checkpoint(stmt->HandlerId())); // frame state.
|
||||
|
||||
// Clear message object as we enter the catch block.
|
||||
Node* the_hole = jsgraph()->TheHoleConstant();
|
||||
NewNode(javascript()->StoreMessage(), the_hole);
|
||||
@ -1501,14 +1493,6 @@ void AstGraphBuilder::VisitTryFinallyStatement(TryFinallyStatement* stmt) {
|
||||
}
|
||||
try_control.EndTry(commands->GetFallThroughToken(), fallthrough_result);
|
||||
|
||||
// Insert lazy bailout point.
|
||||
// TODO(mstarzinger): We are only using a 'call' to get a lazy bailout
|
||||
// point. Ideally, we whould not re-enter optimized code when deoptimized
|
||||
// lazily. Tracked by issue v8:4195.
|
||||
NewNode(common()->LazyBailout(),
|
||||
jsgraph()->ZeroConstant(), // dummy target.
|
||||
environment()->Checkpoint(stmt->HandlerId())); // frame state.
|
||||
|
||||
// The result value semantics depend on how the block was entered:
|
||||
// - ReturnStatement: It represents the return value being returned.
|
||||
// - ThrowStatement: It represents the exception being thrown.
|
||||
|
@ -803,11 +803,6 @@ const Operator* CommonOperatorBuilder::Call(const CallDescriptor* descriptor) {
|
||||
}
|
||||
|
||||
|
||||
const Operator* CommonOperatorBuilder::LazyBailout() {
|
||||
return Call(Linkage::GetLazyBailoutDescriptor(zone()));
|
||||
}
|
||||
|
||||
|
||||
const Operator* CommonOperatorBuilder::TailCall(
|
||||
const CallDescriptor* descriptor) {
|
||||
class TailCallOperator final : public Operator1<const CallDescriptor*> {
|
||||
|
@ -170,7 +170,6 @@ class CommonOperatorBuilder final : public ZoneObject {
|
||||
const Operator* Call(const CallDescriptor* descriptor);
|
||||
const Operator* TailCall(const CallDescriptor* descriptor);
|
||||
const Operator* Projection(size_t index);
|
||||
const Operator* LazyBailout();
|
||||
|
||||
// Constructs a new merge or phi operator with the same opcode as {op}, but
|
||||
// with {size} inputs.
|
||||
|
@ -413,11 +413,6 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
|
||||
frame_access_state()->ClearSPDelta();
|
||||
break;
|
||||
}
|
||||
case kArchLazyBailout: {
|
||||
EnsureSpaceForLazyDeopt();
|
||||
RecordCallPosition(instr);
|
||||
break;
|
||||
}
|
||||
case kArchPrepareCallCFunction: {
|
||||
// Frame alignment requires using FP-relative frame addressing.
|
||||
frame_access_state()->SetFrameAccessToFP();
|
||||
|
@ -47,7 +47,6 @@ enum class RecordWriteMode { kValueIsMap, kValueIsPointer, kValueIsAny };
|
||||
V(ArchPrepareCallCFunction) \
|
||||
V(ArchCallCFunction) \
|
||||
V(ArchPrepareTailCall) \
|
||||
V(ArchLazyBailout) \
|
||||
V(ArchJmp) \
|
||||
V(ArchLookupSwitch) \
|
||||
V(ArchTableSwitch) \
|
||||
|
@ -184,7 +184,6 @@ int InstructionScheduler::GetInstructionFlags(const Instruction* instr) const {
|
||||
case kArchCallCFunction:
|
||||
case kArchCallCodeObject:
|
||||
case kArchCallJSFunction:
|
||||
case kArchLazyBailout:
|
||||
return kHasSideEffect;
|
||||
|
||||
case kArchTailCallCodeObject:
|
||||
|
@ -568,10 +568,6 @@ void InstructionSelector::InitializeCallBuffer(Node* call, CallBuffer* buffer,
|
||||
g.UseLocation(callee, buffer->descriptor->GetInputLocation(0),
|
||||
buffer->descriptor->GetInputType(0).representation()));
|
||||
break;
|
||||
case CallDescriptor::kLazyBailout:
|
||||
// The target is ignored, but we still need to pass a value here.
|
||||
buffer->instruction_args.push_back(g.UseImmediate(callee));
|
||||
break;
|
||||
}
|
||||
DCHECK_EQ(1u, buffer->instruction_args.size());
|
||||
|
||||
@ -1459,9 +1455,6 @@ void InstructionSelector::VisitCall(Node* node, BasicBlock* handler) {
|
||||
case CallDescriptor::kCallJSFunction:
|
||||
opcode = kArchCallJSFunction | MiscField::encode(flags);
|
||||
break;
|
||||
case CallDescriptor::kLazyBailout:
|
||||
opcode = kArchLazyBailout | MiscField::encode(flags);
|
||||
break;
|
||||
}
|
||||
|
||||
// Emit the call instruction.
|
||||
|
@ -63,9 +63,6 @@ std::ostream& operator<<(std::ostream& os, const CallDescriptor::Kind& k) {
|
||||
case CallDescriptor::kCallAddress:
|
||||
os << "Addr";
|
||||
break;
|
||||
case CallDescriptor::kLazyBailout:
|
||||
os << "LazyBail";
|
||||
break;
|
||||
}
|
||||
return os;
|
||||
}
|
||||
@ -282,31 +279,6 @@ CallDescriptor* Linkage::GetRuntimeCallDescriptor(
|
||||
}
|
||||
|
||||
|
||||
CallDescriptor* Linkage::GetLazyBailoutDescriptor(Zone* zone) {
|
||||
const size_t return_count = 0;
|
||||
const size_t parameter_count = 0;
|
||||
|
||||
LocationSignature::Builder locations(zone, return_count, parameter_count);
|
||||
MachineSignature::Builder types(zone, return_count, parameter_count);
|
||||
|
||||
// The target is ignored, but we need to give some values here.
|
||||
MachineType target_type = MachineType::AnyTagged();
|
||||
LinkageLocation target_loc = regloc(kJSFunctionRegister);
|
||||
return new (zone) CallDescriptor( // --
|
||||
CallDescriptor::kLazyBailout, // kind
|
||||
target_type, // target MachineType
|
||||
target_loc, // target location
|
||||
types.Build(), // machine_sig
|
||||
locations.Build(), // location_sig
|
||||
0, // stack_parameter_count
|
||||
Operator::kNoThrow, // properties
|
||||
kNoCalleeSaved, // callee-saved
|
||||
kNoCalleeSaved, // callee-saved fp
|
||||
CallDescriptor::kNeedsFrameState, // flags
|
||||
"lazy-bailout");
|
||||
}
|
||||
|
||||
|
||||
CallDescriptor* Linkage::GetJSCallDescriptor(Zone* zone, bool is_osr,
|
||||
int js_parameter_count,
|
||||
CallDescriptor::Flags flags) {
|
||||
|
@ -146,8 +146,7 @@ class CallDescriptor final : public ZoneObject {
|
||||
enum Kind {
|
||||
kCallCodeObject, // target is a Code object
|
||||
kCallJSFunction, // target is a JSFunction object
|
||||
kCallAddress, // target is a machine pointer
|
||||
kLazyBailout // the call is no-op, only used for lazy bailout
|
||||
kCallAddress // target is a machine pointer
|
||||
};
|
||||
|
||||
enum Flag {
|
||||
@ -325,8 +324,6 @@ class Linkage : public ZoneObject {
|
||||
Zone* zone, Runtime::FunctionId function, int parameter_count,
|
||||
Operator::Properties properties, CallDescriptor::Flags flags);
|
||||
|
||||
static CallDescriptor* GetLazyBailoutDescriptor(Zone* zone);
|
||||
|
||||
static CallDescriptor* GetStubCallDescriptor(
|
||||
Isolate* isolate, Zone* zone, const CallInterfaceDescriptor& descriptor,
|
||||
int stack_parameter_count, CallDescriptor::Flags flags,
|
||||
|
@ -551,11 +551,6 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
|
||||
frame_access_state()->ClearSPDelta();
|
||||
break;
|
||||
}
|
||||
case kArchLazyBailout: {
|
||||
EnsureSpaceForLazyDeopt();
|
||||
RecordCallPosition(instr);
|
||||
break;
|
||||
}
|
||||
case kArchPrepareCallCFunction: {
|
||||
int const num_parameters = MiscField::decode(instr->opcode());
|
||||
__ PrepareCallCFunction(num_parameters, kScratchReg);
|
||||
|
@ -561,11 +561,6 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
|
||||
frame_access_state()->ClearSPDelta();
|
||||
break;
|
||||
}
|
||||
case kArchLazyBailout: {
|
||||
EnsureSpaceForLazyDeopt();
|
||||
RecordCallPosition(instr);
|
||||
break;
|
||||
}
|
||||
case kArchPrepareCallCFunction: {
|
||||
int const num_parameters = MiscField::decode(instr->opcode());
|
||||
__ PrepareCallCFunction(num_parameters, kScratchReg);
|
||||
|
@ -761,13 +761,6 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
|
||||
frame_access_state()->ClearSPDelta();
|
||||
break;
|
||||
}
|
||||
case kArchLazyBailout: {
|
||||
v8::internal::Assembler::BlockTrampolinePoolScope block_trampoline_pool(
|
||||
masm());
|
||||
EnsureSpaceForLazyDeopt();
|
||||
RecordCallPosition(instr);
|
||||
break;
|
||||
}
|
||||
case kArchPrepareCallCFunction: {
|
||||
int const num_parameters = MiscField::decode(instr->opcode());
|
||||
__ PrepareCallCFunction(num_parameters, kScratchReg);
|
||||
|
@ -654,11 +654,6 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
|
||||
frame_access_state()->ClearSPDelta();
|
||||
break;
|
||||
}
|
||||
case kArchLazyBailout: {
|
||||
EnsureSpaceForLazyDeopt();
|
||||
RecordCallPosition(instr);
|
||||
break;
|
||||
}
|
||||
case kArchPrepareCallCFunction: {
|
||||
// Frame alignment requires using FP-relative frame addressing.
|
||||
frame_access_state()->SetFrameAccessToFP();
|
||||
|
@ -485,14 +485,6 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
|
||||
frame_access_state()->ClearSPDelta();
|
||||
break;
|
||||
}
|
||||
case kArchLazyBailout: {
|
||||
DoEnsureSpaceForLazyDeopt(info(), masm(), last_lazy_deopt_pc_);
|
||||
RecordCallPosition(instr);
|
||||
// Lazy Bailout entry, need to re-initialize FPU state.
|
||||
__ fninit();
|
||||
__ fld1();
|
||||
break;
|
||||
}
|
||||
case kArchPrepareCallCFunction: {
|
||||
// Frame alignment requires using FP-relative frame addressing.
|
||||
frame_access_state()->SetFrameAccessToFP();
|
||||
|
@ -1168,7 +1168,6 @@ void FullCodeGenerator::VisitTryCatchStatement(TryCatchStatement* stmt) {
|
||||
Label try_entry, handler_entry, exit;
|
||||
__ jmp(&try_entry);
|
||||
__ bind(&handler_entry);
|
||||
PrepareForBailoutForId(stmt->HandlerId(), NO_REGISTERS);
|
||||
ClearPendingMessage();
|
||||
|
||||
// Exception handler code, the exception is in the result register.
|
||||
@ -1237,7 +1236,6 @@ void FullCodeGenerator::VisitTryFinallyStatement(TryFinallyStatement* stmt) {
|
||||
// Jump to try-handler setup and try-block code.
|
||||
__ jmp(&try_entry);
|
||||
__ bind(&handler_entry);
|
||||
PrepareForBailoutForId(stmt->HandlerId(), NO_REGISTERS);
|
||||
|
||||
// Exception handler code. This code is only executed when an exception
|
||||
// is thrown. Record the continuation and jump to the finally block.
|
||||
|
Loading…
Reference in New Issue
Block a user