Skip to content

Commit 9f13127

Browse files
committed
1. add mask Op in VPlanTransform
2. remove the vpintrinsic's implment in execute
1 parent 177bee5 commit 9f13127

File tree

9 files changed

+45
-63
lines changed

9 files changed

+45
-63
lines changed

llvm/include/llvm/IR/VectorBuilder.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,11 +99,11 @@ class VectorBuilder {
9999
const Twine &Name = Twine());
100100

101101
/// Emit a VP reduction intrinsic call for recurrence kind.
102-
/// \param ID The intrinsic ID of call Intrinsic
102+
/// \param RdxID The intrinsic ID of llvm.vector.reduce.*
103103
/// \param ValTy The type of operand which the reduction operation is
104104
/// performed.
105105
/// \param VecOpArray The operand list.
106-
Value *createSimpleIntrinsic(Intrinsic::ID ID, Type *ValTy,
106+
Value *createSimpleReduction(Intrinsic::ID RdxID, Type *ValTy,
107107
ArrayRef<Value *> VecOpArray,
108108
const Twine &Name = Twine());
109109
};

llvm/lib/IR/VectorBuilder.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,13 @@ Value *VectorBuilder::createVectorInstruction(unsigned Opcode, Type *ReturnTy,
6060
return createVectorInstructionImpl(VPID, ReturnTy, InstOpArray, Name);
6161
}
6262

63-
Value *VectorBuilder::createSimpleIntrinsic(Intrinsic::ID ID, Type *ValTy,
63+
Value *VectorBuilder::createSimpleReduction(Intrinsic::ID RdxID,
64+
Type *ValTy,
6465
ArrayRef<Value *> InstOpArray,
6566
const Twine &Name) {
66-
auto VPID = VPIntrinsic::getForIntrinsic(ID);
67-
assert(VPIntrinsic::isVPIntrinsic(VPID) &&
68-
"No VPIntrinsic for this Intrinsic");
67+
auto VPID = VPIntrinsic::getForIntrinsic(RdxID);
68+
assert(VPReductionIntrinsic::isVPReduction(VPID) &&
69+
"No VPIntrinsic for this reduction");
6970
return createVectorInstructionImpl(VPID, ValTy, InstOpArray, Name);
7071
}
7172

llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1118,8 +1118,6 @@ RISCVTTIImpl::getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA,
11181118
case Intrinsic::vp_udiv:
11191119
case Intrinsic::vp_urem:
11201120
case Intrinsic::vp_xor:
1121-
// TODO: add new patch for it.
1122-
case Intrinsic::vp_fneg:
11231121
// vp float arithmetic ops.
11241122
case Intrinsic::vp_fadd:
11251123
case Intrinsic::vp_fsub:

llvm/lib/Transforms/Utils/LoopUtils.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1300,7 +1300,7 @@ Value *llvm::createSimpleReduction(VectorBuilder &VBuilder, Value *Src,
13001300
Type *SrcEltTy = SrcTy->getElementType();
13011301
Value *Iden = getRecurrenceIdentity(Kind, SrcEltTy, Desc.getFastMathFlags());
13021302
Value *Ops[] = {Iden, Src};
1303-
return VBuilder.createSimpleIntrinsic(Id, SrcTy, Ops);
1303+
return VBuilder.createSimpleReduction(Id, SrcTy, Ops);
13041304
}
13051305

13061306
Value *llvm::createReduction(IRBuilderBase &B,
@@ -1343,7 +1343,7 @@ Value *llvm::createOrderedReduction(VectorBuilder &VBuilder,
13431343
Intrinsic::ID Id = getReductionIntrinsicID(RecurKind::FAdd);
13441344
auto *SrcTy = cast<VectorType>(Src->getType());
13451345
Value *Ops[] = {Start, Src};
1346-
return VBuilder.createSimpleIntrinsic(Id, SrcTy, Ops);
1346+
return VBuilder.createSimpleReduction(Id, SrcTy, Ops);
13471347
}
13481348

13491349
void llvm::propagateIRFlags(Value *I, ArrayRef<Value *> VL, Value *OpValue,

llvm/lib/Transforms/Vectorize/VPlan.h

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1585,18 +1585,8 @@ class VPWidenIntrinsicRecipe : public VPRecipeWithIRFlags {
15851585
bool MayHaveSideEffects;
15861586

15871587
public:
1588-
VPWidenIntrinsicRecipe(CallInst &CI, Intrinsic::ID VectorIntrinsicID,
1589-
ArrayRef<VPValue *> CallArguments, Type *Ty,
1590-
DebugLoc DL = {})
1591-
: VPRecipeWithIRFlags(VPDef::VPWidenIntrinsicSC, CallArguments, CI),
1592-
VectorIntrinsicID(VectorIntrinsicID), ResultTy(Ty),
1593-
MayReadFromMemory(CI.mayReadFromMemory()),
1594-
MayWriteToMemory(CI.mayWriteToMemory()),
1595-
MayHaveSideEffects(CI.mayHaveSideEffects()) {}
1596-
1597-
template <typename IterT>
15981588
VPWidenIntrinsicRecipe(Instruction &I, Intrinsic::ID VectorIntrinsicID,
1599-
iterator_range<IterT> Operands, Type *Ty,
1589+
ArrayRef<VPValue *> Operands, Type *Ty,
16001590
DebugLoc DL = {})
16011591
: VPRecipeWithIRFlags(VPDef::VPWidenIntrinsicSC, Operands, I),
16021592
VectorIntrinsicID(VectorIntrinsicID), ResultTy(Ty),

llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp

Lines changed: 21 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -954,45 +954,31 @@ void VPWidenIntrinsicRecipe::execute(VPTransformState &State) {
954954
Args.push_back(Arg);
955955
}
956956

957-
if (VPIntrinsic::isVPIntrinsic(VectorIntrinsicID) &&
958-
VectorIntrinsicID != Intrinsic::vp_select) {
959-
VectorBuilder VBuilder(State.Builder);
960-
Value *Mask =
961-
State.Builder.CreateVectorSplat(State.VF, State.Builder.getTrue());
962-
VBuilder.setMask(Mask).setEVL(Args.back());
963-
// Remove EVL from Args
964-
Args.pop_back();
965-
966-
Value *VPInst = VBuilder.createSimpleIntrinsic(
967-
VectorIntrinsicID, TysForDecl[0], Args, "vp.call");
968-
969-
if (isa<FPMathOperator>(VPInst))
970-
setFlags(cast<Instruction>(VPInst));
971-
972-
if (!VPInst->getType()->isVoidTy())
973-
State.set(this, VPInst);
974-
State.addMetadata(VPInst,
975-
dyn_cast_or_null<Instruction>(getUnderlyingValue()));
976-
} else {
977-
// Use vector version of the intrinsic.
978-
Module *M = State.Builder.GetInsertBlock()->getModule();
979-
Function *VectorF =
980-
Intrinsic::getOrInsertDeclaration(M, VectorIntrinsicID, TysForDecl);
981-
assert(VectorF && "Can't retrieve vector intrinsic.");
982-
983-
auto *CI = cast_or_null<CallInst>(getUnderlyingValue());
984-
SmallVector<OperandBundleDef, 1> OpBundles;
985-
if (CI)
986-
CI->getOperandBundlesAsDefs(OpBundles);
957+
// Use vector version of the intrinsic.
958+
Module *M = State.Builder.GetInsertBlock()->getModule();
959+
bool IsVPIntrinsic = VPIntrinsic::isVPIntrinsic(VectorIntrinsicID);
960+
Function *VectorF =
961+
Intrinsic::getOrInsertDeclaration(M, VectorIntrinsicID, TysForDecl);
962+
assert(VectorF && "Can't retrieve vector intrinsic.");
987963

988-
CallInst *V = State.Builder.CreateCall(VectorF, Args, OpBundles);
964+
SmallVector<OperandBundleDef, 1> OpBundles;
965+
if (!IsVPIntrinsic) {
966+
if (auto *CI = cast_or_null<CallInst>(getUnderlyingValue()))
967+
CI->getOperandBundlesAsDefs(OpBundles);
968+
}
989969

990-
setFlags(V);
970+
Value *V = State.Builder.CreateCall(VectorF, Args, OpBundles);
991971

992-
if (!V->getType()->isVoidTy())
993-
State.set(this, V);
994-
State.addMetadata(V, CI);
972+
if (IsVPIntrinsic) {
973+
if (isa<FPMathOperator>(V))
974+
setFlags(cast<Instruction>(V));
975+
} else {
976+
setFlags(cast<Instruction>(V));
995977
}
978+
979+
if (!V->getType()->isVoidTy())
980+
State.set(this, V);
981+
State.addMetadata(V, dyn_cast_or_null<Instruction>(getUnderlyingValue()));
996982
}
997983

998984
InstructionCost VPWidenIntrinsicRecipe::computeCost(ElementCount VF,

llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1469,13 +1469,20 @@ static void transformRecipestoEVLRecipes(VPlan &Plan, VPValue &EVL) {
14691469
if (!Instruction::isBinaryOp(Opcode) &&
14701470
!Instruction::isUnaryOp(Opcode))
14711471
return nullptr;
1472+
14721473
auto *I = cast<Instruction>(W->getUnderlyingInstr());
1474+
Intrinsic::ID VPID = VPIntrinsic::getForOpcode(Opcode);
14731475
SmallVector<VPValue *> Ops(W->operands());
1476+
assert(VPIntrinsic::getMaskParamPos(VPID) &&
1477+
VPIntrinsic::getVectorLengthParamPos(VPID) &&
1478+
"Expected VP intrinsic");
1479+
VPValue *Mask = Plan.getOrAddLiveIn(ConstantInt::getTrue(
1480+
IntegerType::getInt1Ty(I->getContext())));
1481+
Ops.push_back(Mask);
14741482
Ops.push_back(&EVL);
1475-
Intrinsic::ID VPID = VPIntrinsic::getForOpcode(W->getOpcode());
1476-
return new VPWidenIntrinsicRecipe(
1477-
*I, VPID, make_range(Ops.begin(), Ops.end()), I->getType(),
1478-
I->getDebugLoc());
1483+
return new VPWidenIntrinsicRecipe(*I, VPID, Ops,
1484+
TypeInfo.inferScalarType(W),
1485+
W->getDebugLoc());
14791486
})
14801487
.Case<VPReductionRecipe>([&](VPReductionRecipe *Red) {
14811488
VPValue *NewMask = GetNewMask(Red->getCondOp());

llvm/test/Transforms/LoopVectorize/RISCV/vplan-vp-intrinsics.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ define void @foo(ptr noalias %a, ptr noalias %b, ptr noalias %c, i64 %N) {
3232
; IF-EVL-NEXT: CLONE ir<[[GEP2:%.+]]> = getelementptr inbounds ir<%c>, vp<[[ST]]>
3333
; IF-EVL-NEXT: vp<[[PTR2:%[0-9]+]]> = vector-pointer ir<[[GEP2]]>
3434
; IF-EVL-NEXT: WIDEN ir<[[LD2:%.+]]> = vp.load vp<[[PTR2]]>, vp<[[EVL]]>
35-
; IF-EVL-NEXT: WIDEN-INTRINSIC ir<[[ADD:%.+]]> = call nsw llvm.vp.add(ir<[[LD2]]>, ir<[[LD1]]>, vp<[[EVL]]>)
35+
; IF-EVL-NEXT: WIDEN-INTRINSIC ir<[[ADD:%.+]]> = call nsw llvm.vp.add(ir<[[LD2]]>, ir<[[LD1]]>, ir<true>, vp<[[EVL]]>)
3636
; IF-EVL-NEXT: CLONE ir<[[GEP3:%.+]]> = getelementptr inbounds ir<%a>, vp<[[ST]]>
3737
; IF-EVL-NEXT: vp<[[PTR3:%[0-9]+]]> = vector-pointer ir<[[GEP3]]>
3838
; IF-EVL-NEXT: WIDEN vp.store vp<[[PTR3]]>, ir<[[ADD]]>, vp<[[EVL]]>

llvm/test/Transforms/LoopVectorize/RISCV/vplan-vp-select-intrinsics.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@
2828
; IF-EVL-NEXT: vp<[[PTR2:%[0-9]+]]> = vector-pointer ir<[[GEP2]]>
2929
; IF-EVL-NEXT: WIDEN ir<[[LD2:%.+]]> = vp.load vp<[[PTR2]]>, vp<[[EVL]]>
3030
; IF-EVL-NEXT: WIDEN ir<[[CMP:%.+]]> = icmp sgt ir<[[LD1]]>, ir<[[LD2]]>
31-
; IF-EVL-NEXT: WIDEN-INTRINSIC ir<[[SUB:%.+]]> = call llvm.vp.sub(ir<0>, ir<[[LD2]]>, vp<[[EVL]]>)
31+
; IF-EVL-NEXT: WIDEN-INTRINSIC ir<[[SUB:%.+]]> = call llvm.vp.sub(ir<0>, ir<[[LD2]]>, ir<true>, vp<[[EVL]]>)
3232
; IF-EVL-NEXT: WIDEN-INTRINSIC vp<[[SELECT:%.+]]> = call llvm.vp.select(ir<[[CMP]]>, ir<%1>, ir<%2>, vp<[[EVL]]>)
33-
; IF-EVL-NEXT: WIDEN-INTRINSIC ir<[[ADD:%.+]]> = call llvm.vp.add(vp<[[SELECT]]>, ir<[[LD1]]>, vp<[[EVL]]>)
33+
; IF-EVL-NEXT: WIDEN-INTRINSIC ir<[[ADD:%.+]]> = call llvm.vp.add(vp<[[SELECT]]>, ir<[[LD1]]>, ir<true>, vp<[[EVL]]>)
3434
; IF-EVL-NEXT: CLONE ir<[[GEP3:%.+]]> = getelementptr inbounds ir<%a>, vp<[[ST]]>
3535
; IF-EVL-NEXT: vp<[[PTR3:%.+]]> = vector-pointer ir<[[GEP3]]>
3636
; IF-EVL-NEXT: WIDEN vp.store vp<[[PTR3]]>, ir<[[ADD]]>, vp<[[EVL]]>

0 commit comments

Comments
 (0)