Skip to content

Commit 5b4000d

Browse files
authored
[VectorUtils] Add llvm::scaleShuffleMaskElts wrapper for narrowShuffleMaskElts/widenShuffleMaskElts, NFC. (llvm#96646)
Using the target number of vector elements, scaleShuffleMaskElts will try to use narrowShuffleMaskElts/widenShuffleMaskElts to scale the shuffle mask accordingly. Working on llvm#58895 I didn't want to create yet another case where we have to handle both re-scaling cases.
1 parent 8681bb8 commit 5b4000d

File tree

3 files changed

+33
-9
lines changed

3 files changed

+33
-9
lines changed

llvm/include/llvm/Analysis/VectorUtils.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,13 @@ void narrowShuffleMaskElts(int Scale, ArrayRef<int> Mask,
224224
bool widenShuffleMaskElts(int Scale, ArrayRef<int> Mask,
225225
SmallVectorImpl<int> &ScaledMask);
226226

227+
/// Attempt to narrow/widen the \p Mask shuffle mask to the \p NumDstElts target
228+
/// width. Internally this will call narrowShuffleMaskElts/widenShuffleMaskElts.
229+
/// This will assert unless NumDstElts is a multiple of Mask.size (or vice-versa).
230+
/// Returns false on failure, and ScaledMask will be in an undefined state.
231+
bool scaleShuffleMaskElts(unsigned NumDstElts, ArrayRef<int> Mask,
232+
SmallVectorImpl<int> &ScaledMask);
233+
227234
/// Repetitively apply `widenShuffleMaskElts()` for as long as it succeeds,
228235
/// to get the shuffle mask with widest possible elements.
229236
void getShuffleMaskWithWidestElts(ArrayRef<int> Mask,

llvm/lib/Analysis/VectorUtils.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,31 @@ bool llvm::widenShuffleMaskElts(int Scale, ArrayRef<int> Mask,
418418
return true;
419419
}
420420

421+
bool llvm::scaleShuffleMaskElts(unsigned NumDstElts, ArrayRef<int> Mask,
422+
SmallVectorImpl<int> &ScaledMask) {
423+
unsigned NumSrcElts = Mask.size();
424+
assert(NumSrcElts > 0 && NumDstElts > 0 && "Unexpected scaling factor");
425+
426+
// Fast-path: if no scaling, then it is just a copy.
427+
if (NumSrcElts == NumDstElts) {
428+
ScaledMask.assign(Mask.begin(), Mask.end());
429+
return true;
430+
}
431+
432+
// Ensure we can find a whole scale factor.
433+
assert(((NumSrcElts % NumDstElts) == 0 || (NumDstElts % NumSrcElts) == 0) &&
434+
"Unexpected scaling factor");
435+
436+
if (NumSrcElts > NumDstElts) {
437+
int Scale = NumSrcElts / NumDstElts;
438+
return widenShuffleMaskElts(Scale, Mask, ScaledMask);
439+
}
440+
441+
int Scale = NumDstElts / NumSrcElts;
442+
narrowShuffleMaskElts(Scale, Mask, ScaledMask);
443+
return true;
444+
}
445+
421446
void llvm::getShuffleMaskWithWidestElts(ArrayRef<int> Mask,
422447
SmallVectorImpl<int> &ScaledMask) {
423448
std::array<SmallVector<int, 16>, 2> TmpMasks;

llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2837,15 +2837,7 @@ Instruction *InstCombinerImpl::visitShuffleVectorInst(ShuffleVectorInst &SVI) {
28372837
auto *XType = cast<FixedVectorType>(X->getType());
28382838
unsigned XNumElts = XType->getNumElements();
28392839
SmallVector<int, 16> ScaledMask;
2840-
if (XNumElts >= VWidth) {
2841-
assert(XNumElts % VWidth == 0 && "Unexpected vector bitcast");
2842-
narrowShuffleMaskElts(XNumElts / VWidth, Mask, ScaledMask);
2843-
} else {
2844-
assert(VWidth % XNumElts == 0 && "Unexpected vector bitcast");
2845-
if (!widenShuffleMaskElts(VWidth / XNumElts, Mask, ScaledMask))
2846-
ScaledMask.clear();
2847-
}
2848-
if (!ScaledMask.empty()) {
2840+
if (scaleShuffleMaskElts(XNumElts, Mask, ScaledMask)) {
28492841
// If the shuffled source vector simplifies, cast that value to this
28502842
// shuffle's type.
28512843
if (auto *V = simplifyShuffleVectorInst(X, UndefValue::get(XType),

0 commit comments

Comments
 (0)