in hphp/runtime/vm/jit/translator.cpp [860:1090]
bool dontGuardAnyInputs(const NormalizedInstruction& ni) {
switch (ni.op()) {
case Op::IterNext:
case Op::LIterNext:
case Op::IterInit:
case Op::LIterInit:
case Op::JmpZ:
case Op::JmpNZ:
case Op::Jmp:
case Op::JmpNS:
case Op::ClsCnsD:
case Op::NewStructDict:
case Op::Switch:
case Op::SSwitch:
case Op::Lt:
case Op::Lte:
case Op::Gt:
case Op::Gte:
case Op::Cmp:
case Op::SetOpL:
case Op::InitProp:
case Op::BreakTraceHint:
case Op::IsTypeL:
case Op::IsTypeC:
case Op::IncDecL:
case Op::Eq:
case Op::Neq:
case Op::AssertRATL:
case Op::AssertRATStk:
case Op::SetL:
case Op::CastBool:
case Op::Same:
case Op::NSame:
case Op::Yield:
case Op::YieldK:
case Op::ContEnter:
case Op::ContRaise:
case Op::CreateCont:
case Op::Await:
case Op::AwaitAll:
case Op::BitAnd:
case Op::BitOr:
case Op::BitXor:
case Op::Sub:
case Op::Mul:
case Op::SubO:
case Op::MulO:
case Op::Add:
case Op::AddO:
case Op::ClassGetC:
case Op::ClassGetTS:
case Op::AKExists:
case Op::AddElemC:
case Op::AddNewElemC:
case Op::Dict:
case Op::Keyset:
case Op::Vec:
case Op::ArrayIdx:
case Op::ArrayMarkLegacy:
case Op::ArrayUnmarkLegacy:
case Op::BareThis:
case Op::BitNot:
case Op::CGetG:
case Op::CGetL:
case Op::CGetQuietL:
case Op::CGetL2:
case Op::CGetS:
case Op::CUGetL:
case Op::CastDouble:
case Op::CastInt:
case Op::CastString:
case Op::CastDict:
case Op::CastKeyset:
case Op::CastVec:
case Op::DblAsBits:
case Op::CheckProp:
case Op::CheckThis:
case Op::Clone:
case Op::CnsE:
case Op::ColFromArray:
case Op::CombineAndResolveTypeStruct:
case Op::RecordReifiedGeneric:
case Op::CheckReifiedGenericMismatch:
case Op::ConcatN:
case Op::Concat:
case Op::ContCheck:
case Op::ContCurrent:
case Op::ContKey:
case Op::ContValid:
case Op::ContGetReturn:
case Op::CreateCl:
case Op::Dir:
case Op::Div:
case Op::Double:
case Op::Dup:
case Op::FCallClsMethod:
case Op::FCallClsMethodD:
case Op::FCallClsMethodS:
case Op::FCallClsMethodSD:
case Op::FCallCtor:
case Op::FCallFunc:
case Op::FCallFuncD:
case Op::FCallObjMethodD:
case Op::ResolveRFunc:
case Op::ResolveFunc:
case Op::ResolveMethCaller:
case Op::ResolveClsMethod:
case Op::ResolveClsMethodD:
case Op::ResolveClsMethodS:
case Op::ResolveRClsMethod:
case Op::ResolveRClsMethodD:
case Op::ResolveRClsMethodS:
case Op::ResolveClass:
case Op::LazyClass:
case Op::False:
case Op::File:
case Op::FuncCred:
case Op::GetMemoKeyL:
case Op::Idx:
case Op::InstanceOf:
case Op::InstanceOfD:
case Op::IsLateBoundCls:
case Op::IsTypeStructC:
case Op::Int:
case Op::IssetG:
case Op::IssetL:
case Op::IssetS:
case Op::IsUnsetL:
case Op::IterFree:
case Op::LIterFree:
case Op::LateBoundCls:
case Op::Method:
case Op::Mod:
case Op::Pow:
case Op::ClassName:
case Op::LazyClassFromClass:
case Op::NativeImpl:
case Op::NewCol:
case Op::NewPair:
case Op::NewDictArray:
case Op::NewVec:
case Op::NewKeysetArray:
case Op::NewObj:
case Op::NewObjR:
case Op::NewObjD:
case Op::NewObjRD:
case Op::NewObjS:
case Op::Not:
case Op::Null:
case Op::NullUninit:
case Op::OODeclExists:
case Op::ParentCls:
case Op::PopC:
case Op::PopU:
case Op::PopU2:
case Op::PopL:
case Op::Print:
case Op::PushL:
case Op::RetC:
case Op::RetCSuspended:
case Op::SelfCls:
case Op::SetG:
case Op::SetS:
case Op::Shl:
case Op::Shr:
case Op::Silence:
case Op::String:
case Op::This:
case Op::Throw:
case Op::ThrowAsTypeStructException:
case Op::ThrowNonExhaustiveSwitch:
case Op::RaiseClassStringConversionWarning:
case Op::True:
case Op::UnsetL:
case Op::VerifyParamType:
case Op::VerifyParamTypeTS:
case Op::VerifyRetTypeC:
case Op::VerifyRetTypeTS:
case Op::VerifyRetNonNullC:
case Op::VerifyOutType:
case Op::WHResult:
case Op::BaseGC:
case Op::BaseGL:
case Op::BaseSC:
case Op::BaseL:
case Op::BaseC:
case Op::BaseH:
case Op::Dim:
case Op::QueryM:
case Op::SetM:
case Op::IncDecM:
case Op::SetOpM:
case Op::UnsetM:
case Op::SetRangeM:
case Op::MemoGet:
case Op::MemoGetEager:
case Op::MemoSet:
case Op::MemoSetEager:
case Op::RetM:
case Op::Select:
case Op::LockObj:
case Op::ClsCnsL:
case Op::SetImplicitContextByValue:
return false;
// These are instructions that are always interp-one'd, or are always no-ops.
case Op::Nop:
case Op::EntryNop:
case Op::CGetCUNop:
case Op::UGetCUNop:
case Op::ClsCns:
case Op::Exit:
case Op::Fatal:
case Op::SetOpG:
case Op::SetOpS:
case Op::IncDecG:
case Op::IncDecS:
case Op::UnsetG:
case Op::FCallObjMethod:
case Op::Incl:
case Op::InclOnce:
case Op::Req:
case Op::ReqOnce:
case Op::ReqDoc:
case Op::Eval:
case Op::ChainFaults:
return true;
}
always_assert_flog(0, "invalid opcode {}\n", static_cast<uint32_t>(ni.op()));
}