[clang] [llvm] [ABI][CIR][NFC] Let X86AVXABILevel carry its own count (PR #216339)

via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 14 08:27:56 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clangir

Author: Adam Smith (adams381)

<details>
<summary>Changes</summary>

CIR CallConvLowering keeps one classifier per AVX level, so it sizes an array by the number of levels.  It got that number as the current end of the list plus one, which stops being the count the moment a level is added after the current end.  A runtime assert was necessary to guard the index.

The enum now ends in `NumberOfEnumEntries`, so the count follows the enumerators and every level is a valid index by construction.  The assert is no longer needed as we know we have the precise count.  Adding a level fails the build at `getNativeVectorSizeForAVXABI` until it gets a native vector size, which is where that decision belongs.

Review feedback on #<!-- -->215118, deferred to a follow-up.

Assisted-by: Cursor / claude-opus-5


---
Full diff: https://github.com/llvm/llvm-project/pull/216339.diff


3 Files Affected:

- (modified) clang/lib/CIR/Dialect/Transforms/CallConvLoweringPass.cpp (+1-3) 
- (modified) llvm/include/llvm/ABI/TargetInfo.h (+1) 
- (modified) llvm/lib/ABI/Targets/X86.cpp (+2) 


``````````diff
diff --git a/clang/lib/CIR/Dialect/Transforms/CallConvLoweringPass.cpp b/clang/lib/CIR/Dialect/Transforms/CallConvLoweringPass.cpp
index abbe03bde077f..abbb3d9703b71 100644
--- a/clang/lib/CIR/Dialect/Transforms/CallConvLoweringPass.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/CallConvLoweringPass.cpp
@@ -705,7 +705,7 @@ void CallConvLoweringPass::runOnOperation() {
   // A per-function target attribute can raise the AVX level, so one classifier
   // per module would misclassify a wide vector in such a function.
   static constexpr unsigned numAvxLevels =
-      static_cast<unsigned>(llvm::abi::X86AVXABILevel::AVX512) + 1;
+      static_cast<unsigned>(llvm::abi::X86AVXABILevel::NumberOfEnumEntries);
   bool isX86 = target == cir::CallConvTarget::X86_64;
   std::optional<mlir::abi::ABITypeMapper> x86TypeMapper;
   std::array<std::unique_ptr<llvm::abi::TargetInfo>, numAvxLevels> x86Targets;
@@ -713,8 +713,6 @@ void CallConvLoweringPass::runOnOperation() {
     x86TypeMapper.emplace(dl);
   auto x86TargetFor =
       [&](llvm::abi::X86AVXABILevel level) -> const llvm::abi::TargetInfo & {
-    assert(static_cast<unsigned>(level) < numAvxLevels &&
-           "a new X86AVXABILevel needs a slot in x86Targets");
     std::unique_ptr<llvm::abi::TargetInfo> &slot =
         x86Targets[static_cast<unsigned>(level)];
     if (!slot)
diff --git a/llvm/include/llvm/ABI/TargetInfo.h b/llvm/include/llvm/ABI/TargetInfo.h
index 7d57893da0cf5..b7be8c24349bc 100644
--- a/llvm/include/llvm/ABI/TargetInfo.h
+++ b/llvm/include/llvm/ABI/TargetInfo.h
@@ -91,6 +91,7 @@ enum class X86AVXABILevel {
   None,
   AVX,
   AVX512,
+  NumberOfEnumEntries // must be last
 };
 
 LLVM_ABI std::unique_ptr<TargetInfo>
diff --git a/llvm/lib/ABI/Targets/X86.cpp b/llvm/lib/ABI/Targets/X86.cpp
index 83c13f0071f23..f372bcd511009 100644
--- a/llvm/lib/ABI/Targets/X86.cpp
+++ b/llvm/lib/ABI/Targets/X86.cpp
@@ -29,6 +29,8 @@ static unsigned getNativeVectorSizeForAVXABI(X86AVXABILevel AVXLevel) {
     return 256;
   case X86AVXABILevel::None:
     return 128;
+  case X86AVXABILevel::NumberOfEnumEntries:
+    break;
   }
   llvm_unreachable("Unknown AVXLevel");
 }

``````````

</details>


https://github.com/llvm/llvm-project/pull/216339


More information about the llvm-commits mailing list