[clang] 49b307e - [AArch64][SVE] CodeGen of ACLE Builtin Types
Sander de Smalen via cfe-commits
cfe-commits at lists.llvm.org
Wed Feb 19 04:11:19 PST 2020
Author: Sander de Smalen
Date: 2020-02-19T12:10:47Z
New Revision: 49b307e96d47a74e4aa8f60f3d493eac10849d4b
URL: https://github.com/llvm/llvm-project/commit/49b307e96d47a74e4aa8f60f3d493eac10849d4b
DIFF: https://github.com/llvm/llvm-project/commit/49b307e96d47a74e4aa8f60f3d493eac10849d4b.diff
LOG: [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
Added:
Modified:
clang/lib/CodeGen/CGDecl.cpp
clang/lib/CodeGen/CodeGenTypes.cpp
clang/test/CodeGen/aarch64-sve.c
Removed:
################################################################################
diff --git a/clang/lib/CodeGen/CGDecl.cpp b/clang/lib/CodeGen/CGDecl.cpp
index 1767e744bac7..34269b282b80 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 a458811d7a30..31eca16bbbe5 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<BuiltinType>(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 b596fbbfcc8d..bb4512d5ed93 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 <vscale x 16 x i8>* null, align 8
+// CHECK: %s8 = alloca <vscale x 16 x i8>, align 16
+// CHECK: %s16 = alloca <vscale x 8 x i16>, align 16
+// CHECK: %s32 = alloca <vscale x 4 x i32>, align 16
+// CHECK: %s64 = alloca <vscale x 2 x i64>, align 16
+// CHECK: %u8 = alloca <vscale x 16 x i8>, align 16
+// CHECK: %u16 = alloca <vscale x 8 x i16>, align 16
+// CHECK: %u32 = alloca <vscale x 4 x i32>, align 16
+// CHECK: %u64 = alloca <vscale x 2 x i64>, align 16
+// CHECK: %f16 = alloca <vscale x 8 x half>, align 16
+// CHECK: %f32 = alloca <vscale x 4 x float>, align 16
+// CHECK: %f64 = alloca <vscale x 2 x double>, align 16
+// CHECK: %b8 = alloca <vscale x 16 x i1>, 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;
+}
More information about the cfe-commits
mailing list