[llvm] [VectorCombine] foldShuffleChainsToReduce - add support for partial vector reductions (PR #195119)

via llvm-commits llvm-commits at lists.llvm.org
Fri May 8 13:04:06 PDT 2026


================
@@ -4147,14 +4156,33 @@ bool VectorCombine::foldShuffleChainsToReduce(Instruction &I) {
   if (!ReducedOp)
     return false;
 
-  IntrinsicCostAttributes ICA(ReducedOp, FinalVecVTy, {FinalVecV});
-  InstructionCost NewCost = TTI.getIntrinsicInstrCost(ICA, CostKind);
+  InstructionCost NewCost = 0;
+  FixedVectorType *ReduceVecTy = FinalVecVTy;
+  SmallVector<int> ExtractMask;
+
+  if (IsPartialReduction) {
+    unsigned SubVecSize = ShuffleMaskHalf;
+    ReduceVecTy = FixedVectorType::get(FVT->getElementType(), SubVecSize);
+    ExtractMask.resize(SubVecSize);
+    std::iota(ExtractMask.begin(), ExtractMask.end(), 0);
+    NewCost +=
+        TTI.getShuffleCost(TargetTransformInfo::SK_ExtractSubvector,
+                           ReduceVecTy, FinalVecVTy, ExtractMask, CostKind, 0);
+  }
+
+  IntrinsicCostAttributes ICA(ReducedOp, ReduceVecTy, {ReduceVecTy});
+  NewCost += TTI.getIntrinsicInstrCost(ICA, CostKind);
 
   if (NewCost >= OrigCost)
     return false;
 
-  auto *ReducedResult =
-      Builder.CreateIntrinsic(ReducedOp, {FinalVecV->getType()}, {FinalVecV});
+  Value *ReduceInput = FinalVecV;
+  if (IsPartialReduction) {
+    ReduceInput = Builder.CreateShuffleVector(FinalVecV, ExtractMask);
+  }
----------------
AbdallahRashed wrote:

done @RKSimon 

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


More information about the llvm-commits mailing list