Skip to content

Commit 6fbc397

Browse files
authored
[IR] Add new CreateVectorInterleave interface (#150931)
This PR adds a new interface to IRBuilder called CreateVectorInterleave, which can be used to create vector.interleave intrinsics of factors 2-8. For convenience I have also moved getInterleaveIntrinsicID and getDeinterleaveIntrinsicID from VectorUtils.cpp to Intrinsics.cpp where it can be used by IRBuilder.
1 parent 4745637 commit 6fbc397

File tree

8 files changed

+71
-53
lines changed

8 files changed

+71
-53
lines changed

llvm/include/llvm/Analysis/VectorUtils.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -177,12 +177,6 @@ LLVM_ABI bool isVectorIntrinsicWithStructReturnOverloadAtField(
177177
LLVM_ABI Intrinsic::ID
178178
getVectorIntrinsicIDForCall(const CallInst *CI, const TargetLibraryInfo *TLI);
179179

180-
/// Returns the corresponding llvm.vector.interleaveN intrinsic for factor N.
181-
LLVM_ABI Intrinsic::ID getInterleaveIntrinsicID(unsigned Factor);
182-
183-
/// Returns the corresponding llvm.vector.deinterleaveN intrinsic for factor N.
184-
LLVM_ABI Intrinsic::ID getDeinterleaveIntrinsicID(unsigned Factor);
185-
186180
/// Returns the corresponding factor of llvm.vector.interleaveN intrinsics.
187181
LLVM_ABI unsigned getInterleaveIntrinsicFactor(Intrinsic::ID ID);
188182

llvm/include/llvm/IR/IRBuilder.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2614,6 +2614,8 @@ class IRBuilderBase {
26142614
return CreateShuffleVector(V, PoisonValue::get(V->getType()), Mask, Name);
26152615
}
26162616

2617+
Value *CreateVectorInterleave(ArrayRef<Value *> Ops, const Twine &Name = "");
2618+
26172619
Value *CreateExtractValue(Value *Agg, ArrayRef<unsigned> Idxs,
26182620
const Twine &Name = "") {
26192621
if (auto *V = Folder.FoldExtractValue(Agg, Idxs))

llvm/include/llvm/IR/Intrinsics.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,8 +283,15 @@ namespace Intrinsic {
283283
// or of the wrong kind will be renamed by adding ".renamed" to the name.
284284
LLVM_ABI std::optional<Function *> remangleIntrinsicFunction(Function *F);
285285

286-
} // End Intrinsic namespace
286+
/// Returns the corresponding llvm.vector.interleaveN intrinsic for factor N.
287+
LLVM_ABI Intrinsic::ID getInterleaveIntrinsicID(unsigned Factor);
287288

288-
} // End llvm namespace
289+
/// Returns the corresponding llvm.vector.deinterleaveN intrinsic for factor
290+
/// N.
291+
LLVM_ABI Intrinsic::ID getDeinterleaveIntrinsicID(unsigned Factor);
292+
293+
} // namespace Intrinsic
294+
295+
} // namespace llvm
289296

290297
#endif

llvm/lib/Analysis/VectorUtils.cpp

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -240,30 +240,6 @@ Intrinsic::ID llvm::getVectorIntrinsicIDForCall(const CallInst *CI,
240240
return Intrinsic::not_intrinsic;
241241
}
242242

