[clang] [Clang][AArch64] Fixed incorrect _BitInt alignment (PR #90602)
https://github.com/Lukacma closed https://github.com/llvm/llvm-project/pull/90602 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][AArch64] Fixed incorrect _BitInt alignment (PR #90602)
https://github.com/Lukacma updated https://github.com/llvm/llvm-project/pull/90602 >From dfb8a9de874f233c9d3964569f3d5201fd717c16 Mon Sep 17 00:00:00 2001 From: Marian Lukac Date: Tue, 30 Apr 2024 12:46:48 + Subject: [PATCH 1/4] [Clang][AArch64] Fixed incorrect _BitInt alignment --- clang/include/clang/Basic/TargetInfo.h | 8 clang/lib/AST/ASTContext.cpp | 5 +- clang/lib/Basic/Targets/AArch64.cpp| 6 ++- clang/lib/Basic/Targets/AArch64.h | 3 ++ clang/test/CodeGen/aapcs64-align.cpp | 64 +- 5 files changed, 81 insertions(+), 5 deletions(-) diff --git a/clang/include/clang/Basic/TargetInfo.h b/clang/include/clang/Basic/TargetInfo.h index 3ced2e7397a75..1b5efa488b6de 100644 --- a/clang/include/clang/Basic/TargetInfo.h +++ b/clang/include/clang/Basic/TargetInfo.h @@ -518,6 +518,14 @@ class TargetInfo : public TransferrableTargetInfo, /// getInt128Align() - Returns the alignment of Int128. unsigned getInt128Align() const { return Int128Align; } + /// getBitIntAlign/Width - Return aligned size of '_BitInt' and + /// 'unsigned _BitInt' for this target, in bits. + unsigned getBitIntWidth(unsigned NumBits) const { +return llvm::alignTo(NumBits, getBitIntAlign(NumBits));} + virtual unsigned getBitIntAlign(unsigned NumBits) const { +return std::clamp(llvm::PowerOf2Ceil(NumBits), getCharWidth(), +getLongLongAlign());} + /// getShortAccumWidth/Align - Return the size of 'signed short _Accum' and /// 'unsigned short _Accum' for this target, in bits. unsigned getShortAccumWidth() const { return ShortAccumWidth; } diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index cbf4932aff9a6..f440af50e08a4 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -2263,9 +2263,8 @@ TypeInfo ASTContext::getTypeInfoImpl(const Type *T) const { } case Type::BitInt: { const auto *EIT = cast(T); -Align = std::clamp(llvm::PowerOf2Ceil(EIT->getNumBits()), - getCharWidth(), Target->getLongLongAlign()); -Width = llvm::alignTo(EIT->getNumBits(), Align); +Align = Target->getBitIntAlign(EIT->getNumBits()); +Width = Target->getBitIntWidth(EIT->getNumBits()); break; } case Type::Record: diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp index c8d243a8fb7ae..9a6c197ff77b5 100644 --- a/clang/lib/Basic/Targets/AArch64.cpp +++ b/clang/lib/Basic/Targets/AArch64.cpp @@ -1473,6 +1473,10 @@ bool AArch64TargetInfo::validatePointerAuthKey( bool AArch64TargetInfo::hasInt128Type() const { return true; } +unsigned AArch64TargetInfo::getBitIntAlign(unsigned NumBits) const{ +return std::clamp(llvm::PowerOf2Ceil(NumBits), getCharWidth(), +getInt128Align());} + AArch64leTargetInfo::AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) : AArch64TargetInfo(Triple, Opts) {} @@ -1674,4 +1678,4 @@ void RenderScript64TargetInfo::getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const { Builder.defineMacro("__RENDERSCRIPT__"); AArch64leTargetInfo::getTargetDefines(Opts, Builder); -} +} \ No newline at end of file diff --git a/clang/lib/Basic/Targets/AArch64.h b/clang/lib/Basic/Targets/AArch64.h index 12fb50286f751..d8cdc814b2a9a 100644 --- a/clang/lib/Basic/Targets/AArch64.h +++ b/clang/lib/Basic/Targets/AArch64.h @@ -202,6 +202,9 @@ class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public TargetInfo { bool hasBitIntType() const override { return true; } bool validateTarget(DiagnosticsEngine &Diags) const override; + + unsigned getBitIntAlign(unsigned NumBits) const override; + }; class LLVM_LIBRARY_VISIBILITY AArch64leTargetInfo : public AArch64TargetInfo { diff --git a/clang/test/CodeGen/aapcs64-align.cpp b/clang/test/CodeGen/aapcs64-align.cpp index de231f2123b97..7a8151022852e 100644 --- a/clang/test/CodeGen/aapcs64-align.cpp +++ b/clang/test/CodeGen/aapcs64-align.cpp @@ -1,7 +1,7 @@ // REQUIRES: arm-registered-target // RUN: %clang_cc1 -triple aarch64-none-elf \ // RUN: -O2 \ -// RUN: -emit-llvm -o - %s | FileCheck %s +// RUN: -emit-llvm -fexperimental-max-bitint-width=1024 -o - %s | FileCheck %s extern "C" { @@ -100,4 +100,66 @@ void f5m(int, int, int, int, int, P16); // CHECK: declare void @f5(i32 noundef, [2 x i64]) // CHECK: declare void @f5m(i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, [2 x i64]) +//BitInt alignment +struct BITINT129 { +char ch; +unsigned _BitInt(129) v; +}; + +int test_bitint129(){ + return __builtin_offsetof(struct BITINT129, v); } +// CHECK: ret i32 16 + +struct BITINT127 { +char ch; +_BitInt(127) v; +}; + +int test_bitint127(){ + return __builtin_offsetof(struct BITINT127, v); +} +// CHECK: ret i
[clang] [Clang][AArch64] Fixed incorrect _BitInt alignment (PR #90602)
https://github.com/efriedma-quic approved this pull request. LGTM https://github.com/llvm/llvm-project/pull/90602 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][AArch64] Fixed incorrect _BitInt alignment (PR #90602)
@@ -518,6 +518,16 @@ class TargetInfo : public TransferrableTargetInfo, /// getInt128Align() - Returns the alignment of Int128. unsigned getInt128Align() const { return Int128Align; } + /// getBitIntAlign/Width - Return aligned size of '_BitInt' and + /// 'unsigned _BitInt' for this target, in bits. + unsigned getBitIntWidth(unsigned NumBits) const { +return llvm::alignTo(NumBits, getBitIntAlign(NumBits)); + } + virtual unsigned getBitIntAlign(unsigned NumBits) const { Lukacma wrote: Done https://github.com/llvm/llvm-project/pull/90602 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][AArch64] Fixed incorrect _BitInt alignment (PR #90602)
@@ -1674,4 +1679,4 @@ void RenderScript64TargetInfo::getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const { Builder.defineMacro("__RENDERSCRIPT__"); AArch64leTargetInfo::getTargetDefines(Opts, Builder); -} +} Lukacma wrote: Done https://github.com/llvm/llvm-project/pull/90602 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][AArch64] Fixed incorrect _BitInt alignment (PR #90602)
https://github.com/Lukacma updated https://github.com/llvm/llvm-project/pull/90602 >From dfb8a9de874f233c9d3964569f3d5201fd717c16 Mon Sep 17 00:00:00 2001 From: Marian Lukac Date: Tue, 30 Apr 2024 12:46:48 + Subject: [PATCH 1/4] [Clang][AArch64] Fixed incorrect _BitInt alignment --- clang/include/clang/Basic/TargetInfo.h | 8 clang/lib/AST/ASTContext.cpp | 5 +- clang/lib/Basic/Targets/AArch64.cpp| 6 ++- clang/lib/Basic/Targets/AArch64.h | 3 ++ clang/test/CodeGen/aapcs64-align.cpp | 64 +- 5 files changed, 81 insertions(+), 5 deletions(-) diff --git a/clang/include/clang/Basic/TargetInfo.h b/clang/include/clang/Basic/TargetInfo.h index 3ced2e7397a75..1b5efa488b6de 100644 --- a/clang/include/clang/Basic/TargetInfo.h +++ b/clang/include/clang/Basic/TargetInfo.h @@ -518,6 +518,14 @@ class TargetInfo : public TransferrableTargetInfo, /// getInt128Align() - Returns the alignment of Int128. unsigned getInt128Align() const { return Int128Align; } + /// getBitIntAlign/Width - Return aligned size of '_BitInt' and + /// 'unsigned _BitInt' for this target, in bits. + unsigned getBitIntWidth(unsigned NumBits) const { +return llvm::alignTo(NumBits, getBitIntAlign(NumBits));} + virtual unsigned getBitIntAlign(unsigned NumBits) const { +return std::clamp(llvm::PowerOf2Ceil(NumBits), getCharWidth(), +getLongLongAlign());} + /// getShortAccumWidth/Align - Return the size of 'signed short _Accum' and /// 'unsigned short _Accum' for this target, in bits. unsigned getShortAccumWidth() const { return ShortAccumWidth; } diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index cbf4932aff9a6..f440af50e08a4 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -2263,9 +2263,8 @@ TypeInfo ASTContext::getTypeInfoImpl(const Type *T) const { } case Type::BitInt: { const auto *EIT = cast(T); -Align = std::clamp(llvm::PowerOf2Ceil(EIT->getNumBits()), - getCharWidth(), Target->getLongLongAlign()); -Width = llvm::alignTo(EIT->getNumBits(), Align); +Align = Target->getBitIntAlign(EIT->getNumBits()); +Width = Target->getBitIntWidth(EIT->getNumBits()); break; } case Type::Record: diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp index c8d243a8fb7ae..9a6c197ff77b5 100644 --- a/clang/lib/Basic/Targets/AArch64.cpp +++ b/clang/lib/Basic/Targets/AArch64.cpp @@ -1473,6 +1473,10 @@ bool AArch64TargetInfo::validatePointerAuthKey( bool AArch64TargetInfo::hasInt128Type() const { return true; } +unsigned AArch64TargetInfo::getBitIntAlign(unsigned NumBits) const{ +return std::clamp(llvm::PowerOf2Ceil(NumBits), getCharWidth(), +getInt128Align());} + AArch64leTargetInfo::AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) : AArch64TargetInfo(Triple, Opts) {} @@ -1674,4 +1678,4 @@ void RenderScript64TargetInfo::getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const { Builder.defineMacro("__RENDERSCRIPT__"); AArch64leTargetInfo::getTargetDefines(Opts, Builder); -} +} \ No newline at end of file diff --git a/clang/lib/Basic/Targets/AArch64.h b/clang/lib/Basic/Targets/AArch64.h index 12fb50286f751..d8cdc814b2a9a 100644 --- a/clang/lib/Basic/Targets/AArch64.h +++ b/clang/lib/Basic/Targets/AArch64.h @@ -202,6 +202,9 @@ class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public TargetInfo { bool hasBitIntType() const override { return true; } bool validateTarget(DiagnosticsEngine &Diags) const override; + + unsigned getBitIntAlign(unsigned NumBits) const override; + }; class LLVM_LIBRARY_VISIBILITY AArch64leTargetInfo : public AArch64TargetInfo { diff --git a/clang/test/CodeGen/aapcs64-align.cpp b/clang/test/CodeGen/aapcs64-align.cpp index de231f2123b97..7a8151022852e 100644 --- a/clang/test/CodeGen/aapcs64-align.cpp +++ b/clang/test/CodeGen/aapcs64-align.cpp @@ -1,7 +1,7 @@ // REQUIRES: arm-registered-target // RUN: %clang_cc1 -triple aarch64-none-elf \ // RUN: -O2 \ -// RUN: -emit-llvm -o - %s | FileCheck %s +// RUN: -emit-llvm -fexperimental-max-bitint-width=1024 -o - %s | FileCheck %s extern "C" { @@ -100,4 +100,66 @@ void f5m(int, int, int, int, int, P16); // CHECK: declare void @f5(i32 noundef, [2 x i64]) // CHECK: declare void @f5m(i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, [2 x i64]) +//BitInt alignment +struct BITINT129 { +char ch; +unsigned _BitInt(129) v; +}; + +int test_bitint129(){ + return __builtin_offsetof(struct BITINT129, v); } +// CHECK: ret i32 16 + +struct BITINT127 { +char ch; +_BitInt(127) v; +}; + +int test_bitint127(){ + return __builtin_offsetof(struct BITINT127, v); +} +// CHECK: ret i
[clang] [Clang][AArch64] Fixed incorrect _BitInt alignment (PR #90602)
https://github.com/Lukacma updated https://github.com/llvm/llvm-project/pull/90602 >From dfb8a9de874f233c9d3964569f3d5201fd717c16 Mon Sep 17 00:00:00 2001 From: Marian Lukac Date: Tue, 30 Apr 2024 12:46:48 + Subject: [PATCH 1/3] [Clang][AArch64] Fixed incorrect _BitInt alignment --- clang/include/clang/Basic/TargetInfo.h | 8 clang/lib/AST/ASTContext.cpp | 5 +- clang/lib/Basic/Targets/AArch64.cpp| 6 ++- clang/lib/Basic/Targets/AArch64.h | 3 ++ clang/test/CodeGen/aapcs64-align.cpp | 64 +- 5 files changed, 81 insertions(+), 5 deletions(-) diff --git a/clang/include/clang/Basic/TargetInfo.h b/clang/include/clang/Basic/TargetInfo.h index 3ced2e7397a75..1b5efa488b6de 100644 --- a/clang/include/clang/Basic/TargetInfo.h +++ b/clang/include/clang/Basic/TargetInfo.h @@ -518,6 +518,14 @@ class TargetInfo : public TransferrableTargetInfo, /// getInt128Align() - Returns the alignment of Int128. unsigned getInt128Align() const { return Int128Align; } + /// getBitIntAlign/Width - Return aligned size of '_BitInt' and + /// 'unsigned _BitInt' for this target, in bits. + unsigned getBitIntWidth(unsigned NumBits) const { +return llvm::alignTo(NumBits, getBitIntAlign(NumBits));} + virtual unsigned getBitIntAlign(unsigned NumBits) const { +return std::clamp(llvm::PowerOf2Ceil(NumBits), getCharWidth(), +getLongLongAlign());} + /// getShortAccumWidth/Align - Return the size of 'signed short _Accum' and /// 'unsigned short _Accum' for this target, in bits. unsigned getShortAccumWidth() const { return ShortAccumWidth; } diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index cbf4932aff9a6..f440af50e08a4 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -2263,9 +2263,8 @@ TypeInfo ASTContext::getTypeInfoImpl(const Type *T) const { } case Type::BitInt: { const auto *EIT = cast(T); -Align = std::clamp(llvm::PowerOf2Ceil(EIT->getNumBits()), - getCharWidth(), Target->getLongLongAlign()); -Width = llvm::alignTo(EIT->getNumBits(), Align); +Align = Target->getBitIntAlign(EIT->getNumBits()); +Width = Target->getBitIntWidth(EIT->getNumBits()); break; } case Type::Record: diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp index c8d243a8fb7ae..9a6c197ff77b5 100644 --- a/clang/lib/Basic/Targets/AArch64.cpp +++ b/clang/lib/Basic/Targets/AArch64.cpp @@ -1473,6 +1473,10 @@ bool AArch64TargetInfo::validatePointerAuthKey( bool AArch64TargetInfo::hasInt128Type() const { return true; } +unsigned AArch64TargetInfo::getBitIntAlign(unsigned NumBits) const{ +return std::clamp(llvm::PowerOf2Ceil(NumBits), getCharWidth(), +getInt128Align());} + AArch64leTargetInfo::AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) : AArch64TargetInfo(Triple, Opts) {} @@ -1674,4 +1678,4 @@ void RenderScript64TargetInfo::getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const { Builder.defineMacro("__RENDERSCRIPT__"); AArch64leTargetInfo::getTargetDefines(Opts, Builder); -} +} \ No newline at end of file diff --git a/clang/lib/Basic/Targets/AArch64.h b/clang/lib/Basic/Targets/AArch64.h index 12fb50286f751..d8cdc814b2a9a 100644 --- a/clang/lib/Basic/Targets/AArch64.h +++ b/clang/lib/Basic/Targets/AArch64.h @@ -202,6 +202,9 @@ class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public TargetInfo { bool hasBitIntType() const override { return true; } bool validateTarget(DiagnosticsEngine &Diags) const override; + + unsigned getBitIntAlign(unsigned NumBits) const override; + }; class LLVM_LIBRARY_VISIBILITY AArch64leTargetInfo : public AArch64TargetInfo { diff --git a/clang/test/CodeGen/aapcs64-align.cpp b/clang/test/CodeGen/aapcs64-align.cpp index de231f2123b97..7a8151022852e 100644 --- a/clang/test/CodeGen/aapcs64-align.cpp +++ b/clang/test/CodeGen/aapcs64-align.cpp @@ -1,7 +1,7 @@ // REQUIRES: arm-registered-target // RUN: %clang_cc1 -triple aarch64-none-elf \ // RUN: -O2 \ -// RUN: -emit-llvm -o - %s | FileCheck %s +// RUN: -emit-llvm -fexperimental-max-bitint-width=1024 -o - %s | FileCheck %s extern "C" { @@ -100,4 +100,66 @@ void f5m(int, int, int, int, int, P16); // CHECK: declare void @f5(i32 noundef, [2 x i64]) // CHECK: declare void @f5m(i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, [2 x i64]) +//BitInt alignment +struct BITINT129 { +char ch; +unsigned _BitInt(129) v; +}; + +int test_bitint129(){ + return __builtin_offsetof(struct BITINT129, v); } +// CHECK: ret i32 16 + +struct BITINT127 { +char ch; +_BitInt(127) v; +}; + +int test_bitint127(){ + return __builtin_offsetof(struct BITINT127, v); +} +// CHECK: ret i
[clang] [Clang][AArch64] Fixed incorrect _BitInt alignment (PR #90602)
@@ -518,6 +518,16 @@ class TargetInfo : public TransferrableTargetInfo, /// getInt128Align() - Returns the alignment of Int128. unsigned getInt128Align() const { return Int128Align; } + /// getBitIntAlign/Width - Return aligned size of '_BitInt' and + /// 'unsigned _BitInt' for this target, in bits. + unsigned getBitIntWidth(unsigned NumBits) const { +return llvm::alignTo(NumBits, getBitIntAlign(NumBits)); + } + virtual unsigned getBitIntAlign(unsigned NumBits) const { efriedma-quic wrote: ``` unsigned getBitIntMaxAlign() { return BitIntMaxAlign.or(LongLongAlign); } unsigned getBitIntAlign(unsigned NumBits) const { return std::clamp(llvm::PowerOf2Ceil(NumBits), getCharWidth(), getBitIntMaxAlign()); } ``` https://github.com/llvm/llvm-project/pull/90602 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][AArch64] Fixed incorrect _BitInt alignment (PR #90602)
@@ -518,6 +518,16 @@ class TargetInfo : public TransferrableTargetInfo, /// getInt128Align() - Returns the alignment of Int128. unsigned getInt128Align() const { return Int128Align; } + /// getBitIntAlign/Width - Return aligned size of '_BitInt' and + /// 'unsigned _BitInt' for this target, in bits. + unsigned getBitIntWidth(unsigned NumBits) const { +return llvm::alignTo(NumBits, getBitIntAlign(NumBits)); + } + virtual unsigned getBitIntAlign(unsigned NumBits) const { Lukacma wrote: I am not sure I understand how this idea would work. Could you please elaborate on what do you mean ? https://github.com/llvm/llvm-project/pull/90602 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][AArch64] Fixed incorrect _BitInt alignment (PR #90602)
@@ -1674,4 +1679,4 @@ void RenderScript64TargetInfo::getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const { Builder.defineMacro("__RENDERSCRIPT__"); AArch64leTargetInfo::getTargetDefines(Opts, Builder); -} +} efriedma-quic wrote: Missing newline? https://github.com/llvm/llvm-project/pull/90602 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][AArch64] Fixed incorrect _BitInt alignment (PR #90602)
@@ -518,6 +518,16 @@ class TargetInfo : public TransferrableTargetInfo, /// getInt128Align() - Returns the alignment of Int128. unsigned getInt128Align() const { return Int128Align; } + /// getBitIntAlign/Width - Return aligned size of '_BitInt' and + /// 'unsigned _BitInt' for this target, in bits. + unsigned getBitIntWidth(unsigned NumBits) const { +return llvm::alignTo(NumBits, getBitIntAlign(NumBits)); + } + virtual unsigned getBitIntAlign(unsigned NumBits) const { efriedma-quic wrote: Instead of making this virtual, maybe it makes sense to add a field `std::optional BitIntMaxAlign` to TargetInfo? I expect the logic here besides the max width to be consistent across all targets. https://github.com/llvm/llvm-project/pull/90602 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][AArch64] Fixed incorrect _BitInt alignment (PR #90602)
https://github.com/efriedma-quic commented: LG https://github.com/llvm/llvm-project/pull/90602 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][AArch64] Fixed incorrect _BitInt alignment (PR #90602)
https://github.com/efriedma-quic edited https://github.com/llvm/llvm-project/pull/90602 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][AArch64] Fixed incorrect _BitInt alignment (PR #90602)
https://github.com/Lukacma updated https://github.com/llvm/llvm-project/pull/90602 >From dfb8a9de874f233c9d3964569f3d5201fd717c16 Mon Sep 17 00:00:00 2001 From: Marian Lukac Date: Tue, 30 Apr 2024 12:46:48 + Subject: [PATCH 1/2] [Clang][AArch64] Fixed incorrect _BitInt alignment --- clang/include/clang/Basic/TargetInfo.h | 8 clang/lib/AST/ASTContext.cpp | 5 +- clang/lib/Basic/Targets/AArch64.cpp| 6 ++- clang/lib/Basic/Targets/AArch64.h | 3 ++ clang/test/CodeGen/aapcs64-align.cpp | 64 +- 5 files changed, 81 insertions(+), 5 deletions(-) diff --git a/clang/include/clang/Basic/TargetInfo.h b/clang/include/clang/Basic/TargetInfo.h index 3ced2e7397a754..1b5efa488b6ded 100644 --- a/clang/include/clang/Basic/TargetInfo.h +++ b/clang/include/clang/Basic/TargetInfo.h @@ -518,6 +518,14 @@ class TargetInfo : public TransferrableTargetInfo, /// getInt128Align() - Returns the alignment of Int128. unsigned getInt128Align() const { return Int128Align; } + /// getBitIntAlign/Width - Return aligned size of '_BitInt' and + /// 'unsigned _BitInt' for this target, in bits. + unsigned getBitIntWidth(unsigned NumBits) const { +return llvm::alignTo(NumBits, getBitIntAlign(NumBits));} + virtual unsigned getBitIntAlign(unsigned NumBits) const { +return std::clamp(llvm::PowerOf2Ceil(NumBits), getCharWidth(), +getLongLongAlign());} + /// getShortAccumWidth/Align - Return the size of 'signed short _Accum' and /// 'unsigned short _Accum' for this target, in bits. unsigned getShortAccumWidth() const { return ShortAccumWidth; } diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index cbf4932aff9a6b..f440af50e08a49 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -2263,9 +2263,8 @@ TypeInfo ASTContext::getTypeInfoImpl(const Type *T) const { } case Type::BitInt: { const auto *EIT = cast(T); -Align = std::clamp(llvm::PowerOf2Ceil(EIT->getNumBits()), - getCharWidth(), Target->getLongLongAlign()); -Width = llvm::alignTo(EIT->getNumBits(), Align); +Align = Target->getBitIntAlign(EIT->getNumBits()); +Width = Target->getBitIntWidth(EIT->getNumBits()); break; } case Type::Record: diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp index c8d243a8fb7aea..9a6c197ff77b58 100644 --- a/clang/lib/Basic/Targets/AArch64.cpp +++ b/clang/lib/Basic/Targets/AArch64.cpp @@ -1473,6 +1473,10 @@ bool AArch64TargetInfo::validatePointerAuthKey( bool AArch64TargetInfo::hasInt128Type() const { return true; } +unsigned AArch64TargetInfo::getBitIntAlign(unsigned NumBits) const{ +return std::clamp(llvm::PowerOf2Ceil(NumBits), getCharWidth(), +getInt128Align());} + AArch64leTargetInfo::AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) : AArch64TargetInfo(Triple, Opts) {} @@ -1674,4 +1678,4 @@ void RenderScript64TargetInfo::getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const { Builder.defineMacro("__RENDERSCRIPT__"); AArch64leTargetInfo::getTargetDefines(Opts, Builder); -} +} \ No newline at end of file diff --git a/clang/lib/Basic/Targets/AArch64.h b/clang/lib/Basic/Targets/AArch64.h index 12fb50286f7511..d8cdc814b2a9ae 100644 --- a/clang/lib/Basic/Targets/AArch64.h +++ b/clang/lib/Basic/Targets/AArch64.h @@ -202,6 +202,9 @@ class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public TargetInfo { bool hasBitIntType() const override { return true; } bool validateTarget(DiagnosticsEngine &Diags) const override; + + unsigned getBitIntAlign(unsigned NumBits) const override; + }; class LLVM_LIBRARY_VISIBILITY AArch64leTargetInfo : public AArch64TargetInfo { diff --git a/clang/test/CodeGen/aapcs64-align.cpp b/clang/test/CodeGen/aapcs64-align.cpp index de231f2123b975..7a8151022852ea 100644 --- a/clang/test/CodeGen/aapcs64-align.cpp +++ b/clang/test/CodeGen/aapcs64-align.cpp @@ -1,7 +1,7 @@ // REQUIRES: arm-registered-target // RUN: %clang_cc1 -triple aarch64-none-elf \ // RUN: -O2 \ -// RUN: -emit-llvm -o - %s | FileCheck %s +// RUN: -emit-llvm -fexperimental-max-bitint-width=1024 -o - %s | FileCheck %s extern "C" { @@ -100,4 +100,66 @@ void f5m(int, int, int, int, int, P16); // CHECK: declare void @f5(i32 noundef, [2 x i64]) // CHECK: declare void @f5m(i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, [2 x i64]) +//BitInt alignment +struct BITINT129 { +char ch; +unsigned _BitInt(129) v; +}; + +int test_bitint129(){ + return __builtin_offsetof(struct BITINT129, v); } +// CHECK: ret i32 16 + +struct BITINT127 { +char ch; +_BitInt(127) v; +}; + +int test_bitint127(){ + return __builtin_offsetof(struct BITINT127, v); +} +// CHE
[clang] [Clang][AArch64] Fixed incorrect _BitInt alignment (PR #90602)
github-actions[bot] wrote: :warning: C/C++ code formatter, clang-format found issues in your code. :warning: You can test this locally with the following command: ``bash git-clang-format --diff 179e174945b6c0da462c534504720c9544aebf84 dfb8a9de874f233c9d3964569f3d5201fd717c16 -- clang/include/clang/Basic/TargetInfo.h clang/lib/AST/ASTContext.cpp clang/lib/Basic/Targets/AArch64.cpp clang/lib/Basic/Targets/AArch64.h clang/test/CodeGen/aapcs64-align.cpp `` View the diff from clang-format here. ``diff diff --git a/clang/include/clang/Basic/TargetInfo.h b/clang/include/clang/Basic/TargetInfo.h index 1b5efa488b..488b166a95 100644 --- a/clang/include/clang/Basic/TargetInfo.h +++ b/clang/include/clang/Basic/TargetInfo.h @@ -518,13 +518,15 @@ public: /// getInt128Align() - Returns the alignment of Int128. unsigned getInt128Align() const { return Int128Align; } - /// getBitIntAlign/Width - Return aligned size of '_BitInt' and + /// getBitIntAlign/Width - Return aligned size of '_BitInt' and /// 'unsigned _BitInt' for this target, in bits. unsigned getBitIntWidth(unsigned NumBits) const { -return llvm::alignTo(NumBits, getBitIntAlign(NumBits));} +return llvm::alignTo(NumBits, getBitIntAlign(NumBits)); + } virtual unsigned getBitIntAlign(unsigned NumBits) const { -return std::clamp(llvm::PowerOf2Ceil(NumBits), getCharWidth(), -getLongLongAlign());} +return std::clamp(llvm::PowerOf2Ceil(NumBits), getCharWidth(), +getLongLongAlign()); + } /// getShortAccumWidth/Align - Return the size of 'signed short _Accum' and /// 'unsigned short _Accum' for this target, in bits. diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp index 9a6c197ff7..cc0ae0e285 100644 --- a/clang/lib/Basic/Targets/AArch64.cpp +++ b/clang/lib/Basic/Targets/AArch64.cpp @@ -1473,9 +1473,10 @@ bool AArch64TargetInfo::validatePointerAuthKey( bool AArch64TargetInfo::hasInt128Type() const { return true; } -unsigned AArch64TargetInfo::getBitIntAlign(unsigned NumBits) const{ -return std::clamp(llvm::PowerOf2Ceil(NumBits), getCharWidth(), -getInt128Align());} +unsigned AArch64TargetInfo::getBitIntAlign(unsigned NumBits) const { + return std::clamp(llvm::PowerOf2Ceil(NumBits), getCharWidth(), + getInt128Align()); +} AArch64leTargetInfo::AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) diff --git a/clang/lib/Basic/Targets/AArch64.h b/clang/lib/Basic/Targets/AArch64.h index d8cdc814b2..be6435007a 100644 --- a/clang/lib/Basic/Targets/AArch64.h +++ b/clang/lib/Basic/Targets/AArch64.h @@ -204,7 +204,6 @@ public: bool validateTarget(DiagnosticsEngine &Diags) const override; unsigned getBitIntAlign(unsigned NumBits) const override; - }; class LLVM_LIBRARY_VISIBILITY AArch64leTargetInfo : public AArch64TargetInfo { `` https://github.com/llvm/llvm-project/pull/90602 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][AArch64] Fixed incorrect _BitInt alignment (PR #90602)
llvmbot wrote: @llvm/pr-subscribers-backend-aarch64 Author: None (Lukacma) Changes This patch makes determining alignment and width of BitInt to be target ABI specific and makes it consistent with [Procedure Call Standard for the ArmĀ® 64-bit Architecture (AArch64)](https://github.com/ARM-software/abi-aa/blob/main/aapcs64/aapcs64.rst) for AArch64 targets. --- Full diff: https://github.com/llvm/llvm-project/pull/90602.diff 5 Files Affected: - (modified) clang/include/clang/Basic/TargetInfo.h (+8) - (modified) clang/lib/AST/ASTContext.cpp (+2-3) - (modified) clang/lib/Basic/Targets/AArch64.cpp (+5-1) - (modified) clang/lib/Basic/Targets/AArch64.h (+3) - (modified) clang/test/CodeGen/aapcs64-align.cpp (+63-1) ``diff diff --git a/clang/include/clang/Basic/TargetInfo.h b/clang/include/clang/Basic/TargetInfo.h index 3ced2e7397a754..1b5efa488b6ded 100644 --- a/clang/include/clang/Basic/TargetInfo.h +++ b/clang/include/clang/Basic/TargetInfo.h @@ -518,6 +518,14 @@ class TargetInfo : public TransferrableTargetInfo, /// getInt128Align() - Returns the alignment of Int128. unsigned getInt128Align() const { return Int128Align; } + /// getBitIntAlign/Width - Return aligned size of '_BitInt' and + /// 'unsigned _BitInt' for this target, in bits. + unsigned getBitIntWidth(unsigned NumBits) const { +return llvm::alignTo(NumBits, getBitIntAlign(NumBits));} + virtual unsigned getBitIntAlign(unsigned NumBits) const { +return std::clamp(llvm::PowerOf2Ceil(NumBits), getCharWidth(), +getLongLongAlign());} + /// getShortAccumWidth/Align - Return the size of 'signed short _Accum' and /// 'unsigned short _Accum' for this target, in bits. unsigned getShortAccumWidth() const { return ShortAccumWidth; } diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index cbf4932aff9a6b..f440af50e08a49 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -2263,9 +2263,8 @@ TypeInfo ASTContext::getTypeInfoImpl(const Type *T) const { } case Type::BitInt: { const auto *EIT = cast(T); -Align = std::clamp(llvm::PowerOf2Ceil(EIT->getNumBits()), - getCharWidth(), Target->getLongLongAlign()); -Width = llvm::alignTo(EIT->getNumBits(), Align); +Align = Target->getBitIntAlign(EIT->getNumBits()); +Width = Target->getBitIntWidth(EIT->getNumBits()); break; } case Type::Record: diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp index c8d243a8fb7aea..9a6c197ff77b58 100644 --- a/clang/lib/Basic/Targets/AArch64.cpp +++ b/clang/lib/Basic/Targets/AArch64.cpp @@ -1473,6 +1473,10 @@ bool AArch64TargetInfo::validatePointerAuthKey( bool AArch64TargetInfo::hasInt128Type() const { return true; } +unsigned AArch64TargetInfo::getBitIntAlign(unsigned NumBits) const{ +return std::clamp(llvm::PowerOf2Ceil(NumBits), getCharWidth(), +getInt128Align());} + AArch64leTargetInfo::AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) : AArch64TargetInfo(Triple, Opts) {} @@ -1674,4 +1678,4 @@ void RenderScript64TargetInfo::getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const { Builder.defineMacro("__RENDERSCRIPT__"); AArch64leTargetInfo::getTargetDefines(Opts, Builder); -} +} \ No newline at end of file diff --git a/clang/lib/Basic/Targets/AArch64.h b/clang/lib/Basic/Targets/AArch64.h index 12fb50286f7511..d8cdc814b2a9ae 100644 --- a/clang/lib/Basic/Targets/AArch64.h +++ b/clang/lib/Basic/Targets/AArch64.h @@ -202,6 +202,9 @@ class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public TargetInfo { bool hasBitIntType() const override { return true; } bool validateTarget(DiagnosticsEngine &Diags) const override; + + unsigned getBitIntAlign(unsigned NumBits) const override; + }; class LLVM_LIBRARY_VISIBILITY AArch64leTargetInfo : public AArch64TargetInfo { diff --git a/clang/test/CodeGen/aapcs64-align.cpp b/clang/test/CodeGen/aapcs64-align.cpp index de231f2123b975..7a8151022852ea 100644 --- a/clang/test/CodeGen/aapcs64-align.cpp +++ b/clang/test/CodeGen/aapcs64-align.cpp @@ -1,7 +1,7 @@ // REQUIRES: arm-registered-target // RUN: %clang_cc1 -triple aarch64-none-elf \ // RUN: -O2 \ -// RUN: -emit-llvm -o - %s | FileCheck %s +// RUN: -emit-llvm -fexperimental-max-bitint-width=1024 -o - %s | FileCheck %s extern "C" { @@ -100,4 +100,66 @@ void f5m(int, int, int, int, int, P16); // CHECK: declare void @f5(i32 noundef, [2 x i64]) // CHECK: declare void @f5m(i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, [2 x i64]) +//BitInt alignment +struct BITINT129 { +char ch; +unsigned _BitInt(129) v; +}; + +int test_bitint129(){ + return __builtin_offsetof(struct BITINT129, v); } +// CHECK: ret i32 16 + +s
[clang] [Clang][AArch64] Fixed incorrect _BitInt alignment (PR #90602)
https://github.com/Lukacma created https://github.com/llvm/llvm-project/pull/90602 This patch makes determining alignment and width of BitInt to be target ABI specific and makes it consistent with [Procedure Call Standard for the ArmĀ® 64-bit Architecture (AArch64)](https://github.com/ARM-software/abi-aa/blob/main/aapcs64/aapcs64.rst) for AArch64 targets. >From dfb8a9de874f233c9d3964569f3d5201fd717c16 Mon Sep 17 00:00:00 2001 From: Marian Lukac Date: Tue, 30 Apr 2024 12:46:48 + Subject: [PATCH] [Clang][AArch64] Fixed incorrect _BitInt alignment --- clang/include/clang/Basic/TargetInfo.h | 8 clang/lib/AST/ASTContext.cpp | 5 +- clang/lib/Basic/Targets/AArch64.cpp| 6 ++- clang/lib/Basic/Targets/AArch64.h | 3 ++ clang/test/CodeGen/aapcs64-align.cpp | 64 +- 5 files changed, 81 insertions(+), 5 deletions(-) diff --git a/clang/include/clang/Basic/TargetInfo.h b/clang/include/clang/Basic/TargetInfo.h index 3ced2e7397a754..1b5efa488b6ded 100644 --- a/clang/include/clang/Basic/TargetInfo.h +++ b/clang/include/clang/Basic/TargetInfo.h @@ -518,6 +518,14 @@ class TargetInfo : public TransferrableTargetInfo, /// getInt128Align() - Returns the alignment of Int128. unsigned getInt128Align() const { return Int128Align; } + /// getBitIntAlign/Width - Return aligned size of '_BitInt' and + /// 'unsigned _BitInt' for this target, in bits. + unsigned getBitIntWidth(unsigned NumBits) const { +return llvm::alignTo(NumBits, getBitIntAlign(NumBits));} + virtual unsigned getBitIntAlign(unsigned NumBits) const { +return std::clamp(llvm::PowerOf2Ceil(NumBits), getCharWidth(), +getLongLongAlign());} + /// getShortAccumWidth/Align - Return the size of 'signed short _Accum' and /// 'unsigned short _Accum' for this target, in bits. unsigned getShortAccumWidth() const { return ShortAccumWidth; } diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index cbf4932aff9a6b..f440af50e08a49 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -2263,9 +2263,8 @@ TypeInfo ASTContext::getTypeInfoImpl(const Type *T) const { } case Type::BitInt: { const auto *EIT = cast(T); -Align = std::clamp(llvm::PowerOf2Ceil(EIT->getNumBits()), - getCharWidth(), Target->getLongLongAlign()); -Width = llvm::alignTo(EIT->getNumBits(), Align); +Align = Target->getBitIntAlign(EIT->getNumBits()); +Width = Target->getBitIntWidth(EIT->getNumBits()); break; } case Type::Record: diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp index c8d243a8fb7aea..9a6c197ff77b58 100644 --- a/clang/lib/Basic/Targets/AArch64.cpp +++ b/clang/lib/Basic/Targets/AArch64.cpp @@ -1473,6 +1473,10 @@ bool AArch64TargetInfo::validatePointerAuthKey( bool AArch64TargetInfo::hasInt128Type() const { return true; } +unsigned AArch64TargetInfo::getBitIntAlign(unsigned NumBits) const{ +return std::clamp(llvm::PowerOf2Ceil(NumBits), getCharWidth(), +getInt128Align());} + AArch64leTargetInfo::AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) : AArch64TargetInfo(Triple, Opts) {} @@ -1674,4 +1678,4 @@ void RenderScript64TargetInfo::getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const { Builder.defineMacro("__RENDERSCRIPT__"); AArch64leTargetInfo::getTargetDefines(Opts, Builder); -} +} \ No newline at end of file diff --git a/clang/lib/Basic/Targets/AArch64.h b/clang/lib/Basic/Targets/AArch64.h index 12fb50286f7511..d8cdc814b2a9ae 100644 --- a/clang/lib/Basic/Targets/AArch64.h +++ b/clang/lib/Basic/Targets/AArch64.h @@ -202,6 +202,9 @@ class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public TargetInfo { bool hasBitIntType() const override { return true; } bool validateTarget(DiagnosticsEngine &Diags) const override; + + unsigned getBitIntAlign(unsigned NumBits) const override; + }; class LLVM_LIBRARY_VISIBILITY AArch64leTargetInfo : public AArch64TargetInfo { diff --git a/clang/test/CodeGen/aapcs64-align.cpp b/clang/test/CodeGen/aapcs64-align.cpp index de231f2123b975..7a8151022852ea 100644 --- a/clang/test/CodeGen/aapcs64-align.cpp +++ b/clang/test/CodeGen/aapcs64-align.cpp @@ -1,7 +1,7 @@ // REQUIRES: arm-registered-target // RUN: %clang_cc1 -triple aarch64-none-elf \ // RUN: -O2 \ -// RUN: -emit-llvm -o - %s | FileCheck %s +// RUN: -emit-llvm -fexperimental-max-bitint-width=1024 -o - %s | FileCheck %s extern "C" { @@ -100,4 +100,66 @@ void f5m(int, int, int, int, int, P16); // CHECK: declare void @f5(i32 noundef, [2 x i64]) // CHECK: declare void @f5m(i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, [2 x i64]) +//BitInt alignment +struct BITINT129 { +char ch; +uns