forked from OSchip/llvm-project
[Analysis] add utility function for unary shuffle mask creation
This is NFC-intended for the callers. Posting in case there are other potential users that I missed. I would also use this from VectorCombine in a patch for: https://llvm.org/PR52178 ( D111901 ) Differential Revision: https://reviews.llvm.org/D111891
This commit is contained in:
parent
72d04d7b2b
commit
2a3cc4d461
|
@ -533,6 +533,12 @@ llvm::SmallVector<int, 16> createStrideMask(unsigned Start, unsigned Stride,
|
|||
llvm::SmallVector<int, 16>
|
||||
createSequentialMask(unsigned Start, unsigned NumInts, unsigned NumUndefs);
|
||||
|
||||
/// Given a shuffle mask for a binary shuffle, create the equivalent shuffle
|
||||
/// mask assuming both operands are identical. This assumes that the unary
|
||||
/// shuffle will use elements from operand 0 (operand 1 will be unused).
|
||||
llvm::SmallVector<int, 16> createUnaryMask(ArrayRef<int> Mask,
|
||||
unsigned NumElts);
|
||||
|
||||
/// Concatenate a list of vectors.
|
||||
///
|
||||
/// This function generates code that concatenate the vectors in \p Vecs into a
|
||||
|
|
|
@ -830,6 +830,23 @@ llvm::SmallVector<int, 16> llvm::createSequentialMask(unsigned Start,
|
|||
return Mask;
|
||||
}
|
||||
|
||||
llvm::SmallVector<int, 16> llvm::createUnaryMask(ArrayRef<int> Mask,
|
||||
unsigned NumElts) {
|
||||
// Avoid casts in the loop and make sure we have a reasonable number.
|
||||
int NumEltsSigned = NumElts;
|
||||
assert(NumEltsSigned > 0 && "Expected smaller or non-zero element count");
|
||||
|
||||
// If the mask chooses an element from operand 1, reduce it to choose from the
|
||||
// corresponding element of operand 0. Undef mask elements are unchanged.
|
||||
SmallVector<int, 16> UnaryMask;
|
||||
for (int MaskElt : Mask) {
|
||||
assert((MaskElt < NumEltsSigned * 2) && "Expected valid shuffle mask");
|
||||
int UnaryElt = MaskElt >= NumEltsSigned ? MaskElt - NumEltsSigned : MaskElt;
|
||||
UnaryMask.push_back(UnaryElt);
|
||||
}
|
||||
return UnaryMask;
|
||||
}
|
||||
|
||||
/// A helper function for concatenating vectors. This function concatenates two
|
||||
/// vectors having the same element type. If the second vector has fewer
|
||||
/// elements than the first, it is padded with undefs.
|
||||
|
|
|
@ -21254,15 +21254,9 @@ SDValue DAGCombiner::visitVECTOR_SHUFFLE(SDNode *N) {
|
|||
ShuffleVectorSDNode *SVN = cast<ShuffleVectorSDNode>(N);
|
||||
|
||||
// Canonicalize shuffle v, v -> v, undef
|
||||
if (N0 == N1) {
|
||||
SmallVector<int, 8> NewMask;
|
||||
for (unsigned i = 0; i != NumElts; ++i) {
|
||||
int Idx = SVN->getMaskElt(i);
|
||||
if (Idx >= (int)NumElts) Idx -= NumElts;
|
||||
NewMask.push_back(Idx);
|
||||
}
|
||||
return DAG.getVectorShuffle(VT, SDLoc(N), N0, DAG.getUNDEF(VT), NewMask);
|
||||
}
|
||||
if (N0 == N1)
|
||||
return DAG.getVectorShuffle(VT, SDLoc(N), N0, DAG.getUNDEF(VT),
|
||||
createUnaryMask(SVN->getMask(), NumElts));
|
||||
|
||||
// Canonicalize shuffle undef, v -> v, undef. Commute the shuffle mask.
|
||||
if (N0.isUndef())
|
||||
|
|
|
@ -2484,16 +2484,7 @@ Instruction *InstCombinerImpl::visitShuffleVectorInst(ShuffleVectorInst &SVI) {
|
|||
if (LHS == RHS) {
|
||||
assert(!match(RHS, m_Undef()) &&
|
||||
"Shuffle with 2 undef ops not simplified?");
|
||||
// Remap any references to RHS to use LHS.
|
||||
SmallVector<int, 16> Elts;
|
||||
for (unsigned i = 0; i != VWidth; ++i) {
|
||||
// Propagate undef elements or force mask to LHS.
|
||||
if (Mask[i] < 0)
|
||||
Elts.push_back(UndefMaskElem);
|
||||
else
|
||||
Elts.push_back(Mask[i] % LHSWidth);
|
||||
}
|
||||
return new ShuffleVectorInst(LHS, Elts);
|
||||
return new ShuffleVectorInst(LHS, createUnaryMask(Mask, LHSWidth));
|
||||
}
|
||||
|
||||
// shuffle undef, x, mask --> shuffle x, undef, mask'
|
||||
|
|
Loading…
Reference in New Issue