]> granicus.if.org Git - clang/commitdiff
reimplement vector comparisons as [fi]cmp+sext instead of using v[if]cmp.
authorChris Lattner <sabre@nondot.org>
Wed, 8 Jul 2009 01:08:03 +0000 (01:08 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 8 Jul 2009 01:08:03 +0000 (01:08 +0000)
Also, enable them in sema so that they are tested, and now that the x86 backend
has stablized.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@74983 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGExprScalar.cpp
lib/Sema/SemaExpr.cpp
test/CodeGen/ext-vector.c
test/Sema/exprs.c

index 2af0639f5ce38a628535dd528af991dc5801c390..161cd5741806056e4c789b36d15d4e68a227d449 100644 (file)
@@ -49,7 +49,6 @@ class VISIBILITY_HIDDEN ScalarExprEmitter
   CodeGenFunction &CGF;
   CGBuilderTy &Builder;
   bool IgnoreResultAssign;
-
 public:
 
   ScalarExprEmitter(CodeGenFunction &cgf, bool ira=false)
@@ -61,8 +60,10 @@ public:
   //===--------------------------------------------------------------------===//
 
   bool TestAndClearIgnoreResultAssign() {
-    bool I = IgnoreResultAssign; IgnoreResultAssign = false;
-    return I; }
+    bool I = IgnoreResultAssign;
+    IgnoreResultAssign = false;
+    return I;
+  }
 
   const llvm::Type *ConvertType(QualType T) { return CGF.ConvertType(T); }
   LValue EmitLValue(const Expr *E) { return CGF.EmitLValue(E); }
@@ -1181,7 +1182,7 @@ Value *ScalarExprEmitter::EmitCompare(const BinaryOperator *E,unsigned UICmpOpc,
   TestAndClearIgnoreResultAssign();
   Value *Result;
   QualType LHSTy = E->getLHS()->getType();
-  if (!LHSTy->isAnyComplexType() && !LHSTy->isVectorType()) {
+  if (!LHSTy->isAnyComplexType()) {
     Value *LHS = Visit(E->getLHS());
     Value *RHS = Visit(E->getRHS());
     
@@ -1196,22 +1197,12 @@ Value *ScalarExprEmitter::EmitCompare(const BinaryOperator *E,unsigned UICmpOpc,
       Result = Builder.CreateICmp((llvm::ICmpInst::Predicate)UICmpOpc,
                                   LHS, RHS, "cmp");
     }
-  } else if (LHSTy->isVectorType()) {
-    Value *LHS = Visit(E->getLHS());
-    Value *RHS = Visit(E->getRHS());
+
+    // If this is a vector comparison, sign extend the result to the appropriate
+    // vector integer type and return it (don't convert to bool).
+    if (LHSTy->isVectorType())
+      return Builder.CreateSExt(Result, ConvertType(E->getType()), "sext");
     
-    if (LHS->getType()->isFPOrFPVector()) {
-      Result = Builder.CreateVFCmp((llvm::CmpInst::Predicate)FCmpOpc,
-                                  LHS, RHS, "cmp");
-    } else if (LHSTy->isUnsignedIntegerType()) {
-      Result = Builder.CreateVICmp((llvm::CmpInst::Predicate)UICmpOpc,
-                                  LHS, RHS, "cmp");
-    } else {
-      // Signed integers and pointers.
-      Result = Builder.CreateVICmp((llvm::CmpInst::Predicate)SICmpOpc,
-                                  LHS, RHS, "cmp");
-    }
-    return Result;
   } else {
     // Complex Comparison: can only be an equality comparison.
     CodeGenFunction::ComplexPairTy LHS = CGF.EmitComplexExpr(E->getLHS());
index 97aae8b967973bd9db70ded016e910172abd4a81..2bb49d5400f8a720b042412ff0eadfd3587e94ee 100644 (file)
@@ -4305,14 +4305,6 @@ QualType Sema::CheckVectorCompareOperands(Expr *&lex, Expr *&rex,
     CheckFloatComparison(Loc,lex,rex);
   }
 
-  // FIXME: Vector compare support in the LLVM backend is not fully reliable,
-  // just reject all vector comparisons for now.
-  if (1) {
-    Diag(Loc, diag::err_typecheck_vector_comparison)
-      << lType << rType << lex->getSourceRange() << rex->getSourceRange();
-    return QualType();
-  }
-
   // Return the type for the comparison, which is the same as vector type for
   // integer vectors, or an integer type of identical size and number of
   // elements for floating point vectors.
index e3b6211ee9915f110a683bdc93dabeddb609dda0..4739a661cc04a28f2803afb0b980cc2a6750d9da 100644 (file)
@@ -115,9 +115,7 @@ void test7(int4 *ap, int4 *bp, int c) {
   a /= c;
   a %= c;
 
-  // Vector comparisons can sometimes crash the x86 backend: rdar://6326239,
-  // reject them until the implementation is stable.
-#if 0
+  // Vector comparisons.
   int4 cmp;
   cmp = a < b;
   cmp = a <= b;
@@ -125,5 +123,4 @@ void test7(int4 *ap, int4 *bp, int c) {
   cmp = a >= b;
   cmp = a == b;
   cmp = a != b;
-#endif
 }
index 3fd1437da880aa8c30daf8d36bcfd4701092f5f7..faa6c285c60f087a4978658bae48a7aae3755c01 100644 (file)
@@ -94,15 +94,12 @@ void test13(
   P = ^(){}; // expected-error {{blocks support disabled - compile with -fblocks}}
 }
 
-
-// rdar://6326239 - Vector comparisons are not fully trusted yet, until the
-// backend is known to work, just unconditionally reject them.
 void test14() {
   typedef long long __m64 __attribute__((__vector_size__(8)));
   typedef short __v4hi __attribute__((__vector_size__(8)));
 
+  // Ok.
   __v4hi a;
-  __m64 mask = (__m64)((__v4hi)a >  // expected-error {{comparison of vector types ('__v4hi' and '__v4hi') not supported yet}}
-                      (__v4hi)a);
+  __m64 mask = (__m64)((__v4hi)a > (__v4hi)a);
 }