Skip to content

Commit ae810dd

Browse files
authored
[IA][NFC] Factoring out helper functions that extract (de)interleaving factors (#148689)
Factoring out and combining `isInterleaveIntrinsic`, `isDeinterleaveIntrinsic`, and `getIntrinsicFactor` into `getInterleaveIntrinsicFactor` and `getDeinterleaveIntrinsicFactor` inside VectorUtils. NFC.
1 parent d4f5ed6 commit ae810dd

File tree

3 files changed

+58
-64
lines changed

3 files changed

+58
-64
lines changed

llvm/include/llvm/Analysis/VectorUtils.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,12 @@ LLVM_ABI Intrinsic::ID getInterleaveIntrinsicID(unsigned Factor);
182182
/// Returns the corresponding llvm.vector.deinterleaveN intrinsic for factor N.
183183
LLVM_ABI Intrinsic::ID getDeinterleaveIntrinsicID(unsigned Factor);
184184

185+
/// Returns the corresponding factor of llvm.vector.interleaveN intrinsics.
186+
LLVM_ABI unsigned getInterleaveIntrinsicFactor(Intrinsic::ID ID);
187+
188+
/// Returns the corresponding factor of llvm.vector.deinterleaveN intrinsics.
189+
LLVM_ABI unsigned getDeinterleaveIntrinsicFactor(Intrinsic::ID ID);
190+
185191
/// Given a vector and an element number, see if the scalar value is
186192
/// already around as a register, for example if it were inserted then extracted
187193
/// from the vector.

llvm/lib/Analysis/VectorUtils.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,48 @@ Intrinsic::ID llvm::getDeinterleaveIntrinsicID(unsigned Factor) {
264264
return InterleaveIntrinsics[Factor - 2].Deinterleave;
265265
}
266266

267+
unsigned llvm::getInterleaveIntrinsicFactor(Intrinsic::ID ID) {
268+
switch (ID) {
269+
case Intrinsic::vector_interleave2:
270+
return 2;
271+
case Intrinsic::vector_interleave3:
272+
return 3;
273+
case Intrinsic::vector_interleave4:
274+
return 4;
275+
case Intrinsic::vector_interleave5:
276+
return 5;
277+
case Intrinsic::vector_interleave6:
278+
return 6;
279+
case Intrinsic::vector_interleave7:
280+
return 7;
281+
case Intrinsic::vector_interleave8:
282+
return 8;
283+
default:
284+
return 0;
285+
}
286+
}
287+
288+
unsigned llvm::getDeinterleaveIntrinsicFactor(Intrinsic::ID ID) {
289+
switch (ID) {
290+
case Intrinsic::vector_deinterleave2:
291+
return 2;
292+
case Intrinsic::vector_deinterleave3:
293+
return 3;
294+
case Intrinsic::vector_deinterleave4:
295+
return 4;
296+
case Intrinsic::vector_deinterleave5:
297+
return 5;
298+
case Intrinsic::vector_deinterleave6:
299+
return 6;
300+
case Intrinsic::vector_deinterleave7:
301+
return 7;
302+
case Intrinsic::vector_deinterleave8:
303+
return 8;
304+
default:
305+
return 0;
306+
}
307+
}
308+
267309
/// Given a vector and an element number, see if the scalar value is
268310
/// already around as a register, for example if it were inserted then extracted
269311
/// from the vector.

llvm/lib/CodeGen/InterleavedAccessPass.cpp

Lines changed: 10 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
#include "llvm/ADT/DenseMap.h"
4949
#include "llvm/ADT/SetVector.h"
5050
#include "llvm/ADT/SmallVector.h"
51+
#include "llvm/Analysis/VectorUtils.h"
5152
#include "llvm/CodeGen/InterleavedAccess.h"
5253
#include "llvm/CodeGen/TargetLowering.h"
5354
#include "llvm/CodeGen/TargetPassConfig.h"
@@ -574,69 +575,11 @@ bool InterleavedAccessImpl::lowerInterleavedStore(
574575
return true;
575576
}
576577

577-
static bool isInterleaveIntrinsic(Intrinsic::ID IID) {
578-
switch (IID) {
579-
case Intrinsic::vector_interleave2:
580-
case Intrinsic::vector_interleave3:
581-
case Intrinsic::vector_interleave4:
582-
case Intrinsic::vector_interleave5:
583-
case Intrinsic::vector_interleave6:
584-
case Intrinsic::vector_interleave7:
585-
case Intrinsic::vector_interleave8:
586-
return true;
587-
default:
588-
return false;
589-
}
590-
}
591-
592-
static bool isDeinterleaveIntrinsic(Intrinsic::ID IID) {
593-
switch (IID) {
594-
case Intrinsic::vector_deinterleave2:
595-
case Intrinsic::vector_deinterleave3:
596-
case Intrinsic::vector_deinterleave4:
597-
case Intrinsic::vector_deinterleave5:
598-
case Intrinsic::vector_deinterleave6:
599-
case Intrinsic::vector_deinterleave7:
600-
case Intrinsic::vector_deinterleave8:
601-
return true;
602-
default:
603-
return false;
604-
}
605-
}
606-
607-
static unsigned getIntrinsicFactor(const IntrinsicInst *II) {
608-
switch (II->getIntrinsicID()) {
609-
case Intrinsic::vector_deinterleave2:
610-
case Intrinsic::vector_interleave2:
611-
return 2;
612-
case Intrinsic::vector_deinterleave3:
613-
case Intrinsic::vector_interleave3:
614-
return 3;
615-
case Intrinsic::vector_deinterleave4:
616-
case Intrinsic::vector_interleave4:
617-
return 4;
618-
case Intrinsic::vector_deinterleave5:
619-
case Intrinsic::vector_interleave5:
620-
return 5;
621-
case Intrinsic::vector_deinterleave6:
622-
case Intrinsic::vector_interleave6:
623-
return 6;
624-
case Intrinsic::vector_deinterleave7:
625-
case Intrinsic::vector_interleave7:
626-
return 7;
627-
case Intrinsic::vector_deinterleave8:
628-
case Intrinsic::vector_interleave8:
629-
return 8;
630-
default:
631-
llvm_unreachable("Unexpected intrinsic");
632-
}
633-
}
634-
635578
static Value *getMask(Value *WideMask, unsigned Factor,
636579
ElementCount LeafValueEC) {
637580
if (auto *IMI = dyn_cast<IntrinsicInst>(WideMask)) {
638-
if (isInterleaveIntrinsic(IMI->getIntrinsicID()) &&
639-
getIntrinsicFactor(IMI) == Factor && llvm::all_equal(IMI->args())) {
581+
if (unsigned F = getInterleaveIntrinsicFactor(IMI->getIntrinsicID());
582+
F && F == Factor && llvm::all_equal(IMI->args())) {
640583
return IMI->getArgOperand(0);
641584
}
642585
}
@@ -672,7 +615,9 @@ bool InterleavedAccessImpl::lowerDeinterleaveIntrinsic(
672615
if (!LoadedVal->hasOneUse() || !isa<LoadInst, VPIntrinsic>(LoadedVal))
673616
return false;
674617

675-
const unsigned Factor = getIntrinsicFactor(DI);
618+
const unsigned Factor = getDeinterleaveIntrinsicFactor(DI->getIntrinsicID());
619+
assert(Factor && "unexpected deinterleave intrinsic");
620+
676621
SmallVector<Value *, 8> DeinterleaveValues(Factor, nullptr);
677622
Value *LastFactor = nullptr;
678623
for (auto *User : DI->users()) {
@@ -738,7 +683,8 @@ bool InterleavedAccessImpl::lowerInterleaveIntrinsic(
738683
return false;
739684

740685
SmallVector<Value *, 8> InterleaveValues(II->args());
741-
const unsigned Factor = getIntrinsicFactor(II);
686+
const unsigned Factor = getInterleaveIntrinsicFactor(II->getIntrinsicID());
687+
assert(Factor && "unexpected interleave intrinsic");
742688

743689
if (auto *VPStore = dyn_cast<VPIntrinsic>(StoredBy)) {
744690
if (VPStore->getIntrinsicID() != Intrinsic::vp_store)
@@ -792,9 +738,9 @@ bool InterleavedAccessImpl::runOnFunction(Function &F) {
792738
Changed |= lowerInterleavedStore(&I, DeadInsts);
793739

794740
if (auto *II = dyn_cast<IntrinsicInst>(&I)) {
795-
if (isDeinterleaveIntrinsic(II->getIntrinsicID()))
741+
if (getDeinterleaveIntrinsicFactor(II->getIntrinsicID()))
796742
Changed |= lowerDeinterleaveIntrinsic(II, DeadInsts);
797-
else if (isInterleaveIntrinsic(II->getIntrinsicID()))
743+
else if (getInterleaveIntrinsicFactor(II->getIntrinsicID()))
798744
Changed |= lowerInterleaveIntrinsic(II, DeadInsts);
799745
}
800746
}

0 commit comments

Comments
 (0)