summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2008-05-29 15:17:49 +0000
committerEli Friedman <eli.friedman@gmail.com>2008-05-29 15:17:49 +0000
commit43a6d51494ad5f3c31cd65a160c4e19d5992413b (patch)
tree23902b6f9dbc6786eaf6cbffa17abb50991ef472 /clang/lib/CodeGen
parent3c28524632243c97fe327b4b7656b0b9a44c86f1 (diff)
downloadbcm5719-llvm-43a6d51494ad5f3c31cd65a160c4e19d5992413b.tar.gz
bcm5719-llvm-43a6d51494ad5f3c31cd65a160c4e19d5992413b.zip
More complete/correct implementation of the comparison operators for
constant expressions. llvm-svn: 51682
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r--clang/lib/CodeGen/CGExprConstant.cpp54
1 files changed, 47 insertions, 7 deletions
diff --git a/clang/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp
index a642fd236d3..c61d71acada 100644
--- a/clang/lib/CodeGen/CGExprConstant.cpp
+++ b/clang/lib/CodeGen/CGExprConstant.cpp
@@ -385,20 +385,60 @@ public:
return llvm::ConstantExpr::getAnd(LHS, RHS);
}
- llvm::Constant *VisitBinNE(const BinaryOperator *E) {
+ llvm::Constant *EmitCmp(const BinaryOperator *E,
+ llvm::CmpInst::Predicate SignedPred,
+ llvm::CmpInst::Predicate UnsignedPred,
+ llvm::CmpInst::Predicate FloatPred) {
llvm::Constant *LHS = Visit(E->getLHS());
llvm::Constant *RHS = Visit(E->getRHS());
-
- const llvm::Type* ResultType = ConvertType(E->getType());
- if (!ResultType->isInteger()) {
+ llvm::Constant *Result;
+ if (LHS->getType()->isInteger() ||
+ isa<llvm::PointerType>(LHS->getType())) {
+ if (E->getLHS()->getType()->isSignedIntegerType())
+ Result = llvm::ConstantExpr::getICmp(SignedPred, LHS, RHS);
+ else
+ Result = llvm::ConstantExpr::getICmp(UnsignedPred, LHS, RHS);
+ } else if (LHS->getType()->isFloatingPoint()) {
+ Result = llvm::ConstantExpr::getFCmp(FloatPred, LHS, RHS);
+ } else {
CGM.WarnUnsupported(E, "constant expression");
- return llvm::Constant::getNullValue(ConvertType(E->getType()));
+ Result = llvm::ConstantInt::getFalse();
}
- llvm::Constant *Result =
- llvm::ConstantExpr::getICmp(llvm::ICmpInst::ICMP_NE, LHS, RHS);
+
+ const llvm::Type* ResultType = ConvertType(E->getType());
return llvm::ConstantExpr::getZExtOrBitCast(Result, ResultType);
}
+ llvm::Constant *VisitBinNE(const BinaryOperator *E) {
+ return EmitCmp(E, llvm::CmpInst::ICMP_NE, llvm::CmpInst::ICMP_NE,
+ llvm::CmpInst::FCMP_ONE);
+ }
+
+ llvm::Constant *VisitBinEQ(const BinaryOperator *E) {
+ return EmitCmp(E, llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_EQ,
+ llvm::CmpInst::FCMP_OEQ);
+ }
+
+ llvm::Constant *VisitBinLT(const BinaryOperator *E) {
+ return EmitCmp(E, llvm::CmpInst::ICMP_SLT, llvm::CmpInst::ICMP_ULT,
+ llvm::CmpInst::FCMP_OLT);
+ }
+
+ llvm::Constant *VisitBinLE(const BinaryOperator *E) {
+ return EmitCmp(E, llvm::CmpInst::ICMP_SLE, llvm::CmpInst::ICMP_ULE,
+ llvm::CmpInst::FCMP_OLE);
+ }
+
+ llvm::Constant *VisitBinGT(const BinaryOperator *E) {
+ return EmitCmp(E, llvm::CmpInst::ICMP_SGT, llvm::CmpInst::ICMP_UGT,
+ llvm::CmpInst::FCMP_OGT);
+ }
+
+ llvm::Constant *VisitBinGE(const BinaryOperator *E) {
+ return EmitCmp(E, llvm::CmpInst::ICMP_SGE, llvm::CmpInst::ICMP_SGE,
+ llvm::CmpInst::FCMP_OGE);
+ }
+
llvm::Constant *VisitConditionalOperator(const ConditionalOperator *E) {
llvm::Constant *Cond = Visit(E->getCond());
llvm::Constant *CondVal = EmitConversionToBool(Cond, E->getType());
OpenPOWER on IntegriCloud