Author: Jonas Paulsson Date: 2022-08-03T15:39:54+02:00 New Revision: 84831bdfedbad8221a529a640d0f4bd9d0e3ba7b
URL: https://github.com/llvm/llvm-project/commit/84831bdfedbad8221a529a640d0f4bd9d0e3ba7b DIFF: https://github.com/llvm/llvm-project/commit/84831bdfedbad8221a529a640d0f4bd9d0e3ba7b.diff LOG: [SystemZ] Make 128 bit integers be aligned to 8 bytes. The SystemZ ABI says that 128 bit integers should be aligned to only 8 bytes. Reviewed By: Ulrich Weigand, Nikita Popov Differential Revision: https://reviews.llvm.org/D130900 Added: llvm/test/CodeGen/SystemZ/unaligned-02.ll Modified: clang/include/clang/Basic/TargetInfo.h clang/lib/AST/ASTContext.cpp clang/lib/Basic/TargetInfo.cpp clang/lib/Basic/Targets/SystemZ.h clang/test/CodeGen/SystemZ/align-systemz.c clang/test/CodeGen/SystemZ/systemz-abi.c clang/test/CodeGen/SystemZ/zos-alignment.c Removed: ################################################################################ diff --git a/clang/include/clang/Basic/TargetInfo.h b/clang/include/clang/Basic/TargetInfo.h index b4f3a69259fad..6f9ee65544450 100644 --- a/clang/include/clang/Basic/TargetInfo.h +++ b/clang/include/clang/Basic/TargetInfo.h @@ -78,6 +78,7 @@ struct TransferrableTargetInfo { unsigned char LargeArrayMinWidth, LargeArrayAlign; unsigned char LongWidth, LongAlign; unsigned char LongLongWidth, LongLongAlign; + unsigned char Int128Align; // Fixed point bit widths unsigned char ShortAccumWidth, ShortAccumAlign; @@ -470,6 +471,9 @@ class TargetInfo : public virtual TransferrableTargetInfo, unsigned getLongLongWidth() const { return LongLongWidth; } unsigned getLongLongAlign() const { return LongLongAlign; } + /// getInt128Align() - Returns the alignment of Int128. + unsigned getInt128Align() const { return Int128Align; } + /// 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 eefb07465b1cb..21fd3953eb159 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -2082,7 +2082,7 @@ TypeInfo ASTContext::getTypeInfoImpl(const Type *T) const { case BuiltinType::Int128: case BuiltinType::UInt128: Width = 128; - Align = 128; // int128_t is 128-bit aligned on all targets. + Align = Target->getInt128Align(); break; case BuiltinType::ShortAccum: case BuiltinType::UShortAccum: diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp index 6685145ea6d2e..4e2446315a379 100644 --- a/clang/lib/Basic/TargetInfo.cpp +++ b/clang/lib/Basic/TargetInfo.cpp @@ -45,6 +45,7 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) { IntWidth = IntAlign = 32; LongWidth = LongAlign = 32; LongLongWidth = LongLongAlign = 64; + Int128Align = 128; // Fixed point default bit widths ShortAccumWidth = ShortAccumAlign = 16; diff --git a/clang/lib/Basic/Targets/SystemZ.h b/clang/lib/Basic/Targets/SystemZ.h index e4f242e624cb1..7def024d07a77 100644 --- a/clang/lib/Basic/Targets/SystemZ.h +++ b/clang/lib/Basic/Targets/SystemZ.h @@ -40,6 +40,7 @@ class LLVM_LIBRARY_VISIBILITY SystemZTargetInfo : public TargetInfo { TLSSupported = true; IntWidth = IntAlign = 32; LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64; + Int128Align = 64; PointerWidth = PointerAlign = 64; LongDoubleWidth = 128; LongDoubleAlign = 64; diff --git a/clang/test/CodeGen/SystemZ/align-systemz.c b/clang/test/CodeGen/SystemZ/align-systemz.c index 8cc33a83f8686..72d988e413291 100644 --- a/clang/test/CodeGen/SystemZ/align-systemz.c +++ b/clang/test/CodeGen/SystemZ/align-systemz.c @@ -26,6 +26,14 @@ void func (void) } +// The SystemZ ABI aligns __int128_t to only eight bytes. + +struct S_int128 { __int128_t B; } Obj_I128; +__int128_t GlobI128; +// CHECK: @Obj_I128 = global %struct.S_int128 zeroinitializer, align 8 +// CHECK: @GlobI128 = global i128 0, align 8 + + // Alignment should be respected for coerced argument loads struct arg { long y __attribute__((packed, aligned(4))); }; @@ -40,4 +48,3 @@ void test (void) // CHECK-LABEL: @test // CHECK: load i64, i64* getelementptr inbounds (%struct.arg, %struct.arg* @x, i32 0, i32 0), align 4 - diff --git a/clang/test/CodeGen/SystemZ/systemz-abi.c b/clang/test/CodeGen/SystemZ/systemz-abi.c index e79a287852e2d..1e7e83684005a 100644 --- a/clang/test/CodeGen/SystemZ/systemz-abi.c +++ b/clang/test/CodeGen/SystemZ/systemz-abi.c @@ -43,7 +43,7 @@ long long pass_longlong(long long arg) { return arg; } // CHECK-LABEL: define{{.*}} i64 @pass_longlong(i64 %{{.*}}) __int128 pass_int128(__int128 arg) { return arg; } -// CHECK-LABEL: define{{.*}} void @pass_int128(i128* noalias sret(i128) align 16 %{{.*}}, i128* %0) +// CHECK-LABEL: define{{.*}} void @pass_int128(i128* noalias sret(i128) align 8 %{{.*}}, i128* %0) float pass_float(float arg) { return arg; } // CHECK-LABEL: define{{.*}} float @pass_float(float %{{.*}}) diff --git a/clang/test/CodeGen/SystemZ/zos-alignment.c b/clang/test/CodeGen/SystemZ/zos-alignment.c index 370a727c98198..65c6843e0d9ac 100644 --- a/clang/test/CodeGen/SystemZ/zos-alignment.c +++ b/clang/test/CodeGen/SystemZ/zos-alignment.c @@ -160,6 +160,13 @@ struct s11 { // CHECK-NEXT: 8 | char b // CHECK-NEXT: | [sizeof=16, align=8] +struct s12 { + __int128_t a; +} S12; +// CHECK: 0 | struct s12 +// CHECK-NEXT: 0 | __int128_t a +// CHECK-NEXT: | [sizeof=16, align=8] + union u0 { unsigned short d1 __attribute__((packed)); int d2 : 10; diff --git a/llvm/test/CodeGen/SystemZ/unaligned-02.ll b/llvm/test/CodeGen/SystemZ/unaligned-02.ll new file mode 100644 index 0000000000000..30925960331be --- /dev/null +++ b/llvm/test/CodeGen/SystemZ/unaligned-02.ll @@ -0,0 +1,13 @@ +; Check that an unaligned i128 access get the correct alignment added. +; +; RUN: llc < %s -mtriple=s390x-linux-gnu -stop-after=pre-isel-intrinsic-lowering \ +; RUN: | FileCheck %s + +define void @f1(ptr %ptr) { +; CHECK: define void @f1(ptr %ptr) { +; CHECK-NEXT: store i128 0, ptr %ptr, align 8 +; CHECK-NEXT: ret void +; CHECK-NEXT: } + store i128 0, ptr %ptr + ret void +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits