From c3783847ae67d31aece461458d8510b8bd0469c3 Mon Sep 17 00:00:00 2001 From: Craig Disselkoen Date: Wed, 28 Oct 2020 16:48:22 -0400 Subject: [PATCH] C API: support scalable vectors This adds support for scalable vector types in the C API and in llvm-c-test, and also adds a test to ensure that llvm-c-test can properly roundtrip operations involving scalable vectors. While creating this diff, I discovered that the C API cannot properly roundtrip _constant expressions_ involving shufflevector / scalable vectors, but that seems to be a separate enough issue that I plan to address it in a future diff (unless reviewers feel it should be addressed here). Differential Revision: https://reviews.llvm.org/D89816 --- llvm/include/llvm-c/Core.h | 16 ++++++++++++++-- llvm/lib/IR/Core.cpp | 5 +++++ llvm/test/Bindings/llvm-c/echo.ll | 13 +++++++++++++ llvm/tools/llvm-c-test/echo.cpp | 6 +++--- 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/llvm/include/llvm-c/Core.h b/llvm/include/llvm-c/Core.h index c8a6f97..e950387 100644 --- a/llvm/include/llvm-c/Core.h +++ b/llvm/include/llvm-c/Core.h @@ -1444,9 +1444,21 @@ unsigned LLVMGetPointerAddressSpace(LLVMTypeRef PointerTy); LLVMTypeRef LLVMVectorType(LLVMTypeRef ElementType, unsigned ElementCount); /** - * Obtain the number of elements in a vector type. + * Create a vector type that contains a defined type and has a scalable + * number of elements. + * + * The created type will exist in the context thats its element type + * exists in. + * + * @see llvm::ScalableVectorType::get() + */ +LLVMTypeRef LLVMScalableVectorType(LLVMTypeRef ElementType, + unsigned ElementCount); + +/** + * Obtain the (possibly scalable) number of elements in a vector type. * - * This only works on types that represent vectors. + * This only works on types that represent vectors (fixed or scalable). * * @see llvm::VectorType::getNumElements() */ diff --git a/llvm/lib/IR/Core.cpp b/llvm/lib/IR/Core.cpp index 8f50372..256317c 100644 --- a/llvm/lib/IR/Core.cpp +++ b/llvm/lib/IR/Core.cpp @@ -764,6 +764,11 @@ LLVMTypeRef LLVMVectorType(LLVMTypeRef ElementType, unsigned ElementCount) { return wrap(FixedVectorType::get(unwrap(ElementType), ElementCount)); } +LLVMTypeRef LLVMScalableVectorType(LLVMTypeRef ElementType, + unsigned ElementCount) { + return wrap(ScalableVectorType::get(unwrap(ElementType), ElementCount)); +} + LLVMTypeRef LLVMGetElementType(LLVMTypeRef WrappedTy) { auto *Ty = unwrap(WrappedTy); if (auto *PTy = dyn_cast(Ty)) diff --git a/llvm/test/Bindings/llvm-c/echo.ll b/llvm/test/Bindings/llvm-c/echo.ll index 5494170..a1e77f6 100644 --- a/llvm/test/Bindings/llvm-c/echo.ll +++ b/llvm/test/Bindings/llvm-c/echo.ll @@ -174,6 +174,19 @@ define i32 @vectorops(i32, i32) { ret i32 %p } +define i32 @scalablevectorops(i32, ) { + %a = insertelement undef, i32 %0, i32 0 + %b = insertelement %a, i32 %0, i32 2 + %c = shufflevector %b, undef, zeroinitializer + %e = add %a, %1 + %f = mul %e, %b + %g = xor %f, %e + %h = or %g, %e + %i = lshr %h, undef + %j = extractelement %i, i32 3 + ret i32 %j +} + declare void @personalityFn() define void @exn() personality void ()* @personalityFn { diff --git a/llvm/tools/llvm-c-test/echo.cpp b/llvm/tools/llvm-c-test/echo.cpp index 0b3a10f..47dddd3 100644 --- a/llvm/tools/llvm-c-test/echo.cpp +++ b/llvm/tools/llvm-c-test/echo.cpp @@ -139,14 +139,14 @@ struct TypeCloner { Clone(LLVMGetElementType(Src)), LLVMGetPointerAddressSpace(Src) ); - case LLVMScalableVectorTypeKind: - // FIXME: scalable vectors unsupported - break; case LLVMVectorTypeKind: return LLVMVectorType( Clone(LLVMGetElementType(Src)), LLVMGetVectorSize(Src) ); + case LLVMScalableVectorTypeKind: + return LLVMScalableVectorType(Clone(LLVMGetElementType(Src)), + LLVMGetVectorSize(Src)); case LLVMMetadataTypeKind: return LLVMMetadataTypeInContext(Ctx); case LLVMX86_MMXTypeKind: -- 2.7.4