From 49b307e96d47a74e4aa8f60f3d493eac10849d4b Mon Sep 17 00:00:00 2001 From: Sander de Smalen Date: Wed, 19 Feb 2020 10:44:56 +0000 Subject: [PATCH] [AArch64][SVE] CodeGen of ACLE Builtin Types Summary: This patch adds codegen support for the ACLE builtin types added in: https://reviews.llvm.org/D62960 so that the ACLE builtin types are emitted as corresponding scalable vector types in LLVM. Reviewers: rsandifo-arm, rovka, rjmccall, efriedma Reviewed By: efriedma Subscribers: tschuett, kristof.beyls, hiraditya, rkruppe, psnobl, llvm-commits, cfe-commits Tags: #clang, #llvm Differential Revision: https://reviews.llvm.org/D74724 --- clang/lib/CodeGen/CGDecl.cpp | 7 +++-- clang/lib/CodeGen/CodeGenTypes.cpp | 53 ++++++++++++++++++++++++++------------ clang/test/CodeGen/aarch64-sve.c | 50 ++++++++++++++++++++++++++++++++--- 3 files changed, 88 insertions(+), 22 deletions(-) diff --git a/clang/lib/CodeGen/CGDecl.cpp b/clang/lib/CodeGen/CGDecl.cpp index 1767e74..34269b2 100644 --- a/clang/lib/CodeGen/CGDecl.cpp +++ b/clang/lib/CodeGen/CGDecl.cpp @@ -1517,9 +1517,12 @@ CodeGenFunction::EmitAutoVarAlloca(const VarDecl &D) { // is rare. if (!Bypasses.IsBypassed(&D) && !(!getLangOpts().CPlusPlus && hasLabelBeenSeenInCurrentScope())) { - uint64_t size = CGM.getDataLayout().getTypeAllocSize(allocaTy); + llvm::TypeSize size = + CGM.getDataLayout().getTypeAllocSize(allocaTy); emission.SizeForLifetimeMarkers = - EmitLifetimeStart(size, AllocaAddr.getPointer()); + size.isScalable() ? EmitLifetimeStart(-1, AllocaAddr.getPointer()) + : EmitLifetimeStart(size.getFixedSize(), + AllocaAddr.getPointer()); } } else { assert(!emission.useLifetimeMarkers()); diff --git a/clang/lib/CodeGen/CodeGenTypes.cpp b/clang/lib/CodeGen/CodeGenTypes.cpp index a458811..31eca16 100644 --- a/clang/lib/CodeGen/CodeGenTypes.cpp +++ b/clang/lib/CodeGen/CodeGenTypes.cpp @@ -511,23 +511,44 @@ llvm::Type *CodeGenTypes::ConvertType(QualType T) { case BuiltinType::OCLReserveID: ResultType = CGM.getOpenCLRuntime().convertOpenCLSpecificType(Ty); break; - - // TODO: real CodeGen support for SVE types requires more infrastructure - // to be added first. Report an error until then. -#define SVE_TYPE(Name, Id, SingletonId) case BuiltinType::Id: -#include "clang/Basic/AArch64SVEACLETypes.def" - { - unsigned DiagID = CGM.getDiags().getCustomDiagID( - DiagnosticsEngine::Error, - "cannot yet generate code for SVE type '%0'"); - auto *BT = cast(Ty); - auto Name = BT->getName(CGM.getContext().getPrintingPolicy()); - CGM.getDiags().Report(DiagID) << Name; - // Return something safe. - ResultType = llvm::IntegerType::get(getLLVMContext(), 32); + case BuiltinType::SveInt8: + case BuiltinType::SveUint8: + return llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 8), + {16, true}); + case BuiltinType::SveInt16: + case BuiltinType::SveUint16: + return llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 16), + {8, true}); + case BuiltinType::SveInt32: + case BuiltinType::SveUint32: + return llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 32), + {4, true}); + case BuiltinType::SveInt64: + case BuiltinType::SveUint64: + return llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 64), + {2, true}); + case BuiltinType::SveFloat16: + return llvm::VectorType::get( + getTypeForFormat(getLLVMContext(), + Context.getFloatTypeSemantics(Context.HalfTy), + /* UseNativeHalf = */ true), + {8, true}); + case BuiltinType::SveFloat32: + return llvm::VectorType::get( + getTypeForFormat(getLLVMContext(), + Context.getFloatTypeSemantics(Context.FloatTy), + /* UseNativeHalf = */ false), + {4, true}); + case BuiltinType::SveFloat64: + return llvm::VectorType::get( + getTypeForFormat(getLLVMContext(), + Context.getFloatTypeSemantics(Context.DoubleTy), + /* UseNativeHalf = */ false), + {2, true}); + case BuiltinType::SveBool: + return llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 1), + {16, true}); break; - } - case BuiltinType::Dependent: #define BUILTIN_TYPE(Id, SingletonId) #define PLACEHOLDER_TYPE(Id, SingletonId) \ diff --git a/clang/test/CodeGen/aarch64-sve.c b/clang/test/CodeGen/aarch64-sve.c index b596fbb..bb4512d5 100644 --- a/clang/test/CodeGen/aarch64-sve.c +++ b/clang/test/CodeGen/aarch64-sve.c @@ -1,9 +1,51 @@ // RUN: not %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve \ -// RUN: -emit-llvm -o - %s -debug-info-kind=limited 2>&1 | FileCheck %s +// RUN: -emit-llvm -o - %s -debug-info-kind=limited 2>&1 | FileCheck %s -check-prefix=CHECK-DEBUG +// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve \ +// RUN: -emit-llvm -o - %s 2>&1 | FileCheck %s -check-prefix=CHECK -// Placeholder test for SVE types +// CHECK-DEBUG: cannot yet generate debug info for SVE type '__SVInt8_t' +// CHECK-DEBUG: cannot yet generate debug info for SVE type '__SVInt16_t' +// CHECK-DEBUG: cannot yet generate debug info for SVE type '__SVInt32_t' +// CHECK-DEBUG: cannot yet generate debug info for SVE type '__SVInt64_t' +// CHECK-DEBUG: cannot yet generate debug info for SVE type '__SVUint8_t' +// CHECK-DEBUG: cannot yet generate debug info for SVE type '__SVUint16_t' +// CHECK-DEBUG: cannot yet generate debug info for SVE type '__SVUint32_t' +// CHECK-DEBUG: cannot yet generate debug info for SVE type '__SVUint64_t' +// CHECK-DEBUG: cannot yet generate debug info for SVE type '__SVFloat16_t' +// CHECK-DEBUG: cannot yet generate debug info for SVE type '__SVFloat32_t' +// CHECK-DEBUG: cannot yet generate debug info for SVE type '__SVFloat64_t' +// CHECK-DEBUG: cannot yet generate debug info for SVE type '__SVBool_t' -// CHECK: cannot yet generate code for SVE type '__SVInt8_t' -// CHECK: cannot yet generate debug info for SVE type '__SVInt8_t' +// CHECK: @ptr = common global * null, align 8 +// CHECK: %s8 = alloca , align 16 +// CHECK: %s16 = alloca , align 16 +// CHECK: %s32 = alloca , align 16 +// CHECK: %s64 = alloca , align 16 +// CHECK: %u8 = alloca , align 16 +// CHECK: %u16 = alloca , align 16 +// CHECK: %u32 = alloca , align 16 +// CHECK: %u64 = alloca , align 16 +// CHECK: %f16 = alloca , align 16 +// CHECK: %f32 = alloca , align 16 +// CHECK: %f64 = alloca , align 16 +// CHECK: %b8 = alloca , align 2 __SVInt8_t *ptr; + +void test_locals(void) { + __SVInt8_t s8; + __SVInt16_t s16; + __SVInt32_t s32; + __SVInt64_t s64; + + __SVUint8_t u8; + __SVUint16_t u16; + __SVUint32_t u32; + __SVUint64_t u64; + + __SVFloat16_t f16; + __SVFloat32_t f32; + __SVFloat64_t f64; + + __SVBool_t b8; +} -- 2.7.4