reimplement vector comparisons as [fi]cmp+sext instead of using v[if]cmp.

Also, enable them in sema so that they are tested, and now that the x86 backend
has stablized.

llvm-svn: 74983
This commit is contained in:
Chris Lattner 2009-07-08 01:08:03 +00:00
parent d41531a2c0
commit 2a7deb64c0
4 changed files with 13 additions and 36 deletions

View File

@ -49,7 +49,6 @@ class VISIBILITY_HIDDEN ScalarExprEmitter
CodeGenFunction &CGF; CodeGenFunction &CGF;
CGBuilderTy &Builder; CGBuilderTy &Builder;
bool IgnoreResultAssign; bool IgnoreResultAssign;
public: public:
ScalarExprEmitter(CodeGenFunction &cgf, bool ira=false) ScalarExprEmitter(CodeGenFunction &cgf, bool ira=false)
@ -61,8 +60,10 @@ public:
//===--------------------------------------------------------------------===// //===--------------------------------------------------------------------===//
bool TestAndClearIgnoreResultAssign() { bool TestAndClearIgnoreResultAssign() {
bool I = IgnoreResultAssign; IgnoreResultAssign = false; bool I = IgnoreResultAssign;
return I; } IgnoreResultAssign = false;
return I;
}
const llvm::Type *ConvertType(QualType T) { return CGF.ConvertType(T); } const llvm::Type *ConvertType(QualType T) { return CGF.ConvertType(T); }
LValue EmitLValue(const Expr *E) { return CGF.EmitLValue(E); } LValue EmitLValue(const Expr *E) { return CGF.EmitLValue(E); }
@ -1181,7 +1182,7 @@ Value *ScalarExprEmitter::EmitCompare(const BinaryOperator *E,unsigned UICmpOpc,
TestAndClearIgnoreResultAssign(); TestAndClearIgnoreResultAssign();
Value *Result; Value *Result;
QualType LHSTy = E->getLHS()->getType(); QualType LHSTy = E->getLHS()->getType();
if (!LHSTy->isAnyComplexType() && !LHSTy->isVectorType()) { if (!LHSTy->isAnyComplexType()) {
Value *LHS = Visit(E->getLHS()); Value *LHS = Visit(E->getLHS());
Value *RHS = Visit(E->getRHS()); Value *RHS = Visit(E->getRHS());
@ -1196,22 +1197,12 @@ Value *ScalarExprEmitter::EmitCompare(const BinaryOperator *E,unsigned UICmpOpc,
Result = Builder.CreateICmp((llvm::ICmpInst::Predicate)UICmpOpc, Result = Builder.CreateICmp((llvm::ICmpInst::Predicate)UICmpOpc,
LHS, RHS, "cmp"); LHS, RHS, "cmp");
} }
} else if (LHSTy->isVectorType()) {
Value *LHS = Visit(E->getLHS()); // If this is a vector comparison, sign extend the result to the appropriate
Value *RHS = Visit(E->getRHS()); // 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 { } else {
// Complex Comparison: can only be an equality comparison. // Complex Comparison: can only be an equality comparison.
CodeGenFunction::ComplexPairTy LHS = CGF.EmitComplexExpr(E->getLHS()); CodeGenFunction::ComplexPairTy LHS = CGF.EmitComplexExpr(E->getLHS());

View File

@ -4305,14 +4305,6 @@ QualType Sema::CheckVectorCompareOperands(Expr *&lex, Expr *&rex,
CheckFloatComparison(Loc,lex,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 // 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 // integer vectors, or an integer type of identical size and number of
// elements for floating point vectors. // elements for floating point vectors.

View File

@ -115,9 +115,7 @@ void test7(int4 *ap, int4 *bp, int c) {
a /= c; a /= c;
a %= c; a %= c;
// Vector comparisons can sometimes crash the x86 backend: rdar://6326239, // Vector comparisons.
// reject them until the implementation is stable.
#if 0
int4 cmp; int4 cmp;
cmp = a < b; cmp = a < b;
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; cmp = a == b;
cmp = a != b; cmp = a != b;
#endif
} }

View File

@ -94,15 +94,12 @@ void test13(
P = ^(){}; // expected-error {{blocks support disabled - compile with -fblocks}} 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() { void test14() {
typedef long long __m64 __attribute__((__vector_size__(8))); typedef long long __m64 __attribute__((__vector_size__(8)));
typedef short __v4hi __attribute__((__vector_size__(8))); typedef short __v4hi __attribute__((__vector_size__(8)));
// Ok.
__v4hi a; __v4hi a;
__m64 mask = (__m64)((__v4hi)a > // expected-error {{comparison of vector types ('__v4hi' and '__v4hi') not supported yet}} __m64 mask = (__m64)((__v4hi)a > (__v4hi)a);
(__v4hi)a);
} }