in hphp/runtime/vm/jit/dce.cpp [46:734]
bool canDCE(const IRInstruction& inst) {
switch (inst.op()) {
case AssertNonNull:
case AssertType:
case AbsDbl:
case AddInt:
case SubInt:
case MulInt:
case AndInt:
case AddDbl:
case SubDbl:
case MulDbl:
case Sqrt:
case OrInt:
case XorInt:
case Shl:
case Shr:
case Lshr:
case Floor:
case Ceil:
case XorBool:
case Mod:
case ConvDblToBool:
case ConvIntToBool:
case ConvStrToBool:
case ConvBoolToDbl:
case ConvIntToDbl:
case ConvStrToDbl:
case ConvResToDbl:
case ConvBoolToInt:
case ConvDblToInt:
case ConvStrToInt:
case ConvResToInt:
case ConvDblToStr:
case ConvIntToStr:
case DblAsBits:
case ConvPtrToLval:
case NewColFromArray:
case GtInt:
case GteInt:
case LtInt:
case LteInt:
case EqInt:
case NeqInt:
case CmpInt:
case GtDbl:
case GteDbl:
case LtDbl:
case LteDbl:
case EqDbl:
case NeqDbl:
case CmpDbl:
case GtStr:
case GteStr:
case LtStr:
case LteStr:
case SameStr:
case NSameStr:
case CmpStr:
case GtBool:
case GteBool:
case LtBool:
case LteBool:
case EqBool:
case NeqBool:
case CmpBool:
case SameObj:
case NSameObj:
case EqRes:
case NeqRes:
case EqCls:
case EqLazyCls:
case EqFunc:
case EqStrPtr:
case EqArrayDataPtr:
case HasReifiedGenerics:
case InstanceOf:
case InstanceOfIface:
case InstanceOfIfaceVtable:
case ExtendsClass:
case InstanceOfBitmask:
case NInstanceOfBitmask:
case InterfaceSupportsArrLike:
case InterfaceSupportsStr:
case InterfaceSupportsInt:
case InterfaceSupportsDbl:
case HasToString:
case IsType:
case IsNType:
case IsTypeMem:
case IsNTypeMem:
case IsLegacyArrLike:
case IsWaitHandle:
case IsCol:
case LdStk:
case LdLoc:
case LdLocForeign:
case LdStkAddr:
case LdLocAddr:
case LdRDSAddr:
case LdMem:
case LdContField:
case LdClsInitElem:
case LdIterBase:
case LdIterPos:
case LdIterEnd:
case LdFrameThis:
case LdFrameCls:
case LdSmashable:
case LdSmashableFunc:
case LdClsFromClsMeth:
case LdFuncFromClsMeth:
case LdClsFromRClsMeth:
case LdFuncFromRClsMeth:
case LdGenericsFromRClsMeth:
case LdFuncFromRFunc:
case LdGenericsFromRFunc:
case LdTVFromRDS:
case ConvFuncPrologueFlagsToARFlags:
case DefConst:
case DefFuncPrologueCallee:
case DefFuncPrologueCtx:
case DefFuncPrologueFlags:
case DefFuncPrologueNumArgs:
case Conjure:
case LdClsInitData:
case LookupClsRDS:
case LdClsMethodCacheCls:
case LdFuncVecLen:
case LdClsMethod:
case LdSubClsCns:
case LdIfaceMethod:
case LdPropAddr:
case LdObjClass:
case LdClsName:
case LdLazyClsName:
case LdLazyCls:
case LdFuncCls:
case LdFuncInOutBits:
case LdFuncNumParams:
case LdFuncName:
case LdMethCallerName:
case LdStrLen:
case LdMonotypeDictTombstones:
case LdMonotypeDictKey:
case LdMonotypeDictVal:
case LdMonotypeVecElem:
case LdVecElem:
case LdVecElemAddr:
case NewInstanceRaw:
case NewLoggingArray:
case NewDictArray:
case NewCol:
case NewPair:
case NewRFunc:
case NewRClsMeth:
case LdRetVal:
case Mov:
case CountVec:
case CountDict:
case CountKeyset:
case CountCollection:
case Nop:
case AKExistsDict:
case AKExistsKeyset:
case LdBindAddr:
case LdSSwitchDest:
case LdClosureCls:
case LdClosureThis:
case CreateSSWH:
case LdContActRec:
case LdContArValue:
case LdContArKey:
case LdWHState:
case LdWHResult:
case LdWHNotDone:
case LdAFWHActRec:
case LdMIStateTempBaseAddr:
case StringIsset:
case ColIsEmpty:
case ColIsNEmpty:
case LdUnwinderValue:
case LdColVec:
case LdColDict:
case OrdStr:
case ChrInt:
case CheckRange:
case LdMBase:
case MethodExists:
case LdTVAux:
case DictGetQuiet:
case DictGetK:
case DictIsset:
case DictIdx:
case KeysetGetQuiet:
case KeysetGetK:
case KeysetIsset:
case KeysetIdx:
case VecFirst:
case VecLast:
case DictFirst:
case DictFirstKey:
case DictLast:
case DictLastKey:
case KeysetFirst:
case KeysetLast:
case GetTime:
case GetTimeNs:
case Select:
case LdARFlags:
case FuncHasAttr:
case ClassHasAttr:
case IsFunReifiedGenericsMatched:
case LdFuncRequiredCoeffects:
case LdARFunc:
case StrictlyIntegerConv:
case GetMemoKeyScalar:
case LookupSPropSlot:
case ConstructClosure:
case AllocBespokeStructDict:
case AllocStructDict:
case AllocVec:
case GetDictPtrIter:
case GetVecPtrIter:
case AdvanceDictPtrIter:
case AdvanceVecPtrIter:
case LdPtrIterKey:
case LdPtrIterVal:
case EqPtrIter:
case LdUnitPerRequestFilepath:
case DirFromFilepath:
case BespokeGet:
case BespokeIterFirstPos:
case BespokeIterLastPos:
case BespokeIterEnd:
case BespokeIterGetKey:
case BespokeIterGetVal:
case LoadBCSP:
case LdResolvedTypeCnsNoCheck:
case LdResolvedTypeCnsClsName:
case AllocInitROM:
case VoidPtrAsDataType:
case CopyArray:
case StructDictElemAddr:
case LdImplicitContext:
assertx(!inst.isControlFlow());
return true;
// These may raise oom, but its still ok to delete them if the
// result is unused
case ConcatIntStr:
case ConcatStrInt:
case ConcatStrStr:
case ConcatStr3:
case ConcatStr4:
case AddNewElemKeyset:
case AddNewElemVec:
return true;
// Some of these conversion functions can run arbitrary PHP code.
case ConvObjToDbl:
case ConvTVToDbl:
case ConvObjToInt:
case ConvTVToInt:
case ConvTVToBool:
case ConvObjToBool:
case ConvObjToStr:
case ConvTVToStr:
case ConvArrLikeToVec:
case ConvObjToVec:
case ConvArrLikeToDict:
case ConvObjToDict:
case ConvArrLikeToKeyset:
case ConvObjToKeyset:
case LdOutAddr:
return !opcodeMayRaise(inst.op()) &&
(!inst.consumesReferences() || inst.producesReference());
case DbgTraceCall:
case AKExistsObj:
case StStk:
case StStkMeta:
case StStkRange:
case StOutValue:
case CheckIter:
case CheckType:
case CheckNullptr:
case CheckTypeMem:
case CheckDictKeys:
case CheckSmashableClass:
case CheckLoc:
case CheckStk:
case CheckMBase:
case AssertLoc:
case AssertStk:
case AssertMBase:
case CheckInit:
case CheckInitMem:
case CheckCold:
case EndGuards:
case CheckNonNull:
case DivDbl:
case DivInt:
case AddIntO:
case AddOffset:
case SubIntO:
case MulIntO:
case GtObj:
case GteObj:
case LtObj:
case LteObj:
case EqObj:
case NeqObj:
case CmpObj:
case CmpRes:
case GtRes:
case GteRes:
case LtRes:
case LteRes:
case GtArrLike:
case GteArrLike:
case LtArrLike:
case LteArrLike:
case CmpArrLike:
case JmpZero:
case JmpNZero:
case JmpSSwitchDest:
case JmpSwitchDest:
case ProfileSwitchDest:
case CheckSurpriseFlags:
case CheckSurpriseAndStack:
case HandleRequestSurprise:
case ReturnHook:
case SuspendHookAwaitEF:
case SuspendHookAwaitEG:
case SuspendHookAwaitR:
case SuspendHookCreateCont:
case SuspendHookYield:
case EndBlock:
case Unreachable:
case Jmp:
case DefLabel:
case LdPairElem:
case LdClsCtor:
case LdCls:
case LdClsCached:
case LdClsCachedSafe:
case LdCns:
case LdTypeCns:
case LdTypeCnsNoThrow:
case LdTypeCnsClsName:
case IsTypeStructCached:
case LookupCnsE:
case LdClsCns:
case InitClsCns:
case InitSubClsCns:
case LdResolvedTypeCns:
case CheckSubClsCns:
case LdClsCnsVecLen:
case LookupClsMethodFCache:
case LookupClsMethodCache:
case LookupClsMethod:
case LdGblAddr:
case LdGblAddrDef:
case LdClsPropAddrOrNull:
case LdClsPropAddrOrRaise:
case LdInitRDSAddr:
case LdInitPropAddr:
case LdObjMethodD:
case LdObjMethodS:
case LdObjInvoke:
case LdFunc:
case LdFuncCached:
case LookupFuncCached:
case AllocObj:
case AllocObjReified:
case NewClsMeth:
case FuncCred:
case InitProps:
case PropTypeRedefineCheck:
case InitSProps:
case InitObjProps:
case InitObjMemoSlots:
case LockObj:
case DebugBacktrace:
case InitThrowableFileAndLine:
case ConstructInstance:
case InitDictElem:
case InitStructElem:
case InitStructPositions:
case InitVecElem:
case InitVecElemLoop:
case NewKeysetArray:
case NewStructDict:
case NewBespokeStructDict:
case Clone:
case InlineCall:
case Call:
case NativeImpl:
case CallBuiltin:
case RetCtrl:
case AsyncFuncRet:
case AsyncFuncRetPrefetch:
case AsyncFuncRetSlow:
case AsyncGenRetR:
case AsyncGenYieldR:
case AsyncSwitchFast:
case GenericRetDecRefs:
case StClsInitElem:
case StImplicitContext:
case StImplicitContextWH:
case StMem:
case StMemMeta:
case StIterBase:
case StIterType:
case StIterEnd:
case StIterPos:
case StLoc:
case StLocMeta:
case StLocRange:
case StPtrAt:
case StVMFP:
case StVMSP:
case StVMPC:
case StVMReturnAddr:
case StVMRegState:
case StTVInRDS:
case StTypeAt:
case ReqBindJmp:
case ReqInterpBBNoTranslate:
case ReqRetranslate:
case ReqRetranslateOpt:
case IncRef:
case DecRef:
case DecRefNZ:
case ProfileDecRef:
case ReleaseShallow:
case DecReleaseCheck:
case DefFP:
case DefFuncEntryFP:
case DefFrameRelSP:
case DefRegSP:
case InitFrame:
case Count:
case VerifyParamCls:
case VerifyParamCallable:
case VerifyParamFail:
case VerifyParamFailHard:
case VerifyReifiedLocalType:
case VerifyReifiedReturnType:
case VerifyRetCallable:
case VerifyRetCls:
case VerifyRetFail:
case VerifyRetFailHard:
case VerifyProp:
case VerifyPropAll:
case VerifyPropCls:
case VerifyPropCoerce:
case VerifyPropCoerceAll:
case VerifyPropFail:
case VerifyPropFailHard:
case ThrowUninitLoc:
case ThrowUndefPropException:
case RaiseTooManyArg:
case RaiseError:
case RaiseErrorOnInvalidIsAsExpressionType:
case RaiseWarning:
case RaiseNotice:
case ThrowArrayIndexException:
case ThrowArrayKeyException:
case RaiseForbiddenDynCall:
case RaiseForbiddenDynConstruct:
case RaiseCoeffectsCallViolation:
case RaiseCoeffectsFunParamTypeViolation:
case RaiseCoeffectsFunParamCoeffectRulesViolation:
case RaiseStrToClassNotice:
case CheckClsMethFunc:
case CheckClsReifiedGenericMismatch:
case CheckFunReifiedGenericMismatch:
case CheckInOutMismatch:
case CheckReadonlyMismatch:
case PrintStr:
case PrintInt:
case PrintBool:
case GetMemoKey:
case InterpOne:
case InterpOneCF:
case OODeclExists:
case StClosureArg:
case CreateGen:
case CreateAGen:
case CreateAAWH:
case CreateAFWH:
case CreateAGWH:
case AFWHPrepareChild:
case StArResumeAddr:
case ContEnter:
case ContCheckNext:
case ContValid:
case ContArIncKey:
case ContArIncIdx:
case ContArUpdateIdx:
case LdContResumeAddr:
case StContArState:
case StContArValue:
case StContArKey:
case AFWHBlockOn:
case AFWHPushTailFrame:
case CountWHNotDone:
case IncStat:
case IncProfCounter:
case IncCallCounter:
case DbgAssertRefCount:
case DbgAssertFunc:
case DbgCheckLocalsDecRefd:
case RBTraceEntry:
case RBTraceMsg:
case ZeroErrorLevel:
case RestoreErrorLevel:
case IterInit:
case IterInitK:
case LIterInit:
case LIterInitK:
case IterNext:
case IterNextK:
case LIterNext:
case LIterNextK:
case IterFree:
case KillActRec:
case KillIter:
case KillLoc:
case BaseG:
case PropX:
case PropQ:
case PropDX:
case CGetProp:
case CGetPropQ:
case SetProp:
case UnsetProp:
case SetOpProp:
case IncDecProp:
case IssetProp:
case ElemX:
case CheckMissingKeyInArrLike:
case CheckArrayCOW:
case ProfileDictAccess:
case CheckDictOffset:
case ProfileKeysetAccess:
case CheckKeysetOffset:
case ProfileArrayCOW:
case ElemDictD:
case ElemDictU:
case ElemDictK:
case ElemDX:
case ElemUX:
case DictGet:
case KeysetGet:
case StringGet:
case OrdStrIdx:
case MapGet:
case CGetElem:
case DictSet:
case MapSet:
case VectorSet:
case BespokeSet:
case BespokeUnset:
case StructDictUnset:
case BespokeAppend:
case SetElem:
case SetRange:
case SetRangeRev:
case UnsetElem:
case SetOpElem:
case IncDecElem:
case SetNewElem:
case SetNewElemDict:
case SetNewElemVec:
case SetNewElemKeyset:
case ReserveVecNewElem:
case VectorIsset:
case PairIsset:
case MapIsset:
case IssetElem:
case ProfileType:
case ProfileCall:
case ProfileMethod:
case ProfileSubClsCns:
case ProfileGlobal:
case CheckVecBounds:
case BespokeElem:
case BespokeEscalateToVanilla:
case BespokeGetThrow:
case LdVectorSize:
case BeginCatch:
case EndCatch:
case EnterTCUnwind:
case UnwindCheckSideExit:
case DbgTrashStk:
case DbgTrashFrame:
case DbgTrashMem:
case EnterPrologue:
case ExitPrologue:
case EnterTranslation:
case CheckStackOverflow:
case CheckSurpriseFlagsEnter:
case JmpPlaceholder:
case ThrowOutOfBounds:
case ThrowInvalidArrayKey:
case ThrowInvalidOperation:
case ThrowCallReifiedFunctionWithoutGenerics:
case ThrowDivisionByZeroException:
case ThrowHasThisNeedStatic:
case ThrowLateInitPropError:
case ThrowMissingArg:
case ThrowMissingThis:
case ThrowParameterWrongType:
case ThrowInOutMismatch:
case ThrowReadonlyMismatch:
case ThrowCannotModifyReadonlyCollection:
case ThrowLocalMustBeValueTypeException:
case ThrowMustBeEnclosedInReadonly:
case ThrowMustBeMutableException:
case ThrowMustBeReadonlyException:
case ThrowMustBeValueTypeException:
case StMBase:
case StMROProp:
case CheckMROProp:
case FinishMemberOp:
case BeginInlining:
case EndInlining:
case SetOpTV:
case OutlineSetOp:
case ConjureUse:
case LdClsMethodFCacheFunc:
case LdClsMethodCacheFunc:
case LogArrayReach:
case LogGuardFailure:
case ProfileInstanceCheck:
case MemoGetStaticValue:
case MemoGetStaticCache:
case MemoGetLSBValue:
case MemoGetLSBCache:
case MemoGetInstanceValue:
case MemoGetInstanceCache:
case MemoSetStaticValue:
case MemoSetStaticCache:
case MemoSetLSBValue:
case MemoSetLSBCache:
case MemoSetInstanceValue:
case MemoSetInstanceCache:
case ThrowAsTypeStructException:
case RecordReifiedGenericsAndGetTSList:
case ResolveTypeStruct:
case CheckRDSInitialized:
case MarkRDSInitialized:
case MarkRDSAccess:
case ProfileProp:
case ProfileIsTypeStruct:
case StFrameCtx:
case StFrameFunc:
case StFrameMeta:
case LookupClsCns:
case LookupClsCtxCns:
case ArrayMarkLegacyShallow:
case ArrayMarkLegacyRecursive:
case ArrayUnmarkLegacyShallow:
case ArrayUnmarkLegacyRecursive:
case ProfileArrLikeProps:
case CheckFuncNeedsCoverage:
case RecordFuncCall:
case StructDictSlot:
case StructDictAddNextSlot:
case StructDictTypeBoundCheck:
return false;
case IsTypeStruct:
case EqStr:
case NeqStr:
return !opcodeMayRaise(inst.op());
case EqArrLike:
case NeqArrLike:
case SameArrLike:
case NSameArrLike:
return !inst.mayRaiseErrorWithSources();
}
not_reached();
}