[llvm] [VPlan] Unroll VPReplicateRecipe by VF. (PR #142433)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Jun 22 04:26:49 PDT 2025
================
@@ -608,6 +608,32 @@ Value *VPInstruction::generate(VPTransformState &State) {
return Builder.CreateVectorSplat(
State.VF, State.get(getOperand(0), /*IsScalar*/ true), "broadcast");
}
+ case VPInstruction::BuildStructVector: {
+ // For struct types, we need to build a new 'wide' struct type, where each
+ // element is widened, i.e. we crate a struct of vectors .
+ auto *StructTy =
+ cast<StructType>(State.TypeAnalysis.inferScalarType(getOperand(0)));
+ Value *Res = PoisonValue::get(toVectorizedTy(StructTy, State.VF));
+ for (const auto &[Idx, Op] : enumerate(operands())) {
+ for (unsigned I = 0; I != StructTy->getNumElements(); I++) {
+ Value *ScalarValue = Builder.CreateExtractValue(State.get(Op, true), I);
+ Value *VectorValue = Builder.CreateExtractValue(Res, I);
+ VectorValue =
+ Builder.CreateInsertElement(VectorValue, ScalarValue, Idx);
+ Res = Builder.CreateInsertValue(Res, VectorValue, I);
+ }
+ }
----------------
ayalz wrote:
Would be good to clarify that `Idx` represents an enumeration of vector elements while `I` represents an enumeration of struct fields. Admittedly `StructTy->getNumElements()` may also cause confusion. How about `LaneIndex` and `FieldIndex`?
https://github.com/llvm/llvm-project/pull/142433
More information about the llvm-commits
mailing list