[llvm] [ADT] Use a constexpr function in SmallVector (NFC) (PR #149455)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 17 22:29:42 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-adt
Author: Kazu Hirata (kazutakahirata)
<details>
<summary>Changes</summary>
SmallVector uses CalculateSmallVectorDefaultInlinedElements to compute
the default number of inlined elements. This patch converts the
struct to a constexpr function.
---
Full diff: https://github.com/llvm/llvm-project/pull/149455.diff
1 Files Affected:
- (modified) llvm/include/llvm/ADT/SmallVector.h (+9-12)
``````````diff
diff --git a/llvm/include/llvm/ADT/SmallVector.h b/llvm/include/llvm/ADT/SmallVector.h
index 80f7734b86907..9d75b31a0ac04 100644
--- a/llvm/include/llvm/ADT/SmallVector.h
+++ b/llvm/include/llvm/ADT/SmallVector.h
@@ -1122,12 +1122,10 @@ template <typename T> struct alignas(T) SmallVectorStorage<T, 0> {};
/// `sizeof(SmallVector<T, 0>)`.
template <typename T, unsigned N> class LLVM_GSL_OWNER SmallVector;
-/// Helper class for calculating the default number of inline elements for
+/// Helper function for calculating the default number of inline elements for
/// `SmallVector<T>`.
-///
-/// This should be migrated to a constexpr function when our minimum
-/// compiler support is enough for multi-statement constexpr functions.
-template <typename T> struct CalculateSmallVectorDefaultInlinedElements {
+template <typename T>
+constexpr size_t calculateSmallVectorDefaultInlinedElements() {
// Parameter controlling the default number of inlined elements
// for `SmallVector<T>`.
//
@@ -1135,7 +1133,7 @@ template <typename T> struct CalculateSmallVectorDefaultInlinedElements {
// 1. There is at least one inlined element.
// 2. `sizeof(SmallVector<T>) <= kPreferredSmallVectorSizeof` unless
// it contradicts 1.
- static constexpr size_t kPreferredSmallVectorSizeof = 64;
+ constexpr size_t kPreferredSmallVectorSizeof = 64;
// static_assert that sizeof(T) is not "too big".
//
@@ -1168,12 +1166,11 @@ template <typename T> struct CalculateSmallVectorDefaultInlinedElements {
// Discount the size of the header itself when calculating the maximum inline
// bytes.
- static constexpr size_t PreferredInlineBytes =
+ constexpr size_t PreferredInlineBytes =
kPreferredSmallVectorSizeof - sizeof(SmallVector<T, 0>);
- static constexpr size_t NumElementsThatFit = PreferredInlineBytes / sizeof(T);
- static constexpr size_t value =
- NumElementsThatFit == 0 ? 1 : NumElementsThatFit;
-};
+ constexpr size_t NumElementsThatFit = PreferredInlineBytes / sizeof(T);
+ return NumElementsThatFit == 0 ? 1 : NumElementsThatFit;
+}
/// This is a 'vector' (really, a variable-sized array), optimized
/// for the case when the array is small. It contains some number of elements
@@ -1192,7 +1189,7 @@ template <typename T> struct CalculateSmallVectorDefaultInlinedElements {
///
/// \see https://llvm.org/docs/ProgrammersManual.html#llvm-adt-smallvector-h
template <typename T,
- unsigned N = CalculateSmallVectorDefaultInlinedElements<T>::value>
+ unsigned N = calculateSmallVectorDefaultInlinedElements<T>()>
class LLVM_GSL_OWNER SmallVector : public SmallVectorImpl<T>,
SmallVectorStorage<T, N> {
public:
``````````
</details>
https://github.com/llvm/llvm-project/pull/149455
More information about the llvm-commits
mailing list