[llvm] [SLP] Vectorize struct-returning intrinsics (PR #195521)
Ryan Buchner via llvm-commits
llvm-commits at lists.llvm.org
Tue May 5 14:50:44 PDT 2026
================
@@ -328,23 +330,41 @@ static Type *getValueType(Value *V, bool LookThroughCmp = false) {
static unsigned getNumElements(Type *Ty) {
assert(!isa<ScalableVectorType>(Ty) &&
"ScalableVectorType is not supported.");
- if (auto *VecTy = dyn_cast<FixedVectorType>(Ty))
- return VecTy->getNumElements();
+ if (isVectorizedTy(Ty))
+ return getVectorizedTypeVF(Ty).getFixedValue();
return 1;
}
/// \returns the vector type of ScalarTy based on vectorization factor.
-static FixedVectorType *getWidenedType(Type *ScalarTy, unsigned VF) {
- return FixedVectorType::get(ScalarTy->getScalarType(),
- VF * getNumElements(ScalarTy));
+static Type *getWidenedType(Type *ScalarTy, unsigned VF) {
+ if (VF == 1 && !isVectorizedTy(ScalarTy)) {
+ // Workaround for 1 x vector types: toVectorizedTy returns the type
+ // unchanged when EC is scalar, but BoUpSLP relies on widening to
+ // <1 x ScalarTy> (or struct of <1 x ElTy>) to keep the rest of the
+ // pipeline operating on vector types.
+ if (auto *StructTy = dyn_cast<StructType>(ScalarTy)) {
+ assert(isUnpackedStructLiteral(StructTy) &&
+ "expected unpacked struct literal");
+ assert(all_of(StructTy->elements(), VectorType::isValidElementType) &&
+ "expected all element types to be valid vector element types");
----------------
bababuck wrote:
I had expected this code to fail in the `slp-revec` case, but it appears the failure is elsewhere.
https://github.com/llvm/llvm-project/pull/195521
More information about the llvm-commits
mailing list