[PATCH] D21700: [SemaExpr] Support lax conversions in assignments with vector and scalars with same size
Bruno Cardoso Lopes via cfe-commits
cfe-commits at lists.llvm.org
Tue Jul 5 16:36:09 PDT 2016
bruno updated this revision to Diff 62802.
bruno added a comment.
Update patch after Reid's suggestions.
http://reviews.llvm.org/D21700
Files:
lib/Sema/SemaExpr.cpp
test/Sema/vector-cast.c
Index: test/Sema/vector-cast.c
===================================================================
--- test/Sema/vector-cast.c
+++ test/Sema/vector-cast.c
@@ -45,15 +45,23 @@
}
typedef float float2 __attribute__ ((vector_size (8)));
+typedef __attribute__((vector_size(8))) double float64x1_t;
+typedef __attribute__((vector_size(16))) double float64x2_t;
+float64x1_t vget_low_f64(float64x2_t __p0);
void f4() {
float2 f2;
- double d;
+ double d, a, b, c;
+ float64x2_t v = {0.0, 1.0};
f2 += d;
- // We used to allow the next statement, but we've always rejected the next two
- // statements
+ a = 3.0 + vget_low_f64(v);
+ b = vget_low_f64(v) + 3.0;
+ c = vget_low_f64(v);
+ // LAX conversions within compound assignments are not supported.
// FIXME: This diagnostic is inaccurate.
d += f2; // expected-error {{cannot convert between vector values of different size}}
+ c -= vget_low_f64(v); // expected-error {{cannot convert between vector values of different size}}
+ // LAX conversions between scalar and vector types require same size and one element sized vectors.
d = f2; // expected-error {{assigning to 'double' from incompatible type 'float2'}}
d = d + f2; // expected-error {{assigning to 'double' from incompatible type 'float2'}}
}
Index: lib/Sema/SemaExpr.cpp
===================================================================
--- lib/Sema/SemaExpr.cpp
+++ lib/Sema/SemaExpr.cpp
@@ -7394,6 +7394,22 @@
return IncompatibleVectors;
}
}
+
+ // When the RHS comes from another lax conversion (e.g. binops between
+ // scalars and vectors) the result is canonicalized as a vector. When the
+ // LHS is also a vector, the lax is allowed by the condition above. Handle
+ // the case where LHS is a scalar.
+ if (LHSType->isScalarType()) {
+ const VectorType *VecType = RHSType->getAs<VectorType>();
+ if (VecType && VecType->getNumElements() == 1 &&
+ isLaxVectorConversion(RHSType, LHSType)) {
+ ExprResult *VecExpr = &RHS;
+ *VecExpr = ImpCastExprToType(VecExpr->get(), LHSType, CK_BitCast);
+ Kind = CK_BitCast;
+ return Compatible;
+ }
+ }
+
return Incompatible;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D21700.62802.patch
Type: text/x-patch
Size: 2216 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160705/ff04b7a9/attachment.bin>
More information about the cfe-commits
mailing list