[PATCH] D87607: [clang][aarch64] Support implicit casts between GNU and SVE vectors
This revision was automatically updated to reflect the committed changes. Closed by commit rG9218f9283802: [clang][aarch64] ACLE: Support implicit casts between GNU and SVE vectors (authored by c-rhodes). Changed prior to commit: https://reviews.llvm.org/D87607?vs=292162=292441#toc Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D87607/new/ https://reviews.llvm.org/D87607 Files: clang/lib/AST/ASTContext.cpp clang/test/CodeGen/attr-arm-sve-vector-bits-cast.c clang/test/Sema/attr-arm-sve-vector-bits.c clang/test/SemaCXX/attr-arm-sve-vector-bits.cpp Index: clang/test/SemaCXX/attr-arm-sve-vector-bits.cpp === --- clang/test/SemaCXX/attr-arm-sve-vector-bits.cpp +++ clang/test/SemaCXX/attr-arm-sve-vector-bits.cpp @@ -1,14 +1,26 @@ -// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -fsyntax-only -verify -std=c++11 -msve-vector-bits=512 -fallow-half-arguments-and-returns %s +// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -ffreestanding -fsyntax-only -verify -std=c++11 -msve-vector-bits=512 -fallow-half-arguments-and-returns %s // expected-no-diagnostics +#include + #define N __ARM_FEATURE_SVE_BITS typedef __SVInt8_t svint8_t; typedef svint8_t fixed_int8_t __attribute__((arm_sve_vector_bits(N))); +typedef int8_t gnu_int8_t __attribute__((vector_size(N / 8))); template struct S { T var; }; S s; +// Test implicit casts between VLA and VLS vectors svint8_t to_svint8_t(fixed_int8_t x) { return x; } fixed_int8_t from_svint8_t(svint8_t x) { return x; } + +// Test implicit casts between GNU and VLA vectors +svint8_t to_svint8_t__from_gnu_int8_t(gnu_int8_t x) { return x; } +gnu_int8_t from_svint8_t__to_gnu_int8_t(svint8_t x) { return x; } + +// Test implicit casts between GNU and VLS vectors +fixed_int8_t to_fixed_int8_t__from_gnu_int8_t(gnu_int8_t x) { return x; } +gnu_int8_t from_fixed_int8_t__to_gnu_int8_t(fixed_int8_t x) { return x; } Index: clang/test/Sema/attr-arm-sve-vector-bits.c === --- clang/test/Sema/attr-arm-sve-vector-bits.c +++ clang/test/Sema/attr-arm-sve-vector-bits.c @@ -1,11 +1,16 @@ -// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -fsyntax-only -verify -msve-vector-bits=128 -fallow-half-arguments-and-returns %s -// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -fsyntax-only -verify -msve-vector-bits=256 -fallow-half-arguments-and-returns %s -// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -fsyntax-only -verify -msve-vector-bits=512 -fallow-half-arguments-and-returns %s -// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -fsyntax-only -verify -msve-vector-bits=1024 -fallow-half-arguments-and-returns %s -// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -fsyntax-only -verify -msve-vector-bits=2048 -fallow-half-arguments-and-returns %s +// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -ffreestanding -fsyntax-only -verify -msve-vector-bits=128 -fallow-half-arguments-and-returns %s +// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -ffreestanding -fsyntax-only -verify -msve-vector-bits=256 -fallow-half-arguments-and-returns %s +// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -ffreestanding -fsyntax-only -verify -msve-vector-bits=512 -fallow-half-arguments-and-returns %s +// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -ffreestanding -fsyntax-only -verify -msve-vector-bits=1024 -fallow-half-arguments-and-returns %s +// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -ffreestanding -fsyntax-only -verify -msve-vector-bits=2048 -fallow-half-arguments-and-returns %s + +#include #define N __ARM_FEATURE_SVE_BITS +typedef __fp16 float16_t; +typedef float float32_t; +typedef double float64_t; typedef __SVInt8_t svint8_t; typedef __SVInt16_t svint16_t; typedef __SVInt32_t svint32_t; @@ -19,6 +24,7 @@ typedef __SVFloat64_t svfloat64_t; #if defined(__ARM_FEATURE_SVE_BF16) +typedef __bf16 bfloat16_t; typedef __SVBFloat16_t svbfloat16_t; #endif @@ -43,6 +49,23 @@ typedef svbool_t fixed_bool_t __attribute__((arm_sve_vector_bits(N))); +// GNU vector types +typedef int8_t gnu_int8_t __attribute__((vector_size(N / 8))); +typedef int16_t gnu_int16_t __attribute__((vector_size(N / 8))); +typedef int32_t gnu_int32_t __attribute__((vector_size(N / 8))); +typedef int64_t gnu_int64_t __attribute__((vector_size(N / 8))); + +typedef uint8_t gnu_uint8_t __attribute__((vector_size(N / 8)));
[PATCH] D87607: [clang][aarch64] Support implicit casts between GNU and SVE vectors
efriedma accepted this revision. efriedma added a comment. This revision is now accepted and ready to land. LGTM CHANGES SINCE LAST ACTION https://reviews.llvm.org/D87607/new/ https://reviews.llvm.org/D87607 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D87607: [clang][aarch64] Support implicit casts between GNU and SVE vectors
c-rhodes added inline comments. Comment at: clang/test/Sema/attr-arm-sve-vector-bits.c:237 +// Test implicit conversion between SVE and GNU vector is invalid when +// __ARM_FEATURE_SVE_BITS != N +#if defined(__ARM_FEATURE_SVE_BITS) && __ARM_FEATURE_SVE_BITS == 512 efriedma wrote: > This test isn't checking what it says it is; int4 and svint64_t have > different element types. > This test isn't checking what it says it is; int4 and svint64_t have > different element types. Good spot! Fixed CHANGES SINCE LAST ACTION https://reviews.llvm.org/D87607/new/ https://reviews.llvm.org/D87607 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D87607: [clang][aarch64] Support implicit casts between GNU and SVE vectors
c-rhodes updated this revision to Diff 292162. c-rhodes added a comment. Address comments CHANGES SINCE LAST ACTION https://reviews.llvm.org/D87607/new/ https://reviews.llvm.org/D87607 Files: clang/lib/AST/ASTContext.cpp clang/test/CodeGen/attr-arm-sve-vector-bits-cast.c clang/test/Sema/attr-arm-sve-vector-bits.c clang/test/SemaCXX/attr-arm-sve-vector-bits.cpp Index: clang/test/SemaCXX/attr-arm-sve-vector-bits.cpp === --- clang/test/SemaCXX/attr-arm-sve-vector-bits.cpp +++ clang/test/SemaCXX/attr-arm-sve-vector-bits.cpp @@ -1,14 +1,26 @@ -// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -fsyntax-only -verify -std=c++11 -msve-vector-bits=512 -fallow-half-arguments-and-returns %s +// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -ffreestanding -fsyntax-only -verify -std=c++11 -msve-vector-bits=512 -fallow-half-arguments-and-returns %s // expected-no-diagnostics +#include + #define N __ARM_FEATURE_SVE_BITS typedef __SVInt8_t svint8_t; typedef svint8_t fixed_int8_t __attribute__((arm_sve_vector_bits(N))); +typedef int8_t gnu_int8_t __attribute__((vector_size(N / 8))); template struct S { T var; }; S s; +// Test implicit casts between VLA and VLS vectors svint8_t to_svint8_t(fixed_int8_t x) { return x; } fixed_int8_t from_svint8_t(svint8_t x) { return x; } + +// Test implicit casts between GNU and VLA vectors +svint8_t to_svint8_t__from_gnu_int8_t(gnu_int8_t x) { return x; } +gnu_int8_t from_svint8_t__to_gnu_int8_t(svint8_t x) { return x; } + +// Test implicit casts between GNU and VLS vectors +fixed_int8_t to_fixed_int8_t__from_gnu_int8_t(gnu_int8_t x) { return x; } +gnu_int8_t from_fixed_int8_t__to_gnu_int8_t(fixed_int8_t x) { return x; } Index: clang/test/Sema/attr-arm-sve-vector-bits.c === --- clang/test/Sema/attr-arm-sve-vector-bits.c +++ clang/test/Sema/attr-arm-sve-vector-bits.c @@ -1,11 +1,16 @@ -// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -fsyntax-only -verify -msve-vector-bits=128 -fallow-half-arguments-and-returns %s -// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -fsyntax-only -verify -msve-vector-bits=256 -fallow-half-arguments-and-returns %s -// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -fsyntax-only -verify -msve-vector-bits=512 -fallow-half-arguments-and-returns %s -// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -fsyntax-only -verify -msve-vector-bits=1024 -fallow-half-arguments-and-returns %s -// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -fsyntax-only -verify -msve-vector-bits=2048 -fallow-half-arguments-and-returns %s +// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -ffreestanding -fsyntax-only -verify -msve-vector-bits=128 -fallow-half-arguments-and-returns %s +// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -ffreestanding -fsyntax-only -verify -msve-vector-bits=256 -fallow-half-arguments-and-returns %s +// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -ffreestanding -fsyntax-only -verify -msve-vector-bits=512 -fallow-half-arguments-and-returns %s +// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -ffreestanding -fsyntax-only -verify -msve-vector-bits=1024 -fallow-half-arguments-and-returns %s +// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -ffreestanding -fsyntax-only -verify -msve-vector-bits=2048 -fallow-half-arguments-and-returns %s + +#include #define N __ARM_FEATURE_SVE_BITS +typedef __fp16 float16_t; +typedef float float32_t; +typedef double float64_t; typedef __SVInt8_t svint8_t; typedef __SVInt16_t svint16_t; typedef __SVInt32_t svint32_t; @@ -19,6 +24,7 @@ typedef __SVFloat64_t svfloat64_t; #if defined(__ARM_FEATURE_SVE_BF16) +typedef __bf16 bfloat16_t; typedef __SVBFloat16_t svbfloat16_t; #endif @@ -43,6 +49,23 @@ typedef svbool_t fixed_bool_t __attribute__((arm_sve_vector_bits(N))); +// GNU vector types +typedef int8_t gnu_int8_t __attribute__((vector_size(N / 8))); +typedef int16_t gnu_int16_t __attribute__((vector_size(N / 8))); +typedef int32_t gnu_int32_t __attribute__((vector_size(N / 8))); +typedef int64_t gnu_int64_t __attribute__((vector_size(N / 8))); + +typedef uint8_t gnu_uint8_t __attribute__((vector_size(N / 8))); +typedef uint16_t gnu_uint16_t __attribute__((vector_size(N / 8))); +typedef uint32_t gnu_uint32_t __attribute__((vector_size(N / 8))); +typedef uint64_t gnu_uint64_t __attribute__((vector_size(N / 8))); + +typedef float16_t gnu_float16_t
[PATCH] D87607: [clang][aarch64] Support implicit casts between GNU and SVE vectors
c-rhodes added inline comments. Comment at: clang/lib/AST/ASTContext.cpp:8522 + return VT->getElementType().getCanonicalType() == + getBuiltinVectorTypeInfo(BT).ElementType; } efriedma wrote: > c-rhodes wrote: > > efriedma wrote: > > > We allow casting SVE fixed-width vectors only if the element type is > > > identical, but we allow casting to GNU fixed-width vectors if the vector > > > width is the same? That seems sort of loose; could allow weird casts, > > > particularly when bool vectors are involved. > > > We allow casting SVE fixed-width vectors only if the element type is > > > identical, but we allow casting to GNU fixed-width vectors if the vector > > > width is the same? That seems sort of loose; could allow weird casts, > > > particularly when bool vectors are involved. > > > > Fixed-length SVE vectors are created with the attribute and the vector > > width must match `-msve-vector-bits`, which should guarantee consistent > > vector widths for a given input. This is checking the vector width is the > > same and the element type matches when casting between GNU and SVE vectors, > > although since neither of those types are created by the attribute it's > > necessary to check the vector width to validate `__ARM_FEATURE_SVE_BITS==N`. > > > > Predicates are treated differently in the ACLE and it doesn't mention > > supporting casts between GNU bool vectors and SVE VLS/VLA predicates. I'm > > also not sure the GNU vector_size extension is defined for bool elements > > yet, but I did notice Simon Moll is working on this (D81083). > I think you need to check both the size and the element type here? > I think you need to check both the size and the element type here? Compare the size of a scalable and fixed-length vector? CHANGES SINCE LAST ACTION https://reviews.llvm.org/D87607/new/ https://reviews.llvm.org/D87607 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D87607: [clang][aarch64] Support implicit casts between GNU and SVE vectors
efriedma added inline comments. Comment at: clang/lib/AST/ASTContext.cpp:8522 + return VT->getElementType().getCanonicalType() == + getBuiltinVectorTypeInfo(BT).ElementType; } c-rhodes wrote: > efriedma wrote: > > We allow casting SVE fixed-width vectors only if the element type is > > identical, but we allow casting to GNU fixed-width vectors if the vector > > width is the same? That seems sort of loose; could allow weird casts, > > particularly when bool vectors are involved. > > We allow casting SVE fixed-width vectors only if the element type is > > identical, but we allow casting to GNU fixed-width vectors if the vector > > width is the same? That seems sort of loose; could allow weird casts, > > particularly when bool vectors are involved. > > Fixed-length SVE vectors are created with the attribute and the vector width > must match `-msve-vector-bits`, which should guarantee consistent vector > widths for a given input. This is checking the vector width is the same and > the element type matches when casting between GNU and SVE vectors, although > since neither of those types are created by the attribute it's necessary to > check the vector width to validate `__ARM_FEATURE_SVE_BITS==N`. > > Predicates are treated differently in the ACLE and it doesn't mention > supporting casts between GNU bool vectors and SVE VLS/VLA predicates. I'm > also not sure the GNU vector_size extension is defined for bool elements yet, > but I did notice Simon Moll is working on this (D81083). I think you need to check both the size and the element type here? Comment at: clang/test/Sema/attr-arm-sve-vector-bits.c:237 +// Test implicit conversion between SVE and GNU vector is invalid when +// __ARM_FEATURE_SVE_BITS != N +#if defined(__ARM_FEATURE_SVE_BITS) && __ARM_FEATURE_SVE_BITS == 512 This test isn't checking what it says it is; int4 and svint64_t have different element types. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D87607/new/ https://reviews.llvm.org/D87607 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D87607: [clang][aarch64] Support implicit casts between GNU and SVE vectors
c-rhodes added inline comments. Comment at: clang/test/Sema/attr-arm-sve-vector-bits.c:233-234 +svint64_t to_svint64_t__from_gnu_int32_t(gnu_int32_t x) { return x; } // expected-error-re {{returning 'gnu_int32_t' (vector of {{[0-9]+}} 'int32_t' values) from a function with incompatible result type 'svint64_t' (aka '__SVInt64_t')}} +gnu_int32_t from_svint64_t__to_gnu_int32_t(svint64_t x) { return x; } // expected-error-re {{returning 'svint64_t' (aka '__SVInt64_t') from a function with incompatible result type 'gnu_int32_t' (vector of {{[0-9]+}} 'int32_t' values)}} + c-rhodes wrote: > I expected similar diagnostics when casting between GNU and fixed-length SVE > vectors where the element type doesn't match but the vector size is equal but > that wasn't the case. Since no functional changes were necessary to support > casting between these types I tried the following: > ```#include > > #define N 128 > > typedef float float32_t; > typedef double float64_t; > > typedef float32_t gnu_float32_t __attribute__((vector_size(N/8))); > typedef float64_t gnu_float64_t __attribute__((vector_size(N/8))); > > gnu_float32_t foo(gnu_float64_t x) { return (gnu_float32_t)x; } > gnu_float64_t bar(gnu_float32_t x) { return (gnu_float64_t)x; }``` > > It seems Clang considers this implicit cast valid whereas GCC doesn't, even > with lax vector conversions enabled. I pasted the wrong example, the explicit cast shouldn't be there: ```#include #define N 128 typedef float float32_t; typedef double float64_t; typedef float32_t gnu_float32_t __attribute__((vector_size(N/8))); typedef float64_t gnu_float64_t __attribute__((vector_size(N/8))); gnu_float32_t foo(gnu_float64_t x) { return x; } gnu_float64_t bar(gnu_float32_t x) { return x; }``` CHANGES SINCE LAST ACTION https://reviews.llvm.org/D87607/new/ https://reviews.llvm.org/D87607 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D87607: [clang][aarch64] Support implicit casts between GNU and SVE vectors
c-rhodes added inline comments. Comment at: clang/test/Sema/attr-arm-sve-vector-bits.c:233-234 +svint64_t to_svint64_t__from_gnu_int32_t(gnu_int32_t x) { return x; } // expected-error-re {{returning 'gnu_int32_t' (vector of {{[0-9]+}} 'int32_t' values) from a function with incompatible result type 'svint64_t' (aka '__SVInt64_t')}} +gnu_int32_t from_svint64_t__to_gnu_int32_t(svint64_t x) { return x; } // expected-error-re {{returning 'svint64_t' (aka '__SVInt64_t') from a function with incompatible result type 'gnu_int32_t' (vector of {{[0-9]+}} 'int32_t' values)}} + I expected similar diagnostics when casting between GNU and fixed-length SVE vectors where the element type doesn't match but the vector size is equal but that wasn't the case. Since no functional changes were necessary to support casting between these types I tried the following: ```#include #define N 128 typedef float float32_t; typedef double float64_t; typedef float32_t gnu_float32_t __attribute__((vector_size(N/8))); typedef float64_t gnu_float64_t __attribute__((vector_size(N/8))); gnu_float32_t foo(gnu_float64_t x) { return (gnu_float32_t)x; } gnu_float64_t bar(gnu_float32_t x) { return (gnu_float64_t)x; }``` It seems Clang considers this implicit cast valid whereas GCC doesn't, even with lax vector conversions enabled. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D87607/new/ https://reviews.llvm.org/D87607 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D87607: [clang][aarch64] Support implicit casts between GNU and SVE vectors
c-rhodes updated this revision to Diff 291891. c-rhodes edited the summary of this revision. c-rhodes added a comment. Added tests for implicit casts between GNU and fixed-length SVE vectors. I was planning to create a separate patch for this but since it's only tests and no functional changes I've included it in this patch. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D87607/new/ https://reviews.llvm.org/D87607 Files: clang/lib/AST/ASTContext.cpp clang/test/CodeGen/attr-arm-sve-vector-bits-cast.c clang/test/Sema/attr-arm-sve-vector-bits.c clang/test/SemaCXX/attr-arm-sve-vector-bits.cpp Index: clang/test/SemaCXX/attr-arm-sve-vector-bits.cpp === --- clang/test/SemaCXX/attr-arm-sve-vector-bits.cpp +++ clang/test/SemaCXX/attr-arm-sve-vector-bits.cpp @@ -1,14 +1,26 @@ -// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -fsyntax-only -verify -std=c++11 -msve-vector-bits=512 -fallow-half-arguments-and-returns %s +// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -ffreestanding -fsyntax-only -verify -std=c++11 -msve-vector-bits=512 -fallow-half-arguments-and-returns %s // expected-no-diagnostics +#include + #define N __ARM_FEATURE_SVE_BITS typedef __SVInt8_t svint8_t; typedef svint8_t fixed_int8_t __attribute__((arm_sve_vector_bits(N))); +typedef int8_t gnu_int8_t __attribute__((vector_size(N / 8))); template struct S { T var; }; S s; +// Test implicit casts between VLA and VLS vectors svint8_t to_svint8_t(fixed_int8_t x) { return x; } fixed_int8_t from_svint8_t(svint8_t x) { return x; } + +// Test implicit casts between GNU and VLA vectors +svint8_t to_svint8_t__from_gnu_int8_t(gnu_int8_t x) { return x; } +gnu_int8_t from_svint8_t__to_gnu_int8_t(svint8_t x) { return x; } + +// Test implicit casts between GNU and VLS vectors +fixed_int8_t to_fixed_int8_t__from_gnu_int8_t(gnu_int8_t x) { return x; } +gnu_int8_t from_fixed_int8_t__to_gnu_int8_t(fixed_int8_t x) { return x; } Index: clang/test/Sema/attr-arm-sve-vector-bits.c === --- clang/test/Sema/attr-arm-sve-vector-bits.c +++ clang/test/Sema/attr-arm-sve-vector-bits.c @@ -1,11 +1,16 @@ -// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -fsyntax-only -verify -msve-vector-bits=128 -fallow-half-arguments-and-returns %s -// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -fsyntax-only -verify -msve-vector-bits=256 -fallow-half-arguments-and-returns %s -// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -fsyntax-only -verify -msve-vector-bits=512 -fallow-half-arguments-and-returns %s -// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -fsyntax-only -verify -msve-vector-bits=1024 -fallow-half-arguments-and-returns %s -// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -fsyntax-only -verify -msve-vector-bits=2048 -fallow-half-arguments-and-returns %s +// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -ffreestanding -fsyntax-only -verify -msve-vector-bits=128 -fallow-half-arguments-and-returns %s +// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -ffreestanding -fsyntax-only -verify -msve-vector-bits=256 -fallow-half-arguments-and-returns %s +// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -ffreestanding -fsyntax-only -verify -msve-vector-bits=512 -fallow-half-arguments-and-returns %s +// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -ffreestanding -fsyntax-only -verify -msve-vector-bits=1024 -fallow-half-arguments-and-returns %s +// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -ffreestanding -fsyntax-only -verify -msve-vector-bits=2048 -fallow-half-arguments-and-returns %s + +#include #define N __ARM_FEATURE_SVE_BITS +typedef __fp16 float16_t; +typedef float float32_t; +typedef double float64_t; typedef __SVInt8_t svint8_t; typedef __SVInt16_t svint16_t; typedef __SVInt32_t svint32_t; @@ -19,6 +24,7 @@ typedef __SVFloat64_t svfloat64_t; #if defined(__ARM_FEATURE_SVE_BF16) +typedef __bf16 bfloat16_t; typedef __SVBFloat16_t svbfloat16_t; #endif @@ -43,6 +49,23 @@ typedef svbool_t fixed_bool_t __attribute__((arm_sve_vector_bits(N))); +// GNU vector types +typedef int8_t gnu_int8_t __attribute__((vector_size(N / 8))); +typedef int16_t gnu_int16_t __attribute__((vector_size(N / 8))); +typedef int32_t gnu_int32_t __attribute__((vector_size(N / 8))); +typedef int64_t gnu_int64_t __attribute__((vector_size(N / 8))); + +typedef uint8_t gnu_uint8_t __attribute__((vector_size(N / 8)));
[PATCH] D87607: [clang][aarch64] Support implicit casts between GNU and SVE vectors
c-rhodes added inline comments. Comment at: clang/lib/AST/ASTContext.cpp:8522 + return VT->getElementType().getCanonicalType() == + getBuiltinVectorTypeInfo(BT).ElementType; } efriedma wrote: > We allow casting SVE fixed-width vectors only if the element type is > identical, but we allow casting to GNU fixed-width vectors if the vector > width is the same? That seems sort of loose; could allow weird casts, > particularly when bool vectors are involved. > We allow casting SVE fixed-width vectors only if the element type is > identical, but we allow casting to GNU fixed-width vectors if the vector > width is the same? That seems sort of loose; could allow weird casts, > particularly when bool vectors are involved. Fixed-length SVE vectors are created with the attribute and the vector width must match `-msve-vector-bits`, which should guarantee consistent vector widths for a given input. This is checking the vector width is the same and the element type matches when casting between GNU and SVE vectors, although since neither of those types are created by the attribute it's necessary to check the vector width to validate `__ARM_FEATURE_SVE_BITS==N`. Predicates are treated differently in the ACLE and it doesn't mention supporting casts between GNU bool vectors and SVE VLS/VLA predicates. I'm also not sure the GNU vector_size extension is defined for bool elements yet, but I did notice Simon Moll is working on this (D81083). Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D87607/new/ https://reviews.llvm.org/D87607 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D87607: [clang][aarch64] Support implicit casts between GNU and SVE vectors
efriedma added inline comments. Comment at: clang/lib/AST/ASTContext.cpp:8522 + return VT->getElementType().getCanonicalType() == + getBuiltinVectorTypeInfo(BT).ElementType; } We allow casting SVE fixed-width vectors only if the element type is identical, but we allow casting to GNU fixed-width vectors if the vector width is the same? That seems sort of loose; could allow weird casts, particularly when bool vectors are involved. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D87607/new/ https://reviews.llvm.org/D87607 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D87607: [clang][aarch64] Support implicit casts between GNU and SVE vectors
c-rhodes created this revision. c-rhodes added reviewers: sdesmalen, efriedma, rsandifo-arm. Herald added subscribers: kristof.beyls, tschuett. Herald added a reviewer: rengolin. Herald added a project: clang. c-rhodes requested review of this revision. This patch adds support for implicit casting between GNU vectors and SVE vectors when `__ARM_FEATURE_SVE_BITS==N`, as defined by the Arm C Language Extensions (ACLE, version 00bet5, section 3.7.3.3) for SVE [1]. This behavior makes it possible to use GNU vectors with ACLE functions that operate on VLAT. For example: typedef int8_t vec __attribute__((vector_size(32))); vec f(vec x) { return svasrd_x(svptrue_b8(), x, 1); } The `__ARM_FEATURE_SVE_VECTOR_OPERATORS` feature macro indicates interoperability with the GNU vector extension. This is the first patch providing support for this feature, which once complete will be enabled by the `-msve-vector-bits` flag, as the `__ARM_FEATURE_SVE_BITS` feature currently is. [1] https://developer.arm.com/documentation/100987/latest Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D87607 Files: clang/lib/AST/ASTContext.cpp clang/test/CodeGen/attr-arm-sve-vector-bits-cast.c clang/test/Sema/attr-arm-sve-vector-bits.c clang/test/SemaCXX/attr-arm-sve-vector-bits.cpp Index: clang/test/SemaCXX/attr-arm-sve-vector-bits.cpp === --- clang/test/SemaCXX/attr-arm-sve-vector-bits.cpp +++ clang/test/SemaCXX/attr-arm-sve-vector-bits.cpp @@ -1,10 +1,13 @@ -// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -fsyntax-only -verify -std=c++11 -msve-vector-bits=512 -fallow-half-arguments-and-returns %s +// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -ffreestanding -fsyntax-only -verify -std=c++11 -msve-vector-bits=512 -fallow-half-arguments-and-returns %s // expected-no-diagnostics +#include + #define N __ARM_FEATURE_SVE_BITS typedef __SVInt8_t svint8_t; typedef svint8_t fixed_int8_t __attribute__((arm_sve_vector_bits(N))); +typedef int8_t gnu_int8_t __attribute__((vector_size(N / 8))); template struct S { T var; }; @@ -12,3 +15,6 @@ svint8_t to_svint8_t(fixed_int8_t x) { return x; } fixed_int8_t from_svint8_t(svint8_t x) { return x; } + +svint8_t to_svint8_t__from_gnu_int8_t(gnu_int8_t x) { return x; } +gnu_int8_t from_svint8_t__to_gnu_int8_t(svint8_t x) { return x; } Index: clang/test/Sema/attr-arm-sve-vector-bits.c === --- clang/test/Sema/attr-arm-sve-vector-bits.c +++ clang/test/Sema/attr-arm-sve-vector-bits.c @@ -1,11 +1,16 @@ -// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -fsyntax-only -verify -msve-vector-bits=128 -fallow-half-arguments-and-returns %s -// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -fsyntax-only -verify -msve-vector-bits=256 -fallow-half-arguments-and-returns %s -// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -fsyntax-only -verify -msve-vector-bits=512 -fallow-half-arguments-and-returns %s -// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -fsyntax-only -verify -msve-vector-bits=1024 -fallow-half-arguments-and-returns %s -// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -fsyntax-only -verify -msve-vector-bits=2048 -fallow-half-arguments-and-returns %s +// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -ffreestanding -fsyntax-only -verify -msve-vector-bits=128 -fallow-half-arguments-and-returns %s +// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -ffreestanding -fsyntax-only -verify -msve-vector-bits=256 -fallow-half-arguments-and-returns %s +// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -ffreestanding -fsyntax-only -verify -msve-vector-bits=512 -fallow-half-arguments-and-returns %s +// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -ffreestanding -fsyntax-only -verify -msve-vector-bits=1024 -fallow-half-arguments-and-returns %s +// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -ffreestanding -fsyntax-only -verify -msve-vector-bits=2048 -fallow-half-arguments-and-returns %s + +#include #define N __ARM_FEATURE_SVE_BITS +typedef __fp16 float16_t; +typedef float float32_t; +typedef double float64_t; typedef __SVInt8_t svint8_t; typedef __SVInt16_t svint16_t; typedef __SVInt32_t svint32_t; @@ -19,6 +24,7 @@ typedef __SVFloat64_t svfloat64_t; #if defined(__ARM_FEATURE_SVE_BF16) +typedef __bf16 bfloat16_t; typedef __SVBFloat16_t svbfloat16_t; #endif @@ -43,6 +49,23 @@ typedef svbool_t fixed_bool_t