[llvm] [VectorCombine] foldShuffleOfShuffles - fold "shuffle (shuffle x, undef), (shuffle y, undef)" -> "shuffle x, y" (PR #88743)
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 16 08:29:29 PDT 2024
================
@@ -1547,6 +1548,78 @@ bool VectorCombine::foldShuffleOfCastops(Instruction &I) {
return true;
}
+/// Try to convert "shuffle (shuffle x, undef), (shuffle y, undef)"
+/// into "shuffle x, y".
+bool VectorCombine::foldShuffleOfShuffles(Instruction &I) {
+ Value *V0, *V1;
+ ArrayRef<int> OuterMask, InnerMask0, InnerMask1;
+ if (!match(&I, m_Shuffle(m_OneUse(m_Shuffle(m_Value(V0), m_Undef(),
+ m_Mask(InnerMask0))),
+ m_OneUse(m_Shuffle(m_Value(V1), m_Undef(),
+ m_Mask(InnerMask1))),
+ m_Mask(OuterMask))))
+ return false;
+
+ auto *ShuffleDstTy = dyn_cast<FixedVectorType>(I.getType());
+ auto *ShuffleSrcTy = dyn_cast<FixedVectorType>(V0->getType());
+ auto *ShuffleImmTy = dyn_cast<FixedVectorType>(I.getOperand(0)->getType());
+ if (!ShuffleDstTy || !ShuffleSrcTy || !ShuffleImmTy ||
+ V0->getType() != V1->getType())
+ return false;
+
+ unsigned NumSrcElts = ShuffleSrcTy->getNumElements();
+ unsigned NumImmElts = ShuffleImmTy->getNumElements();
+
+ // Bail if either inner masks reference the RHS undef/poison arg.
+ if (any_of(InnerMask0, [&](int M) { return M >= (int)NumSrcElts; }) ||
+ any_of(InnerMask1, [&](int M) { return M >= (int)NumSrcElts; }))
+ return false;
----------------
RKSimon wrote:
The problem isn't whether its undef/poison - its that we'd be creating a bad mask index below in NewMask (especially for InnerMask1 which would be out of bounds).
https://github.com/llvm/llvm-project/pull/88743
More information about the llvm-commits
mailing list