[llvm] [VPlan] Support isa/dyn_cast from VPRecipeBase to VPIRMetadata (NFC). (PR #166245)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 6 13:18:54 PST 2025
================
@@ -3815,6 +3815,76 @@ template <>
struct CastInfo<VPPhiAccessors, const VPRecipeBase *>
: CastInfoVPPhiAccessors<const VPRecipeBase *> {};
+/// Casting from VPRecipeBase -> VPIRMetadata is supported for all recipe types
+/// implementing VPIRMetadata. Used by isa<> & co.
+template <> struct CastIsPossible<VPIRMetadata, const VPRecipeBase *> {
+ static inline bool isPossible(const VPRecipeBase *R) {
+ return isa<VPInstruction, VPWidenRecipe, VPWidenCastRecipe,
+ VPWidenIntrinsicRecipe, VPWidenCallRecipe, VPWidenSelectRecipe,
+ VPReplicateRecipe, VPInterleaveRecipe, VPInterleaveEVLRecipe,
+ VPWidenLoadRecipe, VPWidenLoadEVLRecipe, VPWidenStoreRecipe,
+ VPWidenStoreEVLRecipe>(R);
+ }
+};
+
+/// Support casting from VPRecipeBase -> VPIRMetadata, by down-casting to the
+/// recipe types implementing VPIRMetadata. Used by cast<>, dyn_cast<> & co.
+template <typename SrcTy>
+struct CastInfoVPIRMetadata : public CastIsPossible<VPIRMetadata, SrcTy> {
+
+ using Self = CastInfo<VPIRMetadata, SrcTy>;
+
+ /// doCast is used by cast<>.
+ static inline VPIRMetadata *doCast(SrcTy R) {
+ return const_cast<VPIRMetadata *>([R]() -> const VPIRMetadata * {
----------------
fhahn wrote:
Yes, this was not 100% const-correct. I updated the patch to avoid this, by adding a templated `castToVPIRMetadata`, which can take care of both casting const * -> const *and non-const -> non-const.
Not sure if there's a nicer way to do that safely.
https://github.com/llvm/llvm-project/pull/166245
More information about the llvm-commits
mailing list