[clang] abca3b7 - Revert "[clang] Implement VectorType logic not operator."

Nico Weber via cfe-commits cfe-commits at lists.llvm.org
Mon Jun 8 03:46:10 PDT 2020


Author: Nico Weber
Date: 2020-06-08T06:45:21-04:00
New Revision: abca3b7b2ce539ce22c9d3ebdd3cb6c02bb4c009

URL: https://github.com/llvm/llvm-project/commit/abca3b7b2ce539ce22c9d3ebdd3cb6c02bb4c009
DIFF: https://github.com/llvm/llvm-project/commit/abca3b7b2ce539ce22c9d3ebdd3cb6c02bb4c009.diff

LOG: Revert "[clang] Implement VectorType logic not operator."

This reverts commit a0de3335edcf19305dad592d21ebe402825184f6.
Breaks check-clang on Windows, see e.g.
https://reviews.llvm.org/D80979#2078750 (but fails on all
other Windows bots too).

Added: 
    

Modified: 
    clang/docs/LanguageExtensions.rst
    clang/lib/CodeGen/CGExprScalar.cpp
    clang/lib/Sema/SemaExpr.cpp
    clang/test/Sema/vector-gcc-compat.cpp

Removed: 
    clang/test/CodeGen/vector-logic-not.cpp


################################################################################
diff  --git a/clang/docs/LanguageExtensions.rst b/clang/docs/LanguageExtensions.rst
index 06ecc186c7dc..ba0a7d9cf95c 100644
--- a/clang/docs/LanguageExtensions.rst
+++ b/clang/docs/LanguageExtensions.rst
@@ -475,7 +475,7 @@ unary operators +, --            yes     yes       yes         --
 +,--,*,/,%                       yes     yes       yes         --
 bitwise operators &,|,^,~        yes     yes       yes         --
 >>,<<                            yes     yes       yes         --
-!, &&, ||                        yes     --        yes         --
+!, &&, ||                        yes     --        yes [#]_    --
 ==, !=, >, <, >=, <=             yes     yes       yes         --
 =                                yes     yes       yes         yes
 ?: [#]_                          yes     --        yes         --
@@ -488,6 +488,7 @@ const_cast                       no      no        no          no
 
 See also :ref:`langext-__builtin_shufflevector`, :ref:`langext-__builtin_convertvector`.
 
+.. [#] unary operator ! is not implemented, however && and || are.
 .. [#] ternary operator(?:) has 
diff erent 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).

diff  --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp
index b2bc38b329ef..4e61349cf4d5 100644
--- a/clang/lib/CodeGen/CGExprScalar.cpp
+++ b/clang/lib/CodeGen/CGExprScalar.cpp
@@ -2762,9 +2762,7 @@ Value *ScalarExprEmitter::VisitUnaryNot(const UnaryOperator *E) {
 
 Value *ScalarExprEmitter::VisitUnaryLNot(const UnaryOperator *E) {
   // Perform vector logical not on comparison with zero vector.
-  if (E->getType()->isVectorType() &&
-      E->getType()->castAs<VectorType>()->getVectorKind() ==
-          VectorType::GenericVector) {
+  if (E->getType()->isExtVectorType()) {
     Value *Oper = Visit(E->getSubExpr());
     Value *Zero = llvm::Constant::getNullValue(Oper->getType());
     Value *Result;

diff  --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 4bec413f3042..45c1acecbe94 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -14481,19 +14481,12 @@ ExprResult Sema::CreateBuiltinUnaryOp(SourceLocation OpLoc,
           return ExprError(Diag(OpLoc, diag::err_typecheck_unary_expr)
                            << resultType << Input.get()->getSourceRange());
       }
-      // Vector logical not returns the signed variant of the operand type.
-      resultType = GetSignedVectorType(resultType);
-      break;
-    } else if (Context.getLangOpts().CPlusPlus && resultType->isVectorType()) {
-      const VectorType *VTy = resultType->castAs<VectorType>();
-      if (VTy->getVectorKind() != VectorType::GenericVector)
-        return ExprError(Diag(OpLoc, diag::err_typecheck_unary_expr)
-                         << resultType << Input.get()->getSourceRange());
-
       // Vector logical not returns the signed variant of the operand type.
       resultType = GetSignedVectorType(resultType);
       break;
     } else {
+      // FIXME: GCC's vector extension permits the usage of '!' with a vector
+      //        type in C++. We should allow that here too.
       return ExprError(Diag(OpLoc, diag::err_typecheck_unary_expr)
         << resultType << Input.get()->getSourceRange());
     }

diff  --git a/clang/test/CodeGen/vector-logic-not.cpp b/clang/test/CodeGen/vector-logic-not.cpp
deleted file mode 100644
index 2ac026711e82..000000000000
--- a/clang/test/CodeGen/vector-logic-not.cpp
+++ /dev/null
@@ -1,21 +0,0 @@
-// RUN: %clang_cc1 -emit-llvm %s -o - | FileCheck %s
-
-typedef __attribute__((__vector_size__(16))) float float4;
-typedef __attribute__((__vector_size__(16))) int int4;
-typedef __attribute__((__vector_size__(16))) unsigned int uint4;
-
-// CHECK: @_Z5test1Dv4_j
-int4 test1(uint4 V0) {
-  // CHECK: [[CMP0:%.*]] = icmp eq <4 x i32> [[V0:%.*]], zeroinitializer
-  // CHECK-NEXT: [[V1:%.*]] = sext <4 x i1> [[CMP0]] to <4 x i32>
-  int4 V = !V0;
-  return V;
-}
-
-// CHECK: @_Z5test2Dv4_fS_
-int4 test2(float4 V0, float4 V1) {
-  // CHECK: [[CMP0:%.*]] = fcmp oeq <4 x float> [[V0:%.*]], zeroinitializer
-  // CHECK-NEXT: [[V1:%.*]] = sext <4 x i1> [[CMP0]] to <4 x i32>
-  int4 V = !V0;
-  return V;
-}

diff  --git a/clang/test/Sema/vector-gcc-compat.cpp b/clang/test/Sema/vector-gcc-compat.cpp
index cb6547696814..41d50c168c94 100644
--- a/clang/test/Sema/vector-gcc-compat.cpp
+++ b/clang/test/Sema/vector-gcc-compat.cpp
@@ -83,7 +83,7 @@ void logicTest(void) {
   v2i64 v2i64_c = (v2i64){3, 1}; // expected-warning {{compound literals are a C99-specific feature}}
   v2i64 v2i64_r;
 
-  v2i64_r = !v2i64_a;
+  v2i64_r = !v2i64_a;  // expected-error {{invalid argument type 'v2i64' (vector of 2 'long long' values) to unary expression}}
   v2i64_r = ~v2i64_a;
 
   v2i64_r = v2i64_a ? v2i64_b : v2i64_c;


        


More information about the cfe-commits mailing list