From 6903be56d58e7f39053b6db4be42c83d7906ccce Mon Sep 17 00:00:00 2001 From: Andrey Bokhanko Date: Tue, 4 Oct 2016 12:43:46 +0000 Subject: [PATCH] Fix IntegerType::MAX_INT_BITS value IntegerType::MAX_INT_BITS is apparently not in sync with Type::SubclassData size. This patch fixes this. Differential Revision: https://reviews.llvm.org/D24814 llvm-svn: 283215 --- llvm/include/llvm/IR/DerivedTypes.h | 5 +++-- llvm/include/llvm/IR/Type.h | 2 ++ llvm/test/Assembler/invalid-inttype.ll | 5 +++++ llvm/test/Assembler/max-inttype.ll | 4 ++++ 4 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 llvm/test/Assembler/invalid-inttype.ll create mode 100644 llvm/test/Assembler/max-inttype.ll diff --git a/llvm/include/llvm/IR/DerivedTypes.h b/llvm/include/llvm/IR/DerivedTypes.h index efd0d07..a59049b 100644 --- a/llvm/include/llvm/IR/DerivedTypes.h +++ b/llvm/include/llvm/IR/DerivedTypes.h @@ -46,9 +46,10 @@ public: /// This enum is just used to hold constants we need for IntegerType. enum { MIN_INT_BITS = 1, ///< Minimum number of bits that can be specified - MAX_INT_BITS = (1<<23)-1 ///< Maximum number of bits that can be specified + MAX_INT_BITS = (1<<24)-1 ///< Maximum number of bits that can be specified ///< Note that bit width is stored in the Type classes SubclassData field - ///< which has 23 bits. This yields a maximum bit width of 8,388,607 bits. + ///< which has 24 bits. This yields a maximum bit width of 16,777,215 + ///< bits. }; /// This static method is the primary way of constructing an IntegerType. diff --git a/llvm/include/llvm/IR/Type.h b/llvm/include/llvm/IR/Type.h index 9cf03d8..52ef560 100644 --- a/llvm/include/llvm/IR/Type.h +++ b/llvm/include/llvm/IR/Type.h @@ -81,6 +81,8 @@ private: TypeID ID : 8; // The current base type of this type. unsigned SubclassData : 24; // Space for subclasses to store data. + // Note that this should be synchronized with + // MAX_INT_BITS value in IntegerType class. protected: friend class LLVMContextImpl; diff --git a/llvm/test/Assembler/invalid-inttype.ll b/llvm/test/Assembler/invalid-inttype.ll new file mode 100644 index 0000000..145153d --- /dev/null +++ b/llvm/test/Assembler/invalid-inttype.ll @@ -0,0 +1,5 @@ +; RUN: not llvm-as < %s 2>&1 | FileCheck %s + +; i16777216 is the smallest integer type that can't be represented in LLVM IR +@i2 = common global i16777216 0, align 4 +; CHECK: expected type diff --git a/llvm/test/Assembler/max-inttype.ll b/llvm/test/Assembler/max-inttype.ll new file mode 100644 index 0000000..10eed60 --- /dev/null +++ b/llvm/test/Assembler/max-inttype.ll @@ -0,0 +1,4 @@ +; RUN: llvm-as < %s | llvm-dis + +; i16777215 is the maximum integer type represented in LLVM IR +@i2 = common global i16777215 0, align 4 -- 2.7.4