[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