[llvm] [SLP]Prefer copyable over alternate (PR #183777)
Ryan Buchner via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 2 16:51:06 PST 2026
================
@@ -11520,26 +11532,230 @@ class InstructionsCompatibilityAnalysis {
llvm_unreachable("Unexpected vectorization of the instructions.");
}
+ /// Check if the specified \p VL list of values is better to represent as
+ /// uniform with copyables, as modeled via \p CopyableS, or as alternate (or
+ /// uniform with compatible ops), modeled via \p S.
+ /// Performs the analysis of the operands, choosing the preferred main
+ /// instruction and checking the matching of the operands for the main
+ /// instruction and copyable elements.
+ bool isCopyablePreferable(ArrayRef<Value *> VL, const BoUpSLP &R,
+ const InstructionsState &S,
+ const InstructionsState &CopyableS) {
+ // If all elements are vectorized already - keep as is.
+ if (all_of(VL, [&](Value *V) {
+ return isa<PoisonValue>(V) || R.isVectorized(V);
+ }))
+ return false;
+ Instruction *SMain = S.getMainOp();
+ Instruction *SAlt = S.isAltShuffle() ? S.getAltOp() : nullptr;
+ const bool IsCommutative = ::isCommutative(SMain);
+ const bool IsAltCommutative =
+ S.isAltShuffle() ? ::isCommutative(SAlt) : false;
+ const bool IsMainCommutative = ::isCommutative(MainOp);
+ SmallVector<BoUpSLP::ValueList> Ops;
+ buildOriginalOperands(S, SMain, Ops);
+ // Support only binary operations for now.
+ if (Ops.size() != 2)
+ return false;
+ // Try to find better candidate for S main instruction, which operands have
+ // better matching.
+ auto CheckOperands = [](Value *Op, Value *SMainOp) {
+ auto *OpI = dyn_cast<BinaryOperator>(Op);
+ if (!OpI)
+ return false;
+ auto *SMainOpI = dyn_cast<BinaryOperator>(SMainOp);
+ if (!SMainOpI)
+ return true;
+ return any_of(OpI->operands(), [&](Value *V) {
+ auto *I = dyn_cast<Instruction>(V);
+ return I && I->getOpcode() == SMainOpI->getOpcode();
+ });
+ };
+ SmallPtrSet<Value *, 8> Operands;
+ for (Value *V : VL) {
+ auto *I = dyn_cast<Instruction>(V);
+ if (!I || I == SMain)
+ continue;
+ Instruction *MatchingOp = S.getMatchingMainOpOrAltOp(I);
+ if (MatchingOp != SMain)
+ continue;
+ SmallVector<BoUpSLP::ValueList> VOps;
+ buildOriginalOperands(S, I, VOps);
+ Operands.insert(I->op_begin(), I->op_end());
----------------
bababuck wrote:
For `Operands`, why do we only insert a few of the elements here (won't add all possible due to early exit)? Also, for consistency with other uses of `Operands`, should this be gated with `S.isAltShuffle()`?
https://github.com/llvm/llvm-project/pull/183777
More information about the llvm-commits
mailing list