[llvm] [SLP]Model reduction_add(ext(<n x i1>)) as ext(ctpop(bitcast <n x i1> to int n)) (PR #116875)
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 21 05:43:22 PST 2024
================
@@ -17885,24 +17897,37 @@ void BoUpSLP::computeMinimumValueSizes() {
// Add reduction ops sizes, if any.
if (UserIgnoreList &&
isa<IntegerType>(VectorizableTree.front()->Scalars.front()->getType())) {
- for (Value *V : *UserIgnoreList) {
- auto NumSignBits = ComputeNumSignBits(V, *DL, 0, AC, nullptr, DT);
- auto NumTypeBits = DL->getTypeSizeInBits(V->getType());
- unsigned BitWidth1 = NumTypeBits - NumSignBits;
- if (!isKnownNonNegative(V, SimplifyQuery(*DL)))
- ++BitWidth1;
- unsigned BitWidth2 = BitWidth1;
- if (!RecurrenceDescriptor::isIntMinMaxRecurrenceKind(::getRdxKind(V))) {
- auto Mask = DB->getDemandedBits(cast<Instruction>(V));
- BitWidth2 = Mask.getBitWidth() - Mask.countl_zero();
+ // Convert vector_reduce_add(ZExt(<n x i1>)) to ZExtOrTrunc(ctpop(bitcast <n
+ // x i1> to in)).
+ if (all_of(*UserIgnoreList,
+ [](Value *V) {
+ return cast<Instruction>(V)->getOpcode() == Instruction::Add;
+ }) &&
+ VectorizableTree.front()->State == TreeEntry::Vectorize &&
+ VectorizableTree.front()->getOpcode() == Instruction::ZExt &&
+ cast<CastInst>(VectorizableTree.front()->getMainOp())->getSrcTy() ==
+ Builder.getInt1Ty()) {
+ ReductionBitWidth = 1;
+ } else {
+ for (Value *V : *UserIgnoreList) {
+ auto NumSignBits = ComputeNumSignBits(V, *DL, 0, AC, nullptr, DT);
+ auto NumTypeBits = DL->getTypeSizeInBits(V->getType());
----------------
RKSimon wrote:
(style) avoid auto
https://github.com/llvm/llvm-project/pull/116875
More information about the llvm-commits
mailing list