Author: scanon
Date: Mon Sep 14 19:21:56 2015
New Revision: 247643

URL: http://llvm.org/viewvc/llvm-project?rev=247643&view=rev
Log:
Prevent implicit re-interpret casts between ExtVector and Scalar types.

Previously, in certain cases lax vector conversions could occur between scalar 
floating-point values and ExtVector types; these conversions would be simple 
bitcasts.  We need to allow them with other vector types to support some common 
headers, but we don't need them for ExtVector.  Preventing them here makes them 
behave like other operations involving scalars and ExtVectors.

Added:
    cfe/trunk/test/Sema/ext_vector_conversions.c
Modified:
    cfe/trunk/lib/Sema/SemaExpr.cpp

Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=247643&r1=247642&r2=247643&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Mon Sep 14 19:21:56 2015
@@ -5562,6 +5562,14 @@ static bool breakDownVectorType(QualType
 /// vector nor a real type.
 bool Sema::areLaxCompatibleVectorTypes(QualType srcTy, QualType destTy) {
   assert(destTy->isVectorType() || srcTy->isVectorType());
+  
+  // Disallow lax conversions between scalars and ExtVectors (these
+  // conversions are allowed for other vector types because common headers
+  // depend on them).  Most scalar OP ExtVector cases are handled by the
+  // splat path anyway, which does what we want (convert, not bitcast).
+  // What this rules out for ExtVectors is crazy things like char4*float.
+  if (srcTy->isScalarType() && destTy->isExtVectorType()) return false;
+  if (destTy->isScalarType() && srcTy->isExtVectorType()) return false;
 
   uint64_t srcLen, destLen;
   QualType srcElt, destElt;

Added: cfe/trunk/test/Sema/ext_vector_conversions.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/ext_vector_conversions.c?rev=247643&view=auto
==============================================================================
--- cfe/trunk/test/Sema/ext_vector_conversions.c (added)
+++ cfe/trunk/test/Sema/ext_vector_conversions.c Mon Sep 14 19:21:56 2015
@@ -0,0 +1,19 @@
+// RUN: %clang_cc1 -triple x86_64-apple-macos10.7.0 -fsyntax-only -verify 
-Wconversion %s
+
+typedef __attribute__((ext_vector_type(4))) char char4;
+typedef __attribute__((ext_vector_type(4))) short short4;
+typedef __attribute__((ext_vector_type(1))) float float1;
+
+static void test() {
+  char4 vc4;
+  float f;
+  // Not allowed.  There's no splatting conversion between float and int 
vector,
+  // and we don't want to bitcast f to vector-of-char (as would happen with the
+  // old-style vector types).
+  vc4 += f; // expected-error {{cannot convert between vector values of 
different size}}
+  short4 vs4;
+  long long ll;
+  // This one is OK; we don't re-interpret ll as short4, rather we splat its
+  // value, which should produce a warning about clamping.
+  vs4 += ll; // expected-warning {{implicit conversion loses integer 
precision}}
+}


_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to