diff options
author | George Burgess IV <george.burgess.iv@gmail.com> | 2016-01-28 01:38:18 +0000 |
---|---|---|
committer | George Burgess IV <george.burgess.iv@gmail.com> | 2016-01-28 01:38:18 +0000 |
commit | a2f29fa694214e622ea21e6c5b541d406970bf4f (patch) | |
tree | 246c67ca0ed6d2e801897ab1d4dfdc0e9349e94a | |
parent | 502ff66967c754205c10a7ecc508b0923e33442e (diff) | |
download | bcm5719-llvm-a2f29fa694214e622ea21e6c5b541d406970bf4f.tar.gz bcm5719-llvm-a2f29fa694214e622ea21e6c5b541d406970bf4f.zip |
[Sema] Make extended vectors of `bool` an error.
In OpenCL, `bool` vectors are a reserved type, and are therefore
illegal.
Outside of OpenCL, if we try to make an extended vector of N `bool`s,
Clang will lower it to an `[N x i1]`. LLVM has no ABI for bitvectors, so
lots of operations on such vectors are thoroughly broken. As a result,
this patch makes them illegal in everything else, as well. :)
Differential Revision: http://reviews.llvm.org/D15721
llvm-svn: 259011
-rw-r--r-- | clang/lib/Sema/SemaType.cpp | 14 | ||||
-rw-r--r-- | clang/test/CodeGen/convertvector.c | 22 | ||||
-rw-r--r-- | clang/test/Sema/ext_vector_casts.c | 2 | ||||
-rw-r--r-- | clang/test/SemaOpenCL/bool-vectors.cl | 3 |
4 files changed, 15 insertions, 26 deletions
diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 91a26a4371a..c51255c934d 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -2183,10 +2183,16 @@ QualType Sema::BuildArrayType(QualType T, ArrayType::ArraySizeModifier ASM, /// Run the required checks for the extended vector type. QualType Sema::BuildExtVectorType(QualType T, Expr *ArraySize, SourceLocation AttrLoc) { - // unlike gcc's vector_size attribute, we do not allow vectors to be defined + // Unlike gcc's vector_size attribute, we do not allow vectors to be defined // in conjunction with complex types (pointers, arrays, functions, etc.). - if (!T->isDependentType() && - !T->isIntegerType() && !T->isRealFloatingType()) { + // + // Additionally, OpenCL prohibits vectors of booleans (they're considered a + // reserved data type under OpenCL v2.0 s6.1.4), we don't support selects + // on bitvectors, and we have no well-defined ABI for bitvectors, so vectors + // of bool aren't allowed. + if ((!T->isDependentType() && !T->isIntegerType() && + !T->isRealFloatingType()) || + T->isBooleanType()) { Diag(AttrLoc, diag::err_attribute_invalid_vector_type) << T; return QualType(); } @@ -2200,7 +2206,7 @@ QualType Sema::BuildExtVectorType(QualType T, Expr *ArraySize, return QualType(); } - // unlike gcc's vector_size attribute, the size is specified as the + // Unlike gcc's vector_size attribute, the size is specified as the // number of elements, not the number of bytes. unsigned vectorSize = static_cast<unsigned>(vecSize.getZExtValue()); diff --git a/clang/test/CodeGen/convertvector.c b/clang/test/CodeGen/convertvector.c index 2b23dd96e1b..a534b85a423 100644 --- a/clang/test/CodeGen/convertvector.c +++ b/clang/test/CodeGen/convertvector.c @@ -9,14 +9,6 @@ typedef unsigned long vector8ulong __attribute__((__vector_size__(64))); typedef unsigned short vector8ushort __attribute__((__vector_size__(16))); #ifdef __cplusplus -#define BOOL bool -#else -#define BOOL _Bool -#endif - -typedef BOOL vector8bool __attribute__((__ext_vector_type__(8))); - -#ifdef __cplusplus extern "C" { #endif @@ -32,13 +24,6 @@ vector8double flt_ext(vector8float x) { // CHECK: fpext <8 x float> %{{[^ ]}} to <8 x double> } -vector8bool flt_tobool(vector8float x) { - return __builtin_convertvector(x, vector8bool); - // CHECK-LABEL: @flt_tobool - // CHECK-NOT: fptoui <8 x float> %{{[^ ]}} to <8 x i1> - // CHECK: fcmp une <8 x float> %{{[^ ]}}, zeroinitializer -} - vector8long flt_tosi(vector8float x) { return __builtin_convertvector(x, vector8long); // CHECK-LABEL: @flt_tosi @@ -69,13 +54,6 @@ vector8long int_sext(vector8short x) { // CHECK: sext <8 x i16> %{{[^ ]}} to <8 x i64> } -vector8bool int_tobool(vector8short x) { - return __builtin_convertvector(x, vector8bool); - // CHECK-LABEL: @int_tobool - // CHECK-NOT: trunc <8 x i16> %{{[^ ]}} to <8 x i1> - // CHECK: icmp ne <8 x i16> %{{[^ ]}}, zeroinitializer -} - vector8float int_tofp(vector8short x) { return __builtin_convertvector(x, vector8float); // CHECK-LABEL: @int_tofp diff --git a/clang/test/Sema/ext_vector_casts.c b/clang/test/Sema/ext_vector_casts.c index 924013aeb29..6aaedbe7fd1 100644 --- a/clang/test/Sema/ext_vector_casts.c +++ b/clang/test/Sema/ext_vector_casts.c @@ -1,5 +1,7 @@ // RUN: %clang_cc1 -triple x86_64-apple-macos10.7.0 -fsyntax-only -verify -fno-lax-vector-conversions -Wconversion %s +typedef __attribute__((ext_vector_type(8))) _Bool BoolVector; // expected-error {{invalid vector element type '_Bool'}} + typedef __attribute__(( ext_vector_type(2) )) float float2; typedef __attribute__(( ext_vector_type(3) )) float float3; typedef __attribute__(( ext_vector_type(4) )) int int4; diff --git a/clang/test/SemaOpenCL/bool-vectors.cl b/clang/test/SemaOpenCL/bool-vectors.cl new file mode 100644 index 00000000000..6df4d565300 --- /dev/null +++ b/clang/test/SemaOpenCL/bool-vectors.cl @@ -0,0 +1,3 @@ +// RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only + +typedef __attribute__((ext_vector_type(16))) _Bool bool8; // expected-error{{invalid vector element type 'bool'}} |