in Jit/hir/hir.cpp [114:258]
bool Instr::isReplayable() const {
switch (opcode()) {
case Opcode::kAssign:
case Opcode::kBuildString:
case Opcode::kCast:
case Opcode::kCheckExc:
case Opcode::kCheckField:
case Opcode::kCheckFreevar:
case Opcode::kCheckNeg:
case Opcode::kCheckSequenceBounds:
case Opcode::kCheckVar:
case Opcode::kDoubleBinaryOp:
case Opcode::kFormatValue:
case Opcode::kGuard:
case Opcode::kGuardIs:
case Opcode::kGuardType:
case Opcode::kHintType:
case Opcode::kIntBinaryOp:
case Opcode::kIntConvert:
case Opcode::kIsErrStopAsyncIteration:
case Opcode::kIsNegativeAndErrOccurred:
case Opcode::kIsSubtype:
case Opcode::kLoadArg:
case Opcode::kLoadArrayItem:
case Opcode::kLoadCellItem:
case Opcode::kLoadConst:
case Opcode::kLoadCurrentFunc:
case Opcode::kLoadEvalBreaker:
case Opcode::kLoadField:
case Opcode::kLoadFieldAddress:
case Opcode::kLoadFunctionIndirect:
case Opcode::kLoadGlobalCached:
case Opcode::kLoadTupleItem:
case Opcode::kLoadTypeAttrCacheItem:
case Opcode::kLoadVarObjectSize:
case Opcode::kLongCompare:
case Opcode::kPrimitiveBox:
case Opcode::kPrimitiveCompare:
case Opcode::kPrimitiveUnaryOp:
case Opcode::kPrimitiveUnbox:
case Opcode::kRaise:
case Opcode::kRaiseStatic:
case Opcode::kRefineType:
case Opcode::kStealCellItem:
case Opcode::kUseType:
case Opcode::kWaitHandleLoadCoroOrResult:
case Opcode::kWaitHandleLoadWaiter: {
return true;
}
case Opcode::kCompare: {
auto op = static_cast<const Compare*>(this)->op();
return op == CompareOp::kIs || op == CompareOp::kIsNot;
}
case Opcode::kCompareBool: {
auto op = static_cast<const CompareBool*>(this)->op();
return op == CompareOp::kIs || op == CompareOp::kIsNot;
}
case Opcode::kBatchDecref:
case Opcode::kBeginInlinedFunction:
case Opcode::kBinaryOp:
case Opcode::kBranch:
case Opcode::kBuildSlice:
case Opcode::kCallCFunc:
case Opcode::kCallEx:
case Opcode::kCallExKw:
case Opcode::kCallMethod:
case Opcode::kCallStatic:
case Opcode::kCallStaticRetVoid:
case Opcode::kClearError:
case Opcode::kCondBranch:
case Opcode::kCondBranchIterNotDone:
case Opcode::kCondBranchCheckType:
case Opcode::kDecref:
case Opcode::kDeleteAttr:
case Opcode::kDeleteSubscr:
case Opcode::kDeopt:
case Opcode::kDeoptPatchpoint:
case Opcode::kEndInlinedFunction:
case Opcode::kFillTypeAttrCache:
case Opcode::kGetIter:
case Opcode::kGetTuple:
case Opcode::kImportName:
case Opcode::kImportFrom:
case Opcode::kInPlaceOp:
case Opcode::kIncref:
case Opcode::kInitialYield:
case Opcode::kInitFunction:
case Opcode::kInitListTuple:
case Opcode::kInvokeIterNext:
case Opcode::kInvokeStaticFunction:
case Opcode::kInvokeMethod:
case Opcode::kIsInstance:
case Opcode::kIsTruthy:
case Opcode::kListAppend:
case Opcode::kListExtend:
case Opcode::kLoadAttr:
case Opcode::kLoadAttrSpecial:
case Opcode::kLoadAttrSuper:
case Opcode::kLoadGlobal:
case Opcode::kLoadMethod:
case Opcode::kLoadMethodSuper:
case Opcode::kLongBinaryOp:
case Opcode::kMakeCell:
case Opcode::kMakeCheckedDict:
case Opcode::kMakeCheckedList:
case Opcode::kMakeDict:
case Opcode::kMakeFunction:
case Opcode::kMakeListTuple:
case Opcode::kMakeSet:
case Opcode::kMakeTupleFromList:
case Opcode::kMergeDictUnpack:
case Opcode::kMergeSetUnpack:
case Opcode::kPhi:
case Opcode::kRaiseAwaitableError:
case Opcode::kRepeatList:
case Opcode::kRepeatTuple:
case Opcode::kReturn:
case Opcode::kRunPeriodicTasks:
case Opcode::kSetCellItem:
case Opcode::kSetCurrentAwaiter:
case Opcode::kSetDictItem:
case Opcode::kSetSetItem:
case Opcode::kSetFunctionAttr:
case Opcode::kStoreField:
case Opcode::kSnapshot:
case Opcode::kStoreArrayItem:
case Opcode::kStoreAttr:
case Opcode::kStoreSubscr:
case Opcode::kTpAlloc:
case Opcode::kUnaryOp:
case Opcode::kUnpackExToTuple:
case Opcode::kVectorCall:
case Opcode::kVectorCallStatic:
case Opcode::kVectorCallKW:
case Opcode::kWaitHandleRelease:
case Opcode::kYieldAndYieldFrom:
case Opcode::kYieldFrom:
case Opcode::kYieldValue:
case Opcode::kXDecref:
case Opcode::kXIncref: {
return false;
}
}
JIT_CHECK(false, "Bad opcode %d", static_cast<int>(opcode()));
}