[llvm] [LV] Fix '-1U' bits for smallest type in getSmallestAndWidestTypes (PR #135783)
Sander de Smalen via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 15 05:19:29 PDT 2025
https://github.com/sdesmalen-arm created https://github.com/llvm/llvm-project/pull/135783
For loops without loads/stores, where the smallest/widest types are calculated from the reduction, the smallest type returned is always -1U and it actually returns the smallest type as the widest type. This PR fixes the calculation.
This follows from https://github.com/llvm/llvm-project/pull/132190#discussion_r2044232607
>From 3b622ddd5216de7c1ce88c352baf82c9d0fd478b Mon Sep 17 00:00:00 2001
From: Sander de Smalen <sander.desmalen at arm.com>
Date: Tue, 15 Apr 2025 11:13:43 +0000
Subject: [PATCH] [LV] Fix '-1U' bits for smallest type in
getSmallestAndWidestTypes
For loops without loads/stores, where the smallest/widest types are calculated
from the reduction, the smallest type returned is always -1U and it actually
returns the smallest type as the widest type. This PR fixes the calculation.
---
llvm/lib/Transforms/Vectorize/LoopVectorize.cpp | 9 ++++-----
.../LoopVectorize/AArch64/smallest-and-widest-types.ll | 6 +++---
2 files changed, 7 insertions(+), 8 deletions(-)
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index af94dc01c8c5c..c21b6c4c88929 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -4798,17 +4798,16 @@ LoopVectorizationCostModel::getSmallestAndWidestTypes() {
// if there are no loads/stores in the loop. In this case, check through the
// reduction variables to determine the maximum width.
if (ElementTypesInLoop.empty() && !Legal->getReductionVars().empty()) {
- // Reset MaxWidth so that we can find the smallest type used by recurrences
- // in the loop.
- MaxWidth = -1U;
for (const auto &PhiDescriptorPair : Legal->getReductionVars()) {
const RecurrenceDescriptor &RdxDesc = PhiDescriptorPair.second;
// When finding the min width used by the recurrence we need to account
// for casts on the input operands of the recurrence.
- MaxWidth = std::min<unsigned>(
- MaxWidth, std::min<unsigned>(
+ MinWidth = std::min<unsigned>(
+ MinWidth, std::min<unsigned>(
RdxDesc.getMinWidthCastToRecurrenceTypeInBits(),
RdxDesc.getRecurrenceType()->getScalarSizeInBits()));
+ MaxWidth = std::max<unsigned>(
+ MaxWidth, RdxDesc.getRecurrenceType()->getScalarSizeInBits());
}
} else {
for (Type *T : ElementTypesInLoop) {
diff --git a/llvm/test/Transforms/LoopVectorize/AArch64/smallest-and-widest-types.ll b/llvm/test/Transforms/LoopVectorize/AArch64/smallest-and-widest-types.ll
index 269562fa70549..b34ba5e38811a 100644
--- a/llvm/test/Transforms/LoopVectorize/AArch64/smallest-and-widest-types.ll
+++ b/llvm/test/Transforms/LoopVectorize/AArch64/smallest-and-widest-types.ll
@@ -37,7 +37,7 @@ for.end:
; chosen. The following 3 cases check different combinations of widths.
; CHECK-LABEL: Checking a loop in 'no_loads_stores_32'
-; CHECK: The Smallest and Widest types: 4294967295 / 32 bits
+; CHECK: The Smallest and Widest types: 32 / 64 bits
; CHECK: Selecting VF: 4
define double @no_loads_stores_32(i32 %n) {
@@ -60,7 +60,7 @@ for.end:
}
; CHECK-LABEL: Checking a loop in 'no_loads_stores_16'
-; CHECK: The Smallest and Widest types: 4294967295 / 16 bits
+; CHECK: The Smallest and Widest types: 16 / 64 bits
; CHECK: Selecting VF: 8
define double @no_loads_stores_16() {
@@ -82,7 +82,7 @@ for.end:
}
; CHECK-LABEL: Checking a loop in 'no_loads_stores_8'
-; CHECK: The Smallest and Widest types: 4294967295 / 8 bits
+; CHECK: The Smallest and Widest types: 8 / 32 bits
; CHECK: Selecting VF: 16
define float @no_loads_stores_8() {
More information about the llvm-commits
mailing list