r198474 - [Sema] When checking if a bitcast is appropriate between vector types, take into
Argyrios Kyrtzidis
akyrtzi at gmail.com
Fri Jan 3 19:31:22 PST 2014
Author: akirtzidis
Date: Fri Jan 3 21:31:22 2014
New Revision: 198474
URL: http://llvm.org/viewvc/llvm-project?rev=198474&view=rev
Log:
[Sema] When checking if a bitcast is appropriate between vector types, take into
consideration the num-of-elements*width-of-element width.
Disallow casts when such width is not equal between the vector types otherwise
we may end up with an invalid LLVM bitcast.
rdar://15722308.
Modified:
cfe/trunk/lib/Sema/SemaExpr.cpp
cfe/trunk/test/Sema/ext_vector_casts.c
Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=198474&r1=198473&r2=198474&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Fri Jan 3 21:31:22 2014
@@ -6612,6 +6612,42 @@ QualType Sema::InvalidOperands(SourceLoc
return QualType();
}
+static bool areVectorOperandsLaxBitCastable(ASTContext &Ctx,
+ QualType LHSType, QualType RHSType){
+ if (!Ctx.getLangOpts().LaxVectorConversions)
+ return false;
+
+ unsigned LHSSize = Ctx.getTypeSize(LHSType);
+ unsigned RHSSize = Ctx.getTypeSize(RHSType);
+ if (LHSSize != RHSSize)
+ return false;
+
+ // For a non-power-of-2 vector ASTContext::getTypeSize returns the size
+ // rounded to the next power-of-2, but the LLVM IR type that we create
+ // is considered to have num-of-elements*width-of-element width.
+ // Make sure such width is the same between the types, otherwise we may end
+ // up with an invalid bitcast.
+ unsigned LHSIRSize, RHSIRSize;
+ if (LHSType->isVectorType()) {
+ const VectorType *Vec = LHSType->getAs<VectorType>();
+ LHSIRSize = Vec->getNumElements() *
+ Ctx.getTypeSize(Vec->getElementType());
+ } else {
+ LHSIRSize = LHSSize;
+ }
+ if (RHSType->isVectorType()) {
+ const VectorType *Vec = RHSType->getAs<VectorType>();
+ RHSIRSize = Vec->getNumElements() *
+ Ctx.getTypeSize(Vec->getElementType());
+ } else {
+ RHSIRSize = RHSSize;
+ }
+ if (LHSIRSize != RHSIRSize)
+ return false;
+
+ return true;
+}
+
QualType Sema::CheckVectorOperands(ExprResult &LHS, ExprResult &RHS,
SourceLocation Loc, bool IsCompAssign) {
if (!IsCompAssign) {
@@ -6647,8 +6683,7 @@ QualType Sema::CheckVectorOperands(ExprR
return RHSType;
}
- if (getLangOpts().LaxVectorConversions &&
- Context.getTypeSize(LHSType) == Context.getTypeSize(RHSType)) {
+ if (areVectorOperandsLaxBitCastable(Context, LHSType, RHSType)) {
// If we are allowing lax vector conversions, and LHS and RHS are both
// vectors, the total size only needs to be the same. This is a
// bitcast; no bits are changed but the result type is different.
Modified: cfe/trunk/test/Sema/ext_vector_casts.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/ext_vector_casts.c?rev=198474&r1=198473&r2=198474&view=diff
==============================================================================
--- cfe/trunk/test/Sema/ext_vector_casts.c (original)
+++ cfe/trunk/test/Sema/ext_vector_casts.c Fri Jan 3 21:31:22 2014
@@ -1,6 +1,7 @@
// RUN: %clang_cc1 -triple x86_64-apple-macos10.7.0 -fsyntax-only -verify -fno-lax-vector-conversions %s
typedef __attribute__(( ext_vector_type(2) )) float float2;
+typedef __attribute__(( ext_vector_type(3) )) float float3;
typedef __attribute__(( ext_vector_type(4) )) int int4;
typedef __attribute__(( ext_vector_type(8) )) short short8;
typedef __attribute__(( ext_vector_type(4) )) float float4;
@@ -11,12 +12,15 @@ typedef size_t stride4 __attribute__((ex
static void test() {
float2 vec2;
+ float3 vec3;
float4 vec4, vec4_2;
int4 ivec4;
short8 ish8;
t3 vec4_3;
int *ptr;
int i;
+
+ vec3 += vec2; // expected-error {{can't convert between vector values of different size}}
vec4 = 5.0f;
vec4 = (float4)5.0f;
More information about the cfe-commits
mailing list