[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
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 @@
         // 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 @@
     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) \