diff --git a/llvm/lib/Transforms/Vectorize/VPlan.h b/llvm/lib/Transforms/Vectorize/VPlan.h index cfe1f1e9d7528..2c47aa3f35e02 100644 --- a/llvm/lib/Transforms/Vectorize/VPlan.h +++ b/llvm/lib/Transforms/Vectorize/VPlan.h @@ -3815,6 +3815,76 @@ template <> struct CastInfo : CastInfoVPPhiAccessors {}; +/// Casting from VPRecipeBase -> VPIRMetadata is supported for all recipe types +/// implementing VPIRMetadata. Used by isa<> & co. +template <> struct CastIsPossible { + static inline bool isPossible(const VPRecipeBase *R) { + return isa(R); + } +}; + +/// Support casting from VPRecipeBase -> VPIRMetadata, by down-casting to the +/// recipe types implementing VPIRMetadata. Used by cast<>, dyn_cast<> & co. +template +struct CastInfoVPIRMetadata : public CastIsPossible { + + using Self = CastInfo; + + /// doCast is used by cast<>. + static inline VPIRMetadata *doCast(SrcTy R) { + return const_cast([R]() -> const VPIRMetadata * { + switch (R->getVPDefID()) { + case VPDef::VPInstructionSC: + return cast(R); + case VPDef::VPWidenSC: + return cast(R); + case VPDef::VPWidenCastSC: + return cast(R); + case VPDef::VPWidenIntrinsicSC: + return cast(R); + case VPDef::VPWidenCallSC: + return cast(R); + case VPDef::VPWidenSelectSC: + return cast(R); + case VPDef::VPReplicateSC: + return cast(R); + case VPDef::VPInterleaveSC: + return cast(R); + case VPDef::VPInterleaveEVLSC: + return cast(R); + case VPDef::VPWidenLoadSC: + return cast(R); + case VPDef::VPWidenLoadEVLSC: + return cast(R); + case VPDef::VPWidenStoreSC: + return cast(R); + case VPDef::VPWidenStoreEVLSC: + return cast(R); + default: + llvm_unreachable("invalid recipe for VPIRMetadata cast"); + } + }()); + } + + /// doCastIfPossible is used by dyn_cast<>. + static inline VPIRMetadata *doCastIfPossible(SrcTy f) { + if (!Self::isPossible(f)) + return nullptr; + return doCast(f); + } +}; + +template <> +struct CastInfo + : CastInfoVPIRMetadata {}; +template <> +struct CastInfo + : CastInfoVPIRMetadata {}; + /// VPBasicBlock serves as the leaf of the Hierarchical Control-Flow Graph. It /// holds a sequence of zero or more VPRecipe's each representing a sequence of /// output IR instructions. All PHI-like recipes must come before any non-PHI recipes.