[llvm] [VPlan] Support struct return types for widen intrinsics (NFC). (PR #165218)

Benjamin Maxwell via llvm-commits llvm-commits at lists.llvm.org
Thu Nov 6 06:33:26 PST 2025


================
@@ -8,23 +8,35 @@
 
 #include "llvm/IR/VectorTypeUtils.h"
 #include "llvm/ADT/SmallVectorExtras.h"
+#include "llvm/Analysis/VectorUtils.h"
 
 using namespace llvm;
 
 /// A helper for converting structs of scalar types to structs of vector types.
 /// Note: Only unpacked literal struct types are supported.
-Type *llvm::toVectorizedStructTy(StructType *StructTy, ElementCount EC) {
+Type *llvm::toVectorizedStructTy(StructType *StructTy, ElementCount EC,
+                                 unsigned IID) {
   if (EC.isScalar())
     return StructTy;
   assert(isUnpackedStructLiteral(StructTy) &&
          "expected unpacked struct literal");
   assert(all_of(StructTy->elements(), VectorType::isValidElementType) &&
          "expected all element types to be valid vector element types");
-  return StructType::get(
-      StructTy->getContext(),
-      map_to_vector(StructTy->elements(), [&](Type *ElTy) -> Type * {
-        return VectorType::get(ElTy, EC);
-      }));
+  if (IID != 0) {
+    SmallVector<Type *, 2> Tys;
+    for (unsigned I = 0, E = StructTy->getNumElements(); I != E; ++I) {
+      Type *ElTy = StructTy->getStructElementType(I);
+      if (!isVectorIntrinsicWithStructReturnScalarAtField(IID, I))
+        ElTy = toVectorizedTy(ElTy, EC);
+      Tys.push_back(ElTy);
+    }
+    return StructType::create(Tys);
+  } else
+    return StructType::get(
+        StructTy->getContext(),
+        map_to_vector(StructTy->elements(), [&](Type *ElTy) -> Type * {
+          return VectorType::get(ElTy, EC);
+        }));
----------------
MacDue wrote:

Can we simplify this to?
```suggestion
  return StructType::get(
      StructTy->getContext(),
      map_to_vector(enumerate(StructTy->elements()), [&](auto It) -> Type * {
        Type *ElTy = It.value();
        if (IID != 0 &&
            isVectorIntrinsicWithStructReturnScalarAtField(IID, It.index()))
          return ElTy;
        return VectorType::get(ElTy, EC);
      }));
```

https://github.com/llvm/llvm-project/pull/165218


More information about the llvm-commits mailing list