diff --git a/llvm/include/llvm/IR/IntrinsicInst.h b/llvm/include/llvm/IR/IntrinsicInst.h index fbaaef8ea4431..c07b83a81a63e 100644 --- a/llvm/include/llvm/IR/IntrinsicInst.h +++ b/llvm/include/llvm/IR/IntrinsicInst.h @@ -1429,7 +1429,35 @@ class VACopyInst : public IntrinsicInst { /// A base class for all instrprof intrinsics. class InstrProfInstBase : public IntrinsicInst { +protected: + static bool isCounterBase(const IntrinsicInst &I) { + switch (I.getIntrinsicID()) { + case Intrinsic::instrprof_cover: + case Intrinsic::instrprof_increment: + case Intrinsic::instrprof_increment_step: + case Intrinsic::instrprof_timestamp: + case Intrinsic::instrprof_value_profile: + return true; + } + return false; + } + static bool isMCDCBitmapBase(const IntrinsicInst &I) { + switch (I.getIntrinsicID()) { + case Intrinsic::instrprof_mcdc_parameters: + case Intrinsic::instrprof_mcdc_tvbitmap_update: + return true; + } + return false; + } + public: + static bool classof(const Value *V) { + if (const auto *Instr = dyn_cast(V)) + return isCounterBase(*Instr) || isMCDCBitmapBase(*Instr) || + Instr->getIntrinsicID() == + Intrinsic::instrprof_mcdc_condbitmap_update; + return false; + } // The name of the instrumented function. GlobalVariable *getName() const { return cast( @@ -1444,6 +1472,12 @@ class InstrProfInstBase : public IntrinsicInst { /// A base class for all instrprof counter intrinsics. class InstrProfCntrInstBase : public InstrProfInstBase { public: + static bool classof(const Value *V) { + if (const auto *Instr = dyn_cast(V)) + return InstrProfInstBase::isCounterBase(*Instr); + return false; + } + // The number of counters for the instrumented function. ConstantInt *getNumCounters() const; // The index of the counter that this instruction acts on. @@ -1524,8 +1558,7 @@ class InstrProfValueProfileInst : public InstrProfCntrInstBase { class InstrProfMCDCBitmapInstBase : public InstrProfInstBase { public: static bool classof(const IntrinsicInst *I) { - return I->getIntrinsicID() == Intrinsic::instrprof_mcdc_parameters || - I->getIntrinsicID() == Intrinsic::instrprof_mcdc_tvbitmap_update; + return InstrProfInstBase::isMCDCBitmapBase(*I); } static bool classof(const Value *V) { return isa(V) && classof(cast(V));