Skip to content

Commit 723d7d0

Browse files
committed
!fixup add unit testing, avoid const_cast
1 parent ac805f4 commit 723d7d0

File tree

2 files changed

+63
-61
lines changed

2 files changed

+63
-61
lines changed

llvm/lib/Transforms/Vectorize/VPlan.h

Lines changed: 49 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -3819,67 +3819,68 @@ struct CastInfo<VPPhiAccessors, const VPRecipeBase *>
38193819

38203820
/// Casting from VPRecipeBase -> VPIRMetadata is supported for all recipe types
38213821
/// implementing VPIRMetadata. Used by isa<> & co.
3822-
template <> struct CastIsPossible<VPIRMetadata, const VPRecipeBase *> {
3823-
static inline bool isPossible(const VPRecipeBase *R) {
3824-
return isa<VPInstruction, VPWidenRecipe, VPWidenCastRecipe,
3825-
VPWidenIntrinsicRecipe, VPWidenCallRecipe, VPWidenSelectRecipe,
3826-
VPReplicateRecipe, VPInterleaveRecipe, VPInterleaveEVLRecipe,
3827-
VPWidenLoadRecipe, VPWidenLoadEVLRecipe, VPWidenStoreRecipe,
3828-
VPWidenStoreEVLRecipe>(R);
3822+
namespace detail {
3823+
/// Returns const VPIRMetadata* if input is const, and VPIRMetadata* otherwise.
3824+
template <typename RecipeBasePtrTy>
3825+
static inline auto castToVPIRMetadata(RecipeBasePtrTy R) -> std::conditional_t<
3826+
std::is_const_v<std::remove_pointer_t<RecipeBasePtrTy>>,
3827+
const VPIRMetadata *, VPIRMetadata *> {
3828+
switch (R->getVPDefID()) {
3829+
case VPDef::VPInstructionSC:
3830+
return cast<VPInstruction>(R);
3831+
case VPDef::VPWidenSC:
3832+
return cast<VPWidenRecipe>(R);
3833+
case VPDef::VPWidenCastSC:
3834+
return cast<VPWidenCastRecipe>(R);
3835+
case VPDef::VPWidenIntrinsicSC:
3836+
return cast<VPWidenIntrinsicRecipe>(R);
3837+
case VPDef::VPWidenCallSC:
3838+
return cast<VPWidenCallRecipe>(R);
3839+
case VPDef::VPWidenSelectSC:
3840+
return cast<VPWidenSelectRecipe>(R);
3841+
case VPDef::VPReplicateSC:
3842+
return cast<VPReplicateRecipe>(R);
3843+
case VPDef::VPInterleaveSC:
3844+
return cast<VPInterleaveRecipe>(R);
3845+
case VPDef::VPInterleaveEVLSC:
3846+
return cast<VPInterleaveEVLRecipe>(R);
3847+
case VPDef::VPWidenLoadSC:
3848+
return cast<VPWidenLoadRecipe>(R);
3849+
case VPDef::VPWidenLoadEVLSC:
3850+
return cast<VPWidenLoadEVLRecipe>(R);
3851+
case VPDef::VPWidenStoreSC:
3852+
return cast<VPWidenStoreRecipe>(R);
3853+
case VPDef::VPWidenStoreEVLSC:
3854+
return cast<VPWidenStoreEVLRecipe>(R);
3855+
default:
3856+
llvm_unreachable("invalid recipe for VPIRMetadata cast");
38293857
}
3830-
};
3858+
}
3859+
} // namespace detail
38313860

38323861
/// Support casting from VPRecipeBase -> VPIRMetadata, by down-casting to the
38333862
/// recipe types implementing VPIRMetadata. Used by cast<>, dyn_cast<> & co.
38343863
template <typename SrcTy>
38353864
struct CastInfoVPIRMetadata : public CastIsPossible<VPIRMetadata, SrcTy> {
3865+
static inline bool isPossible(SrcTy R) {
3866+
return isa<VPInstruction, VPWidenRecipe, VPWidenCastRecipe,
3867+
VPWidenIntrinsicRecipe, VPWidenCallRecipe, VPWidenSelectRecipe,
3868+
VPReplicateRecipe, VPInterleaveRecipe, VPInterleaveEVLRecipe,
3869+
VPWidenLoadRecipe, VPWidenLoadEVLRecipe, VPWidenStoreRecipe,
3870+
VPWidenStoreEVLRecipe>(R);
3871+
}
38363872

38373873
using Self = CastInfo<VPIRMetadata, SrcTy>;
3874+
using RetTy = decltype(detail::castToVPIRMetadata(std::declval<SrcTy>()));
38383875

3839-
/// doCast is used by cast<>.
3840-
static inline VPIRMetadata *doCast(SrcTy R) {
3841-
return const_cast<VPIRMetadata *>([R]() -> const VPIRMetadata * {
3842-
switch (R->getVPDefID()) {
3843-
case VPDef::VPInstructionSC:
3844-
return cast<VPInstruction>(R);
3845-
case VPDef::VPWidenSC:
3846-
return cast<VPWidenRecipe>(R);
3847-
case VPDef::VPWidenCastSC:
3848-
return cast<VPWidenCastRecipe>(R);
3849-
case VPDef::VPWidenIntrinsicSC:
3850-
return cast<VPWidenIntrinsicRecipe>(R);
3851-
case VPDef::VPWidenCallSC:
3852-
return cast<VPWidenCallRecipe>(R);
3853-
case VPDef::VPWidenSelectSC:
3854-
return cast<VPWidenSelectRecipe>(R);
3855-
case VPDef::VPReplicateSC:
3856-
return cast<VPReplicateRecipe>(R);
3857-
case VPDef::VPInterleaveSC:
3858-
return cast<VPInterleaveRecipe>(R);
3859-
case VPDef::VPInterleaveEVLSC:
3860-
return cast<VPInterleaveEVLRecipe>(R);
3861-
case VPDef::VPWidenLoadSC:
3862-
return cast<VPWidenLoadRecipe>(R);
3863-
case VPDef::VPWidenLoadEVLSC:
3864-
return cast<VPWidenLoadEVLRecipe>(R);
3865-
case VPDef::VPWidenStoreSC:
3866-
return cast<VPWidenStoreRecipe>(R);
3867-
case VPDef::VPWidenStoreEVLSC:
3868-
return cast<VPWidenStoreEVLRecipe>(R);
3869-
default:
3870-
llvm_unreachable("invalid recipe for VPIRMetadata cast");
3871-
}
3872-
}());
3873-
}
3876+
static inline RetTy doCast(SrcTy R) { return detail::castToVPIRMetadata(R); }
38743877

3875-
/// doCastIfPossible is used by dyn_cast<>.
3876-
static inline VPIRMetadata *doCastIfPossible(SrcTy f) {
3877-
if (!Self::isPossible(f))
3878+
static inline RetTy doCastIfPossible(SrcTy R) {
3879+
if (!Self::isPossible(R))
38783880
return nullptr;
3879-
return doCast(f);
3881+
return doCast(R);
38803882
}
38813883
};
3882-
38833884
template <>
38843885
struct CastInfo<VPIRMetadata, VPRecipeBase *>
38853886
: CastInfoVPIRMetadata<VPRecipeBase *> {};

llvm/unittests/Transforms/Vectorize/VPlanTest.cpp

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1002,7 +1002,7 @@ TEST_F(VPRecipeTest, CastVPInstructionToVPUser) {
10021002
VPValue *Op2 = Plan.getOrAddLiveIn(ConstantInt::get(Int32, 2));
10031003
VPInstruction Recipe(Instruction::Add, {Op1, Op2});
10041004

1005-
checkVPRecipeCastImpl<VPInstruction, VPUser>(&Recipe);
1005+
checkVPRecipeCastImpl<VPInstruction, VPUser, VPIRMetadata>(&Recipe);
10061006
}
10071007

10081008
TEST_F(VPRecipeTest, CastVPWidenRecipeToVPUser) {
@@ -1017,7 +1017,7 @@ TEST_F(VPRecipeTest, CastVPWidenRecipeToVPUser) {
10171017
Args.push_back(Op2);
10181018
VPWidenRecipe WidenR(*AI, make_range(Args.begin(), Args.end()));
10191019

1020-
checkVPRecipeCastImpl<VPWidenRecipe, VPUser>(&WidenR);
1020+
checkVPRecipeCastImpl<VPWidenRecipe, VPUser, VPIRMetadata>(&WidenR);
10211021
delete AI;
10221022
}
10231023

@@ -1036,7 +1036,7 @@ TEST_F(VPRecipeTest, CastVPWidenCallRecipeToVPUserAndVPDef) {
10361036
Args.push_back(CalledFn);
10371037
VPWidenCallRecipe Recipe(Call, Fn, Args);
10381038

1039-
checkVPRecipeCastImpl<VPWidenCallRecipe, VPUser>(&Recipe);
1039+
checkVPRecipeCastImpl<VPWidenCallRecipe, VPUser, VPIRMetadata>(&Recipe);
10401040

10411041
VPValue *VPV = &Recipe;
10421042
EXPECT_TRUE(VPV->getDefiningRecipe());
@@ -1062,7 +1062,8 @@ TEST_F(VPRecipeTest, CastVPWidenSelectRecipeToVPUserAndVPDef) {
10621062
VPWidenSelectRecipe WidenSelectR(*SelectI,
10631063
make_range(Args.begin(), Args.end()));
10641064

1065-
checkVPRecipeCastImpl<VPWidenSelectRecipe, VPUser>(&WidenSelectR);
1065+
checkVPRecipeCastImpl<VPWidenSelectRecipe, VPUser, VPIRMetadata>(
1066+
&WidenSelectR);
10661067

10671068
VPValue *VPV = &WidenSelectR;
10681069
EXPECT_EQ(&WidenSelectR, VPV->getDefiningRecipe());
@@ -1100,7 +1101,7 @@ TEST_F(VPRecipeTest, CastVPWidenCastRecipeToVPUser) {
11001101
VPValue *Op1 = Plan.getOrAddLiveIn(ConstantInt::get(Int32, 1));
11011102
VPWidenCastRecipe Recipe(Instruction::ZExt, Op1, Int64, *Cast);
11021103

1103-
checkVPRecipeCastImpl<VPWidenCastRecipe, VPUser>(&Recipe);
1104+
checkVPRecipeCastImpl<VPWidenCastRecipe, VPUser, VPIRMetadata>(&Recipe);
11041105
delete Cast;
11051106
}
11061107

@@ -1111,7 +1112,7 @@ TEST_F(VPRecipeTest, CastVPWidenIntrinsicRecipeToVPUser) {
11111112
VPValue *Op2 = Plan.getOrAddLiveIn(ConstantInt::get(Int32, 2));
11121113
VPWidenIntrinsicRecipe Recipe(Intrinsic::smax, {Op1, Op2}, Int32);
11131114

1114-
checkVPRecipeCastImpl<VPWidenIntrinsicRecipe, VPUser>(&Recipe);
1115+
checkVPRecipeCastImpl<VPWidenIntrinsicRecipe, VPUser, VPIRMetadata>(&Recipe);
11151116
}
11161117

11171118
TEST_F(VPRecipeTest, CastVPBlendRecipeToVPUser) {
@@ -1141,7 +1142,7 @@ TEST_F(VPRecipeTest, CastVPInterleaveRecipeToVPUser) {
11411142
InterleaveGroup<Instruction> IG(4, false, Align(4));
11421143
VPInterleaveRecipe Recipe(&IG, Addr, {}, Mask, false, {}, DebugLoc());
11431144

1144-
checkVPRecipeCastImpl<VPInterleaveRecipe, VPUser>(&Recipe);
1145+
checkVPRecipeCastImpl<VPInterleaveRecipe, VPUser, VPIRMetadata>(&Recipe);
11451146
}
11461147

11471148
TEST_F(VPRecipeTest, CastVPReplicateRecipeToVPUser) {
@@ -1157,7 +1158,7 @@ TEST_F(VPRecipeTest, CastVPReplicateRecipeToVPUser) {
11571158
auto *Call = CallInst::Create(FTy, PoisonValue::get(FTy));
11581159
VPReplicateRecipe Recipe(Call, make_range(Args.begin(), Args.end()), true);
11591160

1160-
checkVPRecipeCastImpl<VPReplicateRecipe, VPUser>(&Recipe);
1161+
checkVPRecipeCastImpl<VPReplicateRecipe, VPUser, VPIRMetadata>(&Recipe);
11611162

11621163
delete Call;
11631164
}
@@ -1181,7 +1182,7 @@ TEST_F(VPRecipeTest, CastVPWidenMemoryRecipeToVPUserAndVPDef) {
11811182
VPValue *Mask = Plan.getOrAddLiveIn(ConstantInt::get(Int32, 2));
11821183
VPWidenLoadRecipe Recipe(*Load, Addr, Mask, true, false, {}, {});
11831184

1184-
checkVPRecipeCastImpl<VPWidenLoadRecipe, VPUser>(&Recipe);
1185+
checkVPRecipeCastImpl<VPWidenLoadRecipe, VPUser, VPIRMetadata>(&Recipe);
11851186

11861187
VPValue *VPV = Recipe.getVPSingleValue();
11871188
EXPECT_TRUE(isa<VPRecipeBase>(VPV->getDefiningRecipe()));
@@ -1200,7 +1201,7 @@ TEST_F(VPRecipeTest, CastVPInterleaveEVLRecipeToVPUser) {
12001201
VPInterleaveRecipe BaseRecipe(&IG, Addr, {}, Mask, false, {}, DebugLoc());
12011202
VPInterleaveEVLRecipe Recipe(BaseRecipe, *EVL, Mask);
12021203

1203-
checkVPRecipeCastImpl<VPInterleaveEVLRecipe, VPUser>(&Recipe);
1204+
checkVPRecipeCastImpl<VPInterleaveEVLRecipe, VPUser, VPIRMetadata>(&Recipe);
12041205
}
12051206

12061207
TEST_F(VPRecipeTest, CastVPWidenLoadEVLRecipeToVPUser) {
@@ -1215,7 +1216,7 @@ TEST_F(VPRecipeTest, CastVPWidenLoadEVLRecipeToVPUser) {
12151216
VPWidenLoadRecipe BaseLoad(*Load, Addr, Mask, true, false, {}, {});
12161217
VPWidenLoadEVLRecipe Recipe(BaseLoad, Addr, *EVL, Mask);
12171218

1218-
checkVPRecipeCastImpl<VPWidenLoadEVLRecipe, VPUser>(&Recipe);
1219+
checkVPRecipeCastImpl<VPWidenLoadEVLRecipe, VPUser, VPIRMetadata>(&Recipe);
12191220

12201221
delete Load;
12211222
}
@@ -1231,7 +1232,7 @@ TEST_F(VPRecipeTest, CastVPWidenStoreRecipeToVPUser) {
12311232
VPValue *Mask = Plan.getOrAddLiveIn(ConstantInt::get(Int32, 2));
12321233
VPWidenStoreRecipe Recipe(*Store, Addr, StoredVal, Mask, true, false, {}, {});
12331234

1234-
checkVPRecipeCastImpl<VPWidenStoreRecipe, VPUser>(&Recipe);
1235+
checkVPRecipeCastImpl<VPWidenStoreRecipe, VPUser, VPIRMetadata>(&Recipe);
12351236

12361237
delete Store;
12371238
}
@@ -1250,7 +1251,7 @@ TEST_F(VPRecipeTest, CastVPWidenStoreEVLRecipeToVPUser) {
12501251
{});
12511252
VPWidenStoreEVLRecipe Recipe(BaseStore, Addr, *EVL, Mask);
12521253

1253-
checkVPRecipeCastImpl<VPWidenStoreEVLRecipe, VPUser>(&Recipe);
1254+
checkVPRecipeCastImpl<VPWidenStoreEVLRecipe, VPUser, VPIRMetadata>(&Recipe);
12541255

12551256
delete Store;
12561257
}

0 commit comments

Comments
 (0)