[llvm] [VectorCombine] foldPermuteOfBinops - support multi-use binary ops and operands in shuffle folding (PR #173153)
Miloš Poletanović via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 22 07:04:26 PST 2025
================
@@ -2340,22 +2336,35 @@ bool VectorCombine::foldPermuteOfBinops(Instruction &I) {
all_of(NewMask1, [NumOpElts](int M) { return M < (int)NumOpElts; }) &&
ShuffleVectorInst::isIdentityMask(NewMask1, NumOpElts);
+ InstructionCost NewCost = 0;
// Try to merge shuffles across the binop if the new shuffles are not costly.
+ InstructionCost BinOpCost =
+ TTI.getArithmeticInstrCost(Opcode, BinOpTy, CostKind);
InstructionCost OldCost =
- TTI.getArithmeticInstrCost(Opcode, BinOpTy, CostKind) +
- TTI.getShuffleCost(TargetTransformInfo::SK_PermuteSingleSrc, ShuffleDstTy,
- BinOpTy, OuterMask, CostKind, 0, nullptr, {BinOp}, &I);
- if (Match0)
- OldCost += TTI.getShuffleCost(
+ BinOpCost + TTI.getShuffleCost(TargetTransformInfo::SK_PermuteSingleSrc,
+ ShuffleDstTy, BinOpTy, OuterMask, CostKind,
+ 0, nullptr, {BinOp}, &I);
+ if (!BinOp->hasOneUse())
+ NewCost += BinOpCost;
+
+ if (Match0) {
+ InstructionCost Shuf0Cost = TTI.getShuffleCost(
TargetTransformInfo::SK_PermuteTwoSrc, BinOpTy, Op0Ty, Mask0, CostKind,
0, nullptr, {Op00, Op01}, cast<Instruction>(BinOp->getOperand(0)));
- if (Match1)
- OldCost += TTI.getShuffleCost(
- TargetTransformInfo::SK_PermuteTwoSrc, BinOpTy, Op1Ty, Mask1, CostKind,
+ OldCost += Shuf0Cost;
+ if (!BinOp->getOperand(0)->hasOneUse())
----------------
milos1397 wrote:
Correct, I missed that part.
https://github.com/llvm/llvm-project/pull/173153
More information about the llvm-commits
mailing list