[llvm] [IA][RISCV] Add support for vp.load/vp.store with shufflevector (PR #135445)
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 30 15:06:55 PDT 2025
================
@@ -644,13 +740,25 @@ static Value *getMask(Value *WideMask, unsigned Factor) {
}
}
- if (match(WideMask, m_AllOnes())) {
- // Scale the vector length of all-ones mask.
- ElementCount OrigEC =
- cast<VectorType>(WideMask->getType())->getElementCount();
- assert(OrigEC.getKnownMinValue() % Factor == 0);
- return ConstantVector::getSplat(OrigEC.divideCoefficientBy(Factor),
- cast<Constant>(WideMask)->getSplatValue());
+ if (auto *ConstMask = dyn_cast<Constant>(WideMask)) {
+ if (auto *Splat = ConstMask->getSplatValue()) {
+ // All-ones or all-zeros mask.
+ return ConstantVector::getSplat(LeafValueEC, Splat);
+ } else if (LeafValueEC.isFixed()) {
+ unsigned LeafMaskLen = LeafValueEC.getFixedValue();
+ SmallVector<Constant *, 8> LeafMask(LeafMaskLen, nullptr);
+ // If this is a fixed-length constant mask, each lane / leaf has to
+ // use the same mask. This is done by checking if every group with Factor
+ // number of elements in the interleaved mask has homogeneous values.
+ for (unsigned Idx = 0U; Idx < LeafMaskLen * Factor; ++Idx) {
+ Constant *Ref = ConstMask->getAggregateElement(alignDown(Idx, Factor));
----------------
topperc wrote:
You could avoid the `alignDown` by using `LeafMask`. Something like.
```
Constant *C = ConstMask->getAggregateElement(Idx);
if (LeafMask[Idx / Factor] && LeafMask[Idx / Factor] != C)
return nullptr;
LeafMask[Idx / Factor] = C;
```
https://github.com/llvm/llvm-project/pull/135445
More information about the llvm-commits
mailing list