[PATCH] D80574: [ExtVector] Support ExtVectorType conditional operator
Min-Yih Hsu via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Jun 2 09:53:27 PDT 2020
This revision was automatically updated to reflect the committed changes.
Closed by commit rG4431d64c10cb: Support ExtVectorType conditional operator (authored by myhsu).
Changed prior to commit:
https://reviews.llvm.org/D80574?vs=267277&id=267913#toc
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D80574/new/
https://reviews.llvm.org/D80574
Files:
clang/docs/LanguageExtensions.rst
clang/lib/CodeGen/CGExprScalar.cpp
clang/lib/Sema/SemaExpr.cpp
clang/test/Sema/ext_vector_comparisons.c
Index: clang/test/Sema/ext_vector_comparisons.c
===================================================================
--- clang/test/Sema/ext_vector_comparisons.c
+++ clang/test/Sema/ext_vector_comparisons.c
@@ -28,3 +28,19 @@
return vec > vec; // no-warning
return vec >= vec; // no-warning
}
+
+static int4 test3() {
+ int4 i0, i1;
+
+ return i0 > i1 ? i0 : i1; // no-error
+ return i0 ? i0 : i1; // no-error
+}
+
+static float4 test4() {
+ float4 f0, f1;
+
+ // This would actually generate implicit casting warning
+ // under Weverything flag but we don't really care here
+ return f0 > f1 ? f0 : f1; // no-error
+ return f0 ? f0 : f1; // expected-error {{used type 'float4' (vector of 4 'float' values) where floating point type is not allowed}}
+}
Index: clang/lib/Sema/SemaExpr.cpp
===================================================================
--- clang/lib/Sema/SemaExpr.cpp
+++ clang/lib/Sema/SemaExpr.cpp
@@ -8078,7 +8078,8 @@
// The OpenCL operator with a vector condition is sufficiently
// different to merit its own checker.
- if (getLangOpts().OpenCL && Cond.get()->getType()->isVectorType())
+ if ((getLangOpts().OpenCL && Cond.get()->getType()->isVectorType()) ||
+ Cond.get()->getType()->isExtVectorType())
return OpenCLCheckVectorConditional(*this, Cond, LHS, RHS, QuestionLoc);
// First, check the condition.
Index: clang/lib/CodeGen/CGExprScalar.cpp
===================================================================
--- clang/lib/CodeGen/CGExprScalar.cpp
+++ clang/lib/CodeGen/CGExprScalar.cpp
@@ -4432,8 +4432,8 @@
// OpenCL: If the condition is a vector, we can treat this condition like
// the select function.
- if (CGF.getLangOpts().OpenCL
- && condExpr->getType()->isVectorType()) {
+ if ((CGF.getLangOpts().OpenCL && condExpr->getType()->isVectorType()) ||
+ condExpr->getType()->isExtVectorType()) {
CGF.incrementProfileCounter(E);
llvm::Value *CondV = CGF.EmitScalarExpr(condExpr);
Index: clang/docs/LanguageExtensions.rst
===================================================================
--- clang/docs/LanguageExtensions.rst
+++ clang/docs/LanguageExtensions.rst
@@ -478,7 +478,7 @@
!, &&, || yes -- yes [#]_ --
==, !=, >, <, >=, <= yes yes yes --
= yes yes yes yes
-:? [#]_ yes -- yes --
+?: [#]_ yes -- yes --
sizeof yes yes yes yes
C-style cast yes yes yes no
reinterpret_cast yes no yes no
@@ -489,9 +489,11 @@
See also :ref:`langext-__builtin_shufflevector`, :ref:`langext-__builtin_convertvector`.
.. [#] unary operator ! is not implemented, however && and || are.
-.. [#] While OpenCL and GCC vectors both implement the comparison operator(?:) as a
- 'select', they operate somewhat differently. OpenCL selects based on signedness of
- the condition operands, but GCC vectors use normal bool conversions (that is, != 0).
+.. [#] ternary operator(?:) has different behaviors depending on condition
+ operand's vector type. If the condition is a GNU vector (i.e. __vector_size__),
+ it's only available in C++ and uses normal bool conversions (that is, != 0).
+ If it's an extension (OpenCL) vector, it's only available in C and OpenCL C.
+ And it selects base on signedness of the condition operands (OpenCL v1.1 s6.3.9).
Matrix Types
============
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D80574.267913.patch
Type: text/x-patch
Size: 3618 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200602/0afd6cfa/attachment-0001.bin>
More information about the cfe-commits
mailing list