[VP] Refactoring some functions in ExpandVectorPredication.NFC (#115840)
Building vp intrinsic functions using a unified interface for expandPredicationToIntCall/expandPredicationToFPCall/expandPredicationToCastIntrinsic functions.
This commit is contained in:
@@ -175,8 +175,7 @@ struct CachingVPExpander {
|
||||
VPIntrinsic &PI);
|
||||
|
||||
/// Lower this VP int call to a unpredicated int call.
|
||||
Value *expandPredicationToIntCall(IRBuilder<> &Builder, VPIntrinsic &PI,
|
||||
unsigned UnpredicatedIntrinsicID);
|
||||
Value *expandPredicationToIntCall(IRBuilder<> &Builder, VPIntrinsic &PI);
|
||||
|
||||
/// Lower this VP fp call to a unpredicated fp call.
|
||||
Value *expandPredicationToFPCall(IRBuilder<> &Builder, VPIntrinsic &PI,
|
||||
@@ -287,33 +286,19 @@ CachingVPExpander::expandPredicationInBinaryOperator(IRBuilder<> &Builder,
|
||||
return NewBinOp;
|
||||
}
|
||||
|
||||
Value *CachingVPExpander::expandPredicationToIntCall(
|
||||
IRBuilder<> &Builder, VPIntrinsic &VPI, unsigned UnpredicatedIntrinsicID) {
|
||||
switch (UnpredicatedIntrinsicID) {
|
||||
case Intrinsic::abs:
|
||||
case Intrinsic::smax:
|
||||
case Intrinsic::smin:
|
||||
case Intrinsic::umax:
|
||||
case Intrinsic::umin: {
|
||||
Value *Op0 = VPI.getOperand(0);
|
||||
Value *Op1 = VPI.getOperand(1);
|
||||
Value *NewOp = Builder.CreateIntrinsic(
|
||||
UnpredicatedIntrinsicID, {VPI.getType()}, {Op0, Op1},
|
||||
/*FMFSource=*/nullptr, VPI.getName());
|
||||
replaceOperation(*NewOp, VPI);
|
||||
return NewOp;
|
||||
Value *CachingVPExpander::expandPredicationToIntCall(IRBuilder<> &Builder,
|
||||
VPIntrinsic &VPI) {
|
||||
std::optional<unsigned> FID = VPI.getFunctionalIntrinsicID();
|
||||
if (!FID)
|
||||
return nullptr;
|
||||
SmallVector<Value *, 2> Argument;
|
||||
for (unsigned i = 0; i < VPI.getNumOperands() - 3; i++) {
|
||||
Argument.push_back(VPI.getOperand(i));
|
||||
}
|
||||
case Intrinsic::bswap:
|
||||
case Intrinsic::bitreverse: {
|
||||
Value *Op = VPI.getOperand(0);
|
||||
Value *NewOp =
|
||||
Builder.CreateIntrinsic(UnpredicatedIntrinsicID, {VPI.getType()}, {Op},
|
||||
/*FMFSource=*/nullptr, VPI.getName());
|
||||
replaceOperation(*NewOp, VPI);
|
||||
return NewOp;
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
Value *NewOp = Builder.CreateIntrinsic(FID.value(), {VPI.getType()}, Argument,
|
||||
/*FMFSource=*/nullptr, VPI.getName());
|
||||
replaceOperation(*NewOp, VPI);
|
||||
return NewOp;
|
||||
}
|
||||
|
||||
Value *CachingVPExpander::expandPredicationToFPCall(
|
||||
@@ -323,20 +308,15 @@ Value *CachingVPExpander::expandPredicationToFPCall(
|
||||
|
||||
switch (UnpredicatedIntrinsicID) {
|
||||
case Intrinsic::fabs:
|
||||
case Intrinsic::sqrt: {
|
||||
Value *Op0 = VPI.getOperand(0);
|
||||
Value *NewOp =
|
||||
Builder.CreateIntrinsic(UnpredicatedIntrinsicID, {VPI.getType()}, {Op0},
|
||||
/*FMFSource=*/nullptr, VPI.getName());
|
||||
replaceOperation(*NewOp, VPI);
|
||||
return NewOp;
|
||||
}
|
||||
case Intrinsic::sqrt:
|
||||
case Intrinsic::maxnum:
|
||||
case Intrinsic::minnum: {
|
||||
Value *Op0 = VPI.getOperand(0);
|
||||
Value *Op1 = VPI.getOperand(1);
|
||||
SmallVector<Value *, 2> Argument;
|
||||
for (unsigned i = 0; i < VPI.getNumOperands() - 3; i++) {
|
||||
Argument.push_back(VPI.getOperand(i));
|
||||
}
|
||||
Value *NewOp = Builder.CreateIntrinsic(
|
||||
UnpredicatedIntrinsicID, {VPI.getType()}, {Op0, Op1},
|
||||
UnpredicatedIntrinsicID, {VPI.getType()}, Argument,
|
||||
/*FMFSource=*/nullptr, VPI.getName());
|
||||
replaceOperation(*NewOp, VPI);
|
||||
return NewOp;
|
||||
@@ -438,56 +418,13 @@ CachingVPExpander::expandPredicationInReduction(IRBuilder<> &Builder,
|
||||
|
||||
Value *CachingVPExpander::expandPredicationToCastIntrinsic(IRBuilder<> &Builder,
|
||||
VPIntrinsic &VPI) {
|
||||
Value *CastOp = nullptr;
|
||||
switch (VPI.getIntrinsicID()) {
|
||||
default:
|
||||
llvm_unreachable("Not a VP cast intrinsic");
|
||||
case Intrinsic::vp_sext:
|
||||
CastOp =
|
||||
Builder.CreateSExt(VPI.getOperand(0), VPI.getType(), VPI.getName());
|
||||
break;
|
||||
case Intrinsic::vp_zext:
|
||||
CastOp =
|
||||
Builder.CreateZExt(VPI.getOperand(0), VPI.getType(), VPI.getName());
|
||||
break;
|
||||
case Intrinsic::vp_trunc:
|
||||
CastOp =
|
||||
Builder.CreateTrunc(VPI.getOperand(0), VPI.getType(), VPI.getName());
|
||||
break;
|
||||
case Intrinsic::vp_inttoptr:
|
||||
CastOp =
|
||||
Builder.CreateIntToPtr(VPI.getOperand(0), VPI.getType(), VPI.getName());
|
||||
break;
|
||||
case Intrinsic::vp_ptrtoint:
|
||||
CastOp =
|
||||
Builder.CreatePtrToInt(VPI.getOperand(0), VPI.getType(), VPI.getName());
|
||||
break;
|
||||
case Intrinsic::vp_fptosi:
|
||||
CastOp =
|
||||
Builder.CreateFPToSI(VPI.getOperand(0), VPI.getType(), VPI.getName());
|
||||
break;
|
||||
Intrinsic::ID VPID = VPI.getIntrinsicID();
|
||||
unsigned CastOpcode = VPIntrinsic::getFunctionalOpcodeForVP(VPID).value();
|
||||
assert(Instruction::isCast(CastOpcode));
|
||||
Value *CastOp =
|
||||
Builder.CreateCast(Instruction::CastOps(CastOpcode), VPI.getOperand(0),
|
||||
VPI.getType(), VPI.getName());
|
||||
|
||||
case Intrinsic::vp_fptoui:
|
||||
CastOp =
|
||||
Builder.CreateFPToUI(VPI.getOperand(0), VPI.getType(), VPI.getName());
|
||||
break;
|
||||
case Intrinsic::vp_sitofp:
|
||||
CastOp =
|
||||
Builder.CreateSIToFP(VPI.getOperand(0), VPI.getType(), VPI.getName());
|
||||
break;
|
||||
case Intrinsic::vp_uitofp:
|
||||
CastOp =
|
||||
Builder.CreateUIToFP(VPI.getOperand(0), VPI.getType(), VPI.getName());
|
||||
break;
|
||||
case Intrinsic::vp_fptrunc:
|
||||
CastOp =
|
||||
Builder.CreateFPTrunc(VPI.getOperand(0), VPI.getType(), VPI.getName());
|
||||
break;
|
||||
case Intrinsic::vp_fpext:
|
||||
CastOp =
|
||||
Builder.CreateFPExt(VPI.getOperand(0), VPI.getType(), VPI.getName());
|
||||
break;
|
||||
}
|
||||
replaceOperation(*CastOp, VPI);
|
||||
return CastOp;
|
||||
}
|
||||
@@ -672,8 +609,7 @@ Value *CachingVPExpander::expandPredication(VPIntrinsic &VPI) {
|
||||
case Intrinsic::vp_umin:
|
||||
case Intrinsic::vp_bswap:
|
||||
case Intrinsic::vp_bitreverse:
|
||||
return expandPredicationToIntCall(Builder, VPI,
|
||||
VPI.getFunctionalIntrinsicID().value());
|
||||
return expandPredicationToIntCall(Builder, VPI);
|
||||
case Intrinsic::vp_fabs:
|
||||
case Intrinsic::vp_sqrt:
|
||||
case Intrinsic::vp_maxnum:
|
||||
|
||||
Reference in New Issue
Block a user