243-
struct InterleaveIntrinsic {
244-
Intrinsic::ID Interleave, Deinterleave;
245-
};
246-
247-
static InterleaveIntrinsic InterleaveIntrinsics[] = {
248-
{Intrinsic::vector_interleave2, Intrinsic::vector_deinterleave2},
249-
{Intrinsic::vector_interleave3, Intrinsic::vector_deinterleave3},
250-
{Intrinsic::vector_interleave4, Intrinsic::vector_deinterleave4},
251-
{Intrinsic::vector_interleave5, Intrinsic::vector_deinterleave5},
252-
{Intrinsic::vector_interleave6, Intrinsic::vector_deinterleave6},
253-
{Intrinsic::vector_interleave7, Intrinsic::vector_deinterleave7},
254-
{Intrinsic::vector_interleave8, Intrinsic::vector_deinterleave8},
255-
};
256-
257-
Intrinsic::ID llvm::getInterleaveIntrinsicID(unsigned Factor) {
258-
assert(Factor >= 2 && Factor <= 8 && "Unexpected factor");
259-
return InterleaveIntrinsics[Factor - 2].Interleave;
260-
}
261-
262-
Intrinsic::ID llvm::getDeinterleaveIntrinsicID(unsigned Factor) {
263-
assert(Factor >= 2 && Factor <= 8 && "Unexpected factor");
264-
return InterleaveIntrinsics[Factor - 2].Deinterleave;
265-
}
266-
267243
unsigned llvm::getInterleaveIntrinsicFactor(Intrinsic::ID ID) {
268244
switch (ID) {
269245
case Intrinsic::vector_interleave2:

llvm/lib/CodeGen/ComplexDeinterleavingPass.cpp

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2194,11 +2194,10 @@ Value *ComplexDeinterleavingGraph::replaceNode(IRBuilderBase &Builder,
21942194
// Splats that are not constant are interleaved where they are located
21952195
Instruction *InsertPoint = (I->comesBefore(R) ? R : I)->getNextNode();
21962196
IRBuilder<> IRB(InsertPoint);
2197-
ReplacementNode = IRB.CreateIntrinsic(Intrinsic::vector_interleave2,
2198-
NewTy, {Node->Real, Node->Imag});
2197+
ReplacementNode = IRB.CreateVectorInterleave({Node->Real, Node->Imag});
21992198
} else {
2200-
ReplacementNode = Builder.CreateIntrinsic(
2201-
Intrinsic::vector_interleave2, NewTy, {Node->Real, Node->Imag});
2199+
ReplacementNode =
2200+
Builder.CreateVectorInterleave({Node->Real, Node->Imag});
22022201
}
22032202
break;
22042203
}
@@ -2228,8 +2227,7 @@ Value *ComplexDeinterleavingGraph::replaceNode(IRBuilderBase &Builder,
22282227
auto *B = replaceNode(Builder, Node->Operands[1]);
22292228
auto *NewMaskTy = VectorType::getDoubleElementsVectorType(
22302229
cast<VectorType>(MaskReal->getType()));
2231-
auto *NewMask = Builder.CreateIntrinsic(Intrinsic::vector_interleave2,
2232-
NewMaskTy, {MaskReal, MaskImag});
2230+
auto *NewMask = Builder.CreateVectorInterleave({MaskReal, MaskImag});
22332231
ReplacementNode = Builder.CreateSelect(NewMask, A, B);
22342232
break;
22352233
}
@@ -2260,8 +2258,8 @@ void ComplexDeinterleavingGraph::processReductionSingle(
22602258
}
22612259

22622260
if (!NewInit)
2263-
NewInit = Builder.CreateIntrinsic(Intrinsic::vector_interleave2, NewVTy,
2264-
{Init, Constant::getNullValue(VTy)});
2261+
NewInit =
2262+
Builder.CreateVectorInterleave({Init, Constant::getNullValue(VTy)});
22652263

22662264
NewPHI->addIncoming(NewInit, Incoming);
22672265
NewPHI->addIncoming(OperationReplacement, BackEdge);
@@ -2289,8 +2287,7 @@ void ComplexDeinterleavingGraph::processReductionOperation(
22892287
Value *InitImag = OldPHIImag->getIncomingValueForBlock(Incoming);
22902288

22912289
IRBuilder<> Builder(Incoming->getTerminator());
2292-
auto *NewInit = Builder.CreateIntrinsic(Intrinsic::vector_interleave2, NewVTy,
2293-
{InitReal, InitImag});
2290+
auto *NewInit = Builder.CreateVectorInterleave({InitReal, InitImag});
22942291

22952292
NewPHI->addIncoming(NewInit, Incoming);
22962293
NewPHI->addIncoming(OperationReplacement, BackEdge);

llvm/lib/IR/IRBuilder.cpp

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1144,9 +1144,32 @@ Value *IRBuilderBase::CreateVectorSplat(ElementCount EC, Value *V,
11441144
return CreateShuffleVector(V, Zeros, Name + ".splat");
11451145
}
11461146

1147-
Value *IRBuilderBase::CreatePreserveArrayAccessIndex(
1148-
Type *ElTy, Value *Base, unsigned Dimension, unsigned LastIndex,
1149-
MDNode *DbgInfo) {
1147+
Value *IRBuilderBase::CreateVectorInterleave(ArrayRef<Value *> Ops,
1148+
const Twine &Name) {
1149+
assert(Ops.size() >= 2 && Ops.size() <= 8 &&
1150+
"Unexpected number of operands to interleave");
1151+
1152+
// Make sure all operands are the same type.
1153+
assert(isa<VectorType>(Ops[0]->getType()) && "Unexpected type");
1154+
1155+
#ifndef NDEBUG
1156+
for (unsigned I = 1; I < Ops.size(); I++) {
1157+
assert(Ops[I]->getType() == Ops[0]->getType() &&
1158+
"Vector interleave expects matching operand types!");
1159+
}
1160+
#endif
1161+
1162+
unsigned IID = Intrinsic::getInterleaveIntrinsicID(Ops.size());
1163+
auto *SubvecTy = cast<VectorType>(Ops[0]->getType());
1164+
Type *DestTy = VectorType::get(SubvecTy->getElementType(),
1165+
SubvecTy->getElementCount() * Ops.size());
1166+
return CreateIntrinsic(IID, {DestTy}, Ops, {}, Name);
1167+
}
1168+
1169+
Value *IRBuilderBase::CreatePreserveArrayAccessIndex(Type *ElTy, Value *Base,
1170+
unsigned Dimension,
1171+
unsigned LastIndex,
1172+
MDNode *DbgInfo) {
11501173
auto *BaseType = Base->getType();
11511174
assert(isa<PointerType>(BaseType) &&
11521175
"Invalid Base ptr type for preserve.array.access.index.");

llvm/lib/IR/Intrinsics.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1133,3 +1133,27 @@ std::optional<Function *> Intrinsic::remangleIntrinsicFunction(Function *F) {
11331133
"Shouldn't change the signature");
11341134
return NewDecl;
11351135
}
1136+
1137+
struct InterleaveIntrinsic {
1138+
Intrinsic::ID Interleave, Deinterleave;
1139+
};
1140+
1141+
static InterleaveIntrinsic InterleaveIntrinsics[] = {
1142+
{Intrinsic::vector_interleave2, Intrinsic::vector_deinterleave2},
1143+
{Intrinsic::vector_interleave3, Intrinsic::vector_deinterleave3},
1144+
{Intrinsic::vector_interleave4, Intrinsic::vector_deinterleave4},
1145+
{Intrinsic::vector_interleave5, Intrinsic::vector_deinterleave5},
1146+
{Intrinsic::vector_interleave6, Intrinsic::vector_deinterleave6},
1147+
{Intrinsic::vector_interleave7, Intrinsic::vector_deinterleave7},
1148+
{Intrinsic::vector_interleave8, Intrinsic::vector_deinterleave8},
1149+
};
1150+
1151+
Intrinsic::ID Intrinsic::getInterleaveIntrinsicID(unsigned Factor) {
1152+
assert(Factor >= 2 && Factor <= 8 && "Unexpected factor");
1153+
return InterleaveIntrinsics[Factor - 2].Interleave;
1154+
}
1155+
1156+
Intrinsic::ID Intrinsic::getDeinterleaveIntrinsicID(unsigned Factor) {
1157+
assert(Factor >= 2 && Factor <= 8 && "Unexpected factor");
1158+
return InterleaveIntrinsics[Factor - 2].Deinterleave;
1159+
}

llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3391,12 +3391,7 @@ static Value *interleaveVectors(IRBuilderBase &Builder, ArrayRef<Value *> Vals,
33913391
// must use intrinsics to interleave.
33923392
if (VecTy->isScalableTy()) {
33933393
assert(Factor <= 8 && "Unsupported interleave factor for scalable vectors");
3394-
VectorType *InterleaveTy =
3395-
VectorType::get(VecTy->getElementType(),
3396-
VecTy->getElementCount().multiplyCoefficientBy(Factor));
3397-
return Builder.CreateIntrinsic(InterleaveTy,
3398-
getInterleaveIntrinsicID(Factor), Vals,
3399-
/*FMFSource=*/nullptr, Name);
3394+
return Builder.CreateVectorInterleave(Vals, Name);
34003395
}
34013396

34023397
// Fixed length. Start by concatenating all vectors into a wide vector.
@@ -3503,8 +3498,8 @@ void VPInterleaveRecipe::execute(VPTransformState &State) {
35033498
assert(InterleaveFactor <= 8 &&
35043499
"Unsupported deinterleave factor for scalable vectors");
35053500
NewLoad = State.Builder.CreateIntrinsic(
3506-
getDeinterleaveIntrinsicID(InterleaveFactor), NewLoad->getType(),
3507-
NewLoad,
3501+
Intrinsic::getDeinterleaveIntrinsicID(InterleaveFactor),
3502+
NewLoad->getType(), NewLoad,
35083503
/*FMFSource=*/nullptr, "strided.vec");
35093504
}
35103505

0 commit comments

Comments
 (0)