diff --git a/llvm/include/llvm/IR/IntrinsicInst.h b/llvm/include/llvm/IR/IntrinsicInst.h index 62bd833198f02..338373f033865 100644 --- a/llvm/include/llvm/IR/IntrinsicInst.h +++ b/llvm/include/llvm/IR/IntrinsicInst.h @@ -596,6 +596,11 @@ class VPIntrinsic : public IntrinsicInst { return getFunctionalOpcodeForVP(getIntrinsicID()); } + // Equivalent non-predicated intrinsic ID + std::optional getFunctionalIntrinsicID() const { + return getFunctionalIntrinsicIDForVP(getIntrinsicID()); + } + // Equivalent non-predicated constrained ID std::optional getConstrainedIntrinsicID() const { return getConstrainedIntrinsicIDForVP(getIntrinsicID()); @@ -604,8 +609,12 @@ class VPIntrinsic : public IntrinsicInst { // Equivalent non-predicated opcode static std::optional getFunctionalOpcodeForVP(Intrinsic::ID ID); + // Equivalent non-predicated intrinsic ID + static std::optional + getFunctionalIntrinsicIDForVP(Intrinsic::ID ID); + // Equivalent non-predicated constrained ID - static std::optional + static std::optional getConstrainedIntrinsicIDForVP(Intrinsic::ID ID); }; diff --git a/llvm/lib/IR/IntrinsicInst.cpp b/llvm/lib/IR/IntrinsicInst.cpp index 61be167ebaa28..c73634e5db06a 100644 --- a/llvm/lib/IR/IntrinsicInst.cpp +++ b/llvm/lib/IR/IntrinsicInst.cpp @@ -529,8 +529,22 @@ VPIntrinsic::getFunctionalOpcodeForVP(Intrinsic::ID ID) { return std::nullopt; } +// Equivalent non-predicated intrinsic +std::optional +VPIntrinsic::getFunctionalIntrinsicIDForVP(Intrinsic::ID ID) { + switch (ID) { + default: + break; +#define BEGIN_REGISTER_VP_INTRINSIC(VPID, ...) case Intrinsic::VPID: +#define VP_PROPERTY_FUNCTIONAL_INTRINSIC(INTRIN) return Intrinsic::INTRIN; +#define END_REGISTER_VP_INTRINSIC(VPID) break; +#include "llvm/IR/VPIntrinsics.def" + } + return std::nullopt; +} + // Equivalent non-predicated constrained intrinsic -std::optional +std::optional VPIntrinsic::getConstrainedIntrinsicIDForVP(Intrinsic::ID ID) { switch (ID) { default: