[clang] 0353848 - [Clang][SVE] NFC: Move info about ACLE types into separate function.
Sander de Smalen via cfe-commits
cfe-commits at lists.llvm.org
Wed Aug 19 03:05:55 PDT 2020
Author: Sander de Smalen
Date: 2020-08-19T11:04:20+01:00
New Revision: 0353848cc94f0fc23a953f8f420be7ee3342c8dc
URL: https://github.com/llvm/llvm-project/commit/0353848cc94f0fc23a953f8f420be7ee3342c8dc
DIFF: https://github.com/llvm/llvm-project/commit/0353848cc94f0fc23a953f8f420be7ee3342c8dc.diff
LOG: [Clang][SVE] NFC: Move info about ACLE types into separate function.
This function returns a struct `BuiltinVectorTypeInfo` that contains
the builtin vector's element type, element count and number of vectors
(used for vector tuples).
Reviewed By: c-rhodes
Differential Revision: https://reviews.llvm.org/D86100
Added:
Modified:
clang/include/clang/AST/ASTContext.h
clang/lib/AST/ASTContext.cpp
clang/lib/CodeGen/CodeGenTypes.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/AST/ASTContext.h b/clang/include/clang/AST/ASTContext.h
index b5fb1a4da480..3996644c9c85 100644
--- a/clang/include/clang/AST/ASTContext.h
+++ b/clang/include/clang/AST/ASTContext.h
@@ -61,6 +61,7 @@
#include "llvm/Support/Allocator.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/Compiler.h"
+#include "llvm/Support/TypeSize.h"
#include <cassert>
#include <cstddef>
#include <cstdint>
@@ -1301,6 +1302,21 @@ class ASTContext : public RefCountedBase<ASTContext> {
/// Returns a vla type where known sizes are replaced with [*].
QualType getVariableArrayDecayedType(QualType Ty) const;
+ // Convenience struct to return information about a builtin vector type.
+ struct BuiltinVectorTypeInfo {
+ QualType ElementType;
+ llvm::ElementCount EC;
+ unsigned NumVectors;
+ BuiltinVectorTypeInfo(QualType ElementType, llvm::ElementCount EC,
+ unsigned NumVectors)
+ : ElementType(ElementType), EC(EC), NumVectors(NumVectors) {}
+ };
+
+ /// Returns the element type, element count and number of vectors
+ /// (in case of tuple) for a builtin vector type.
+ BuiltinVectorTypeInfo
+ getBuiltinVectorTypeInfo(const BuiltinType *VecTy) const;
+
/// Return the unique reference to a scalable vector type of the specified
/// element type and scalable number of elements.
///
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index fd3e94fbf3c2..c51629ecfd53 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -3711,6 +3711,119 @@ QualType ASTContext::getIncompleteArrayType(QualType elementType,
return QualType(newType, 0);
}
+ASTContext::BuiltinVectorTypeInfo
+ASTContext::getBuiltinVectorTypeInfo(const BuiltinType *Ty) const {
+#define SVE_INT_ELTTY(BITS, ELTS, SIGNED, NUMVECTORS) \
+ {getIntTypeForBitwidth(BITS, SIGNED), llvm::ElementCount(ELTS, true), \
+ NUMVECTORS};
+
+#define SVE_ELTTY(ELTTY, ELTS, NUMVECTORS) \
+ {ELTTY, llvm::ElementCount(ELTS, true), NUMVECTORS};
+
+ switch (Ty->getKind()) {
+ default:
+ llvm_unreachable("Unsupported builtin vector type");
+ case BuiltinType::SveInt8:
+ return SVE_INT_ELTTY(8, 16, true, 1);
+ case BuiltinType::SveUint8:
+ return SVE_INT_ELTTY(8, 16, false, 1);
+ case BuiltinType::SveInt8x2:
+ return SVE_INT_ELTTY(8, 16, true, 2);
+ case BuiltinType::SveUint8x2:
+ return SVE_INT_ELTTY(8, 16, false, 2);
+ case BuiltinType::SveInt8x3:
+ return SVE_INT_ELTTY(8, 16, true, 3);
+ case BuiltinType::SveUint8x3:
+ return SVE_INT_ELTTY(8, 16, false, 3);
+ case BuiltinType::SveInt8x4:
+ return SVE_INT_ELTTY(8, 16, true, 4);
+ case BuiltinType::SveUint8x4:
+ return SVE_INT_ELTTY(8, 16, false, 4);
+ case BuiltinType::SveInt16:
+ return SVE_INT_ELTTY(16, 8, true, 1);
+ case BuiltinType::SveUint16:
+ return SVE_INT_ELTTY(16, 8, false, 1);
+ case BuiltinType::SveInt16x2:
+ return SVE_INT_ELTTY(16, 8, true, 2);
+ case BuiltinType::SveUint16x2:
+ return SVE_INT_ELTTY(16, 8, false, 2);
+ case BuiltinType::SveInt16x3:
+ return SVE_INT_ELTTY(16, 8, true, 3);
+ case BuiltinType::SveUint16x3:
+ return SVE_INT_ELTTY(16, 8, false, 3);
+ case BuiltinType::SveInt16x4:
+ return SVE_INT_ELTTY(16, 8, true, 4);
+ case BuiltinType::SveUint16x4:
+ return SVE_INT_ELTTY(16, 8, false, 4);
+ case BuiltinType::SveInt32:
+ return SVE_INT_ELTTY(32, 4, true, 1);
+ case BuiltinType::SveUint32:
+ return SVE_INT_ELTTY(32, 4, false, 1);
+ case BuiltinType::SveInt32x2:
+ return SVE_INT_ELTTY(32, 4, true, 2);
+ case BuiltinType::SveUint32x2:
+ return SVE_INT_ELTTY(32, 4, false, 2);
+ case BuiltinType::SveInt32x3:
+ return SVE_INT_ELTTY(32, 4, true, 3);
+ case BuiltinType::SveUint32x3:
+ return SVE_INT_ELTTY(32, 4, false, 3);
+ case BuiltinType::SveInt32x4:
+ return SVE_INT_ELTTY(32, 4, true, 4);
+ case BuiltinType::SveUint32x4:
+ return SVE_INT_ELTTY(32, 4, false, 4);
+ case BuiltinType::SveInt64:
+ return SVE_INT_ELTTY(64, 2, true, 1);
+ case BuiltinType::SveUint64:
+ return SVE_INT_ELTTY(64, 2, false, 1);
+ case BuiltinType::SveInt64x2:
+ return SVE_INT_ELTTY(64, 2, true, 2);
+ case BuiltinType::SveUint64x2:
+ return SVE_INT_ELTTY(64, 2, false, 2);
+ case BuiltinType::SveInt64x3:
+ return SVE_INT_ELTTY(64, 2, true, 3);
+ case BuiltinType::SveUint64x3:
+ return SVE_INT_ELTTY(64, 2, false, 3);
+ case BuiltinType::SveInt64x4:
+ return SVE_INT_ELTTY(64, 2, true, 4);
+ case BuiltinType::SveUint64x4:
+ return SVE_INT_ELTTY(64, 2, false, 4);
+ case BuiltinType::SveBool:
+ return SVE_ELTTY(BoolTy, 16, 1);
+ case BuiltinType::SveFloat16:
+ return SVE_ELTTY(HalfTy, 8, 1);
+ case BuiltinType::SveFloat16x2:
+ return SVE_ELTTY(HalfTy, 8, 2);
+ case BuiltinType::SveFloat16x3:
+ return SVE_ELTTY(HalfTy, 8, 3);
+ case BuiltinType::SveFloat16x4:
+ return SVE_ELTTY(HalfTy, 8, 4);
+ case BuiltinType::SveFloat32:
+ return SVE_ELTTY(FloatTy, 4, 1);
+ case BuiltinType::SveFloat32x2:
+ return SVE_ELTTY(FloatTy, 4, 2);
+ case BuiltinType::SveFloat32x3:
+ return SVE_ELTTY(FloatTy, 4, 3);
+ case BuiltinType::SveFloat32x4:
+ return SVE_ELTTY(FloatTy, 4, 4);
+ case BuiltinType::SveFloat64:
+ return SVE_ELTTY(DoubleTy, 2, 1);
+ case BuiltinType::SveFloat64x2:
+ return SVE_ELTTY(DoubleTy, 2, 2);
+ case BuiltinType::SveFloat64x3:
+ return SVE_ELTTY(DoubleTy, 2, 3);
+ case BuiltinType::SveFloat64x4:
+ return SVE_ELTTY(DoubleTy, 2, 4);
+ case BuiltinType::SveBFloat16:
+ return SVE_ELTTY(BFloat16Ty, 8, 1);
+ case BuiltinType::SveBFloat16x2:
+ return SVE_ELTTY(BFloat16Ty, 8, 2);
+ case BuiltinType::SveBFloat16x3:
+ return SVE_ELTTY(BFloat16Ty, 8, 3);
+ case BuiltinType::SveBFloat16x4:
+ return SVE_ELTTY(BFloat16Ty, 8, 4);
+ }
+}
+
/// getScalableVectorType - Return the unique reference to a scalable vector
/// type of the specified element type and size. VectorType must be a built-in
/// type.
diff --git a/clang/lib/CodeGen/CodeGenTypes.cpp b/clang/lib/CodeGen/CodeGenTypes.cpp
index cad63fee4570..9c072d416075 100644
--- a/clang/lib/CodeGen/CodeGenTypes.cpp
+++ b/clang/lib/CodeGen/CodeGenTypes.cpp
@@ -534,99 +534,60 @@ llvm::Type *CodeGenTypes::ConvertType(QualType T) {
case BuiltinType::OCLReserveID:
ResultType = CGM.getOpenCLRuntime().convertOpenCLSpecificType(Ty);
break;
-#define GET_SVE_INT_VEC(BITS, ELTS) \
- llvm::ScalableVectorType::get( \
- llvm::IntegerType::get(getLLVMContext(), BITS), ELTS);
case BuiltinType::SveInt8:
case BuiltinType::SveUint8:
- return GET_SVE_INT_VEC(8, 16);
case BuiltinType::SveInt8x2:
case BuiltinType::SveUint8x2:
- return GET_SVE_INT_VEC(8, 32);
case BuiltinType::SveInt8x3:
case BuiltinType::SveUint8x3:
- return GET_SVE_INT_VEC(8, 48);
case BuiltinType::SveInt8x4:
case BuiltinType::SveUint8x4:
- return GET_SVE_INT_VEC(8, 64);
case BuiltinType::SveInt16:
case BuiltinType::SveUint16:
- return GET_SVE_INT_VEC(16, 8);
case BuiltinType::SveInt16x2:
case BuiltinType::SveUint16x2:
- return GET_SVE_INT_VEC(16, 16);
case BuiltinType::SveInt16x3:
case BuiltinType::SveUint16x3:
- return GET_SVE_INT_VEC(16, 24);
case BuiltinType::SveInt16x4:
case BuiltinType::SveUint16x4:
- return GET_SVE_INT_VEC(16, 32);
case BuiltinType::SveInt32:
case BuiltinType::SveUint32:
- return GET_SVE_INT_VEC(32, 4);
case BuiltinType::SveInt32x2:
case BuiltinType::SveUint32x2:
- return GET_SVE_INT_VEC(32, 8);
case BuiltinType::SveInt32x3:
case BuiltinType::SveUint32x3:
- return GET_SVE_INT_VEC(32, 12);
case BuiltinType::SveInt32x4:
case BuiltinType::SveUint32x4:
- return GET_SVE_INT_VEC(32, 16);
case BuiltinType::SveInt64:
case BuiltinType::SveUint64:
- return GET_SVE_INT_VEC(64, 2);
case BuiltinType::SveInt64x2:
case BuiltinType::SveUint64x2:
- return GET_SVE_INT_VEC(64, 4);
case BuiltinType::SveInt64x3:
case BuiltinType::SveUint64x3:
- return GET_SVE_INT_VEC(64, 6);
case BuiltinType::SveInt64x4:
case BuiltinType::SveUint64x4:
- return GET_SVE_INT_VEC(64, 8);
case BuiltinType::SveBool:
- return GET_SVE_INT_VEC(1, 16);
-#undef GET_SVE_INT_VEC
-#define GET_SVE_FP_VEC(TY, ISFP16, ELTS) \
- llvm::ScalableVectorType::get( \
- getTypeForFormat(getLLVMContext(), \
- Context.getFloatTypeSemantics(Context.TY), \
- /* UseNativeHalf = */ ISFP16), \
- ELTS);
case BuiltinType::SveFloat16:
- return GET_SVE_FP_VEC(HalfTy, true, 8);
case BuiltinType::SveFloat16x2:
- return GET_SVE_FP_VEC(HalfTy, true, 16);
case BuiltinType::SveFloat16x3:
- return GET_SVE_FP_VEC(HalfTy, true, 24);
case BuiltinType::SveFloat16x4:
- return GET_SVE_FP_VEC(HalfTy, true, 32);
case BuiltinType::SveFloat32:
- return GET_SVE_FP_VEC(FloatTy, false, 4);
case BuiltinType::SveFloat32x2:
- return GET_SVE_FP_VEC(FloatTy, false, 8);
case BuiltinType::SveFloat32x3:
- return GET_SVE_FP_VEC(FloatTy, false, 12);
case BuiltinType::SveFloat32x4:
- return GET_SVE_FP_VEC(FloatTy, false, 16);
case BuiltinType::SveFloat64:
- return GET_SVE_FP_VEC(DoubleTy, false, 2);
case BuiltinType::SveFloat64x2:
- return GET_SVE_FP_VEC(DoubleTy, false, 4);
case BuiltinType::SveFloat64x3:
- return GET_SVE_FP_VEC(DoubleTy, false, 6);
case BuiltinType::SveFloat64x4:
- return GET_SVE_FP_VEC(DoubleTy, false, 8);
case BuiltinType::SveBFloat16:
- return GET_SVE_FP_VEC(BFloat16Ty, false, 8);
case BuiltinType::SveBFloat16x2:
- return GET_SVE_FP_VEC(BFloat16Ty, false, 16);
case BuiltinType::SveBFloat16x3:
- return GET_SVE_FP_VEC(BFloat16Ty, false, 24);
- case BuiltinType::SveBFloat16x4:
- return GET_SVE_FP_VEC(BFloat16Ty, false, 32);
-#undef GET_SVE_FP_VEC
+ case BuiltinType::SveBFloat16x4: {
+ ASTContext::BuiltinVectorTypeInfo Info =
+ Context.getBuiltinVectorTypeInfo(cast<BuiltinType>(Ty));
+ return llvm::ScalableVectorType::get(ConvertType(Info.ElementType),
+ Info.EC.Min * Info.NumVectors);
+ }
case BuiltinType::Dependent:
#define BUILTIN_TYPE(Id, SingletonId)
#define PLACEHOLDER_TYPE(Id, SingletonId) \
More information about the cfe-commits
mailing list