[llvm] 95e76c1 - Revert "[IR] Remove options to make scalable TypeSize access a warning (#156336)"

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 2 00:53:14 PDT 2025


Author: Nikita Popov
Date: 2025-09-02T09:52:37+02:00
New Revision: 95e76c14daff1adf5d9a4087d043da4d2a429573

URL: https://github.com/llvm/llvm-project/commit/95e76c14daff1adf5d9a4087d043da4d2a429573
DIFF: https://github.com/llvm/llvm-project/commit/95e76c14daff1adf5d9a4087d043da4d2a429573.diff

LOG: Revert "[IR] Remove options to make scalable TypeSize access a warning (#156336)"

This reverts commit 8f59a946740bf8dbe2574b33eaa431fde3ce9204.

Failed on clang-aarch64-sve-vls-2stage, which still uses the option.

Added: 
    

Modified: 
    llvm/CMakeLists.txt
    llvm/cmake/modules/HandleLLVMOptions.cmake
    llvm/include/llvm/CodeGen/ValueTypes.h
    llvm/include/llvm/CodeGenTypes/LowLevelType.h
    llvm/include/llvm/CodeGenTypes/MachineValueType.h
    llvm/include/llvm/Support/TypeSize.h
    llvm/lib/Support/CommandLine.cpp
    llvm/lib/Support/DebugOptions.h
    llvm/lib/Support/TypeSize.cpp
    llvm/test/CodeGen/AArch64/sms-order-physreg-deps.mir
    llvm/test/CodeGen/AArch64/sve-unaligned-load-store-strict-align.ll
    llvm/test/CodeGen/AMDGPU/llvm.amdgcn.raw.ptr.buffer.store.nxv2i32.fail.ll

Removed: 
    


################################################################################
diff  --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt
index 3eb695665130d..a90be4f6235e6 100644
--- a/llvm/CMakeLists.txt
+++ b/llvm/CMakeLists.txt
@@ -706,6 +706,18 @@ endif()
 
 option(LLVM_ENABLE_EXPENSIVE_CHECKS "Enable expensive checks" OFF)
 
+# While adding scalable vector support to LLVM, we temporarily want to
+# allow an implicit conversion of TypeSize to uint64_t, and to allow
+# code to get the fixed number of elements from a possibly scalable vector.
+# This CMake flag enables a more strict mode where it asserts that the type
+# is not a scalable vector type.
+#
+# Enabling this flag makes it easier to find cases where the compiler makes
+# assumptions on the size being 'fixed size', when building tests for
+# SVE/SVE2 or other scalable vector architectures.
+option(LLVM_ENABLE_STRICT_FIXED_SIZE_VECTORS
+       "Enable assertions that type is not scalable in implicit conversion from TypeSize to uint64_t and calls to getNumElements" OFF)
+
 set(LLVM_ABI_BREAKING_CHECKS "WITH_ASSERTS" CACHE STRING
   "Enable abi-breaking checks.  Can be WITH_ASSERTS, FORCE_ON or FORCE_OFF.")
 

diff  --git a/llvm/cmake/modules/HandleLLVMOptions.cmake b/llvm/cmake/modules/HandleLLVMOptions.cmake
index a67543cdb668f..97aa1317bc218 100644
--- a/llvm/cmake/modules/HandleLLVMOptions.cmake
+++ b/llvm/cmake/modules/HandleLLVMOptions.cmake
@@ -201,6 +201,10 @@ if (LLVM_USES_LIBSTDCXX)
   endif()
 endif()
 
+if (LLVM_ENABLE_STRICT_FIXED_SIZE_VECTORS)
+  add_compile_definitions(STRICT_FIXED_SIZE_VECTORS)
+endif()
+
 string(TOUPPER "${LLVM_ABI_BREAKING_CHECKS}" uppercase_LLVM_ABI_BREAKING_CHECKS)
 
 if( uppercase_LLVM_ABI_BREAKING_CHECKS STREQUAL "WITH_ASSERTS" )

diff  --git a/llvm/include/llvm/CodeGen/ValueTypes.h b/llvm/include/llvm/CodeGen/ValueTypes.h
index 43aaa2bcfc222..2a91cdc3ab134 100644
--- a/llvm/include/llvm/CodeGen/ValueTypes.h
+++ b/llvm/include/llvm/CodeGen/ValueTypes.h
@@ -332,7 +332,7 @@ namespace llvm {
       assert(isVector() && "Invalid vector type!");
 
       if (isScalableVector())
-        llvm::reportFatalInternalError(
+        llvm::reportInvalidSizeRequest(
             "Possible incorrect use of EVT::getVectorNumElements() for "
             "scalable vector. Scalable flag may be dropped, use "
             "EVT::getVectorElementCount() instead");

diff  --git a/llvm/include/llvm/CodeGenTypes/LowLevelType.h b/llvm/include/llvm/CodeGenTypes/LowLevelType.h
index 4c1fe13790011..d8e0848aff84d 100644
--- a/llvm/include/llvm/CodeGenTypes/LowLevelType.h
+++ b/llvm/include/llvm/CodeGenTypes/LowLevelType.h
@@ -159,7 +159,7 @@ class LLT {
   /// vector types.
   constexpr uint16_t getNumElements() const {
     if (isScalable())
-      llvm::reportFatalInternalError(
+      llvm::reportInvalidSizeRequest(
           "Possible incorrect use of LLT::getNumElements() for "
           "scalable vector. Scalable flag may be dropped, use "
           "LLT::getElementCount() instead");

diff  --git a/llvm/include/llvm/CodeGenTypes/MachineValueType.h b/llvm/include/llvm/CodeGenTypes/MachineValueType.h
index 389bae209f406..b8e91a022ec5e 100644
--- a/llvm/include/llvm/CodeGenTypes/MachineValueType.h
+++ b/llvm/include/llvm/CodeGenTypes/MachineValueType.h
@@ -294,7 +294,7 @@ namespace llvm {
 
     unsigned getVectorNumElements() const {
       if (isScalableVector())
-        llvm::reportFatalInternalError(
+        llvm::reportInvalidSizeRequest(
             "Possible incorrect use of MVT::getVectorNumElements() for "
             "scalable vector. Scalable flag may be dropped, use "
             "MVT::getVectorElementCount() instead");

diff  --git a/llvm/include/llvm/Support/TypeSize.h b/llvm/include/llvm/Support/TypeSize.h
index b6926e6fdeeb6..96425291aaedb 100644
--- a/llvm/include/llvm/Support/TypeSize.h
+++ b/llvm/include/llvm/Support/TypeSize.h
@@ -26,6 +26,10 @@
 
 namespace llvm {
 
+/// Reports a diagnostic message to indicate an invalid size request has been
+/// done on a scalable vector. This function may not return.
+LLVM_ABI void reportInvalidSizeRequest(const char *Msg);
+
 /// StackOffset holds a fixed and a scalable offset in bytes.
 class StackOffset {
   int64_t Fixed = 0;

diff  --git a/llvm/lib/Support/CommandLine.cpp b/llvm/lib/Support/CommandLine.cpp
index be232f5bff587..8491633df97e8 100644
--- a/llvm/lib/Support/CommandLine.cpp
+++ b/llvm/lib/Support/CommandLine.cpp
@@ -2671,6 +2671,7 @@ static void initCommonOptions() {
   initSignalsOptions();
   initStatisticOptions();
   initTimerOptions();
+  initTypeSizeOptions();
   initWithColorOptions();
   initDebugOptions();
   initRandomSeedOptions();

diff  --git a/llvm/lib/Support/DebugOptions.h b/llvm/lib/Support/DebugOptions.h
index 6c3382e8f858d..db727d5a584cb 100644
--- a/llvm/lib/Support/DebugOptions.h
+++ b/llvm/lib/Support/DebugOptions.h
@@ -24,6 +24,7 @@ void initGraphWriterOptions();
 void initSignalsOptions();
 void initStatisticOptions();
 void initTimerOptions();
+void initTypeSizeOptions();
 void initWithColorOptions();
 void initDebugOptions();
 void initRandomSeedOptions();

diff  --git a/llvm/lib/Support/TypeSize.cpp b/llvm/lib/Support/TypeSize.cpp
index 3dbb00880faca..43346b81cd676 100644
--- a/llvm/lib/Support/TypeSize.cpp
+++ b/llvm/lib/Support/TypeSize.cpp
@@ -7,13 +7,49 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/Support/TypeSize.h"
-#include "llvm/Support/Error.h"
+#include "llvm/Support/CommandLine.h"
+#include "llvm/Support/ManagedStatic.h"
+#include "llvm/Support/WithColor.h"
+
+#include "DebugOptions.h"
 
 using namespace llvm;
 
+#ifndef STRICT_FIXED_SIZE_VECTORS
+namespace {
+struct CreateScalableErrorAsWarning {
+  /// The ScalableErrorAsWarning is a temporary measure to suppress errors from
+  /// using the wrong interface on a scalable vector.
+  static void *call() {
+    return new cl::opt<bool>(
+        "treat-scalable-fixed-error-as-warning", cl::Hidden,
+        cl::desc(
+            "Treat issues where a fixed-width property is requested from a "
+            "scalable type as a warning, instead of an error"));
+  }
+};
+} // namespace
+static ManagedStatic<cl::opt<bool>, CreateScalableErrorAsWarning>
+    ScalableErrorAsWarning;
+void llvm::initTypeSizeOptions() { *ScalableErrorAsWarning; }
+#else
+void llvm::initTypeSizeOptions() {}
+#endif
+
+void llvm::reportInvalidSizeRequest(const char *Msg) {
+#ifndef STRICT_FIXED_SIZE_VECTORS
+  if (*ScalableErrorAsWarning) {
+    WithColor::warning() << "Invalid size request on a scalable vector; " << Msg
+                         << "\n";
+    return;
+  }
+#endif
+  report_fatal_error("Invalid size request on a scalable vector.");
+}
+
 TypeSize::operator TypeSize::ScalarTy() const {
   if (isScalable()) {
-    reportFatalInternalError(
+    reportInvalidSizeRequest(
         "Cannot implicitly convert a scalable size to a fixed-width size in "
         "`TypeSize::operator ScalarTy()`");
     return getKnownMinValue();

diff  --git a/llvm/test/CodeGen/AArch64/sms-order-physreg-deps.mir b/llvm/test/CodeGen/AArch64/sms-order-physreg-deps.mir
index 61e3c73a3ee53..4d8067e16b964 100644
--- a/llvm/test/CodeGen/AArch64/sms-order-physreg-deps.mir
+++ b/llvm/test/CodeGen/AArch64/sms-order-physreg-deps.mir
@@ -1,4 +1,4 @@
-# RUN: llc --verify-machineinstrs -mtriple=aarch64 -o - %s -mcpu=a64fx -aarch64-enable-pipeliner -pipeliner-max-mii=100 -pipeliner-enable-copytophi=0 -debug-only=pipeliner -run-pass=pipeliner 2>&1 | FileCheck %s
+# RUN: llc --verify-machineinstrs -mtriple=aarch64 -o - %s -mcpu=a64fx -aarch64-enable-pipeliner -pipeliner-max-mii=100 -pipeliner-enable-copytophi=0 -debug-only=pipeliner -run-pass=pipeliner -treat-scalable-fixed-error-as-warning 2>&1 | FileCheck %s
 
 # REQUIRES: asserts
 

diff  --git a/llvm/test/CodeGen/AArch64/sve-unaligned-load-store-strict-align.ll b/llvm/test/CodeGen/AArch64/sve-unaligned-load-store-strict-align.ll
index 78325a1bcded1..981ccdbf589a4 100644
--- a/llvm/test/CodeGen/AArch64/sve-unaligned-load-store-strict-align.ll
+++ b/llvm/test/CodeGen/AArch64/sve-unaligned-load-store-strict-align.ll
@@ -5,7 +5,7 @@
 ; REQUIRES: asserts
 
 ; FIXME: Support TLI.expandUnalignedLoad()/TLI.expandUnalignedStore() for SVE.
-; CHECK-FIXME: LLVM ERROR: Cannot implicitly convert a scalable size to a fixed-width size in `TypeSize::operator ScalarTy()
+; CHECK-FIXME: LLVM ERROR: Invalid size request on a scalable vector.
 
 define void @unaligned_nxv16i1(ptr %ldptr, ptr %stptr) {
 ; CHECK-LABEL: unaligned_nxv16i1:

diff  --git a/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.raw.ptr.buffer.store.nxv2i32.fail.ll b/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.raw.ptr.buffer.store.nxv2i32.fail.ll
index 23ea84c15e06c..a91d38a58a1e9 100644
--- a/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.raw.ptr.buffer.store.nxv2i32.fail.ll
+++ b/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.raw.ptr.buffer.store.nxv2i32.fail.ll
@@ -3,7 +3,7 @@
 ; RUN: not --crash llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx900  -filetype=null < %s 2>&1 | FileCheck %s --check-prefix=SDAG
 ; SDAG: LLVM ERROR: Scalarization of scalable vectors is not supported.
 ; RUN: not --crash llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx900  -filetype=null < %s 2>&1 | FileCheck %s --check-prefix=GISEL
-; GISEL: LLVM ERROR: Cannot implicitly convert a scalable size to a fixed-width size in `TypeSize::operator ScalarTy()`
+; GISEL: LLVM ERROR: Invalid size request on a scalable vector.
 
 define void @buffer_store_nxv2i32(ptr addrspace(8) inreg %rsrc, i32 %offset) {
   call void @llvm.amdgcn.raw.ptr.buffer.store.nxv2i32(<vscale x 2 x i32> poison, ptr addrspace(8) %rsrc, i32 %offset, i32 0, i32 0)


        


More information about the llvm-commits mailing list