From b5557abcf13a7b375cae683e9ec200d499645d02 Mon Sep 17 00:00:00 2001 From: Nate Begeman Date: Fri, 25 Jul 2008 17:35:37 +0000 Subject: [PATCH] Fix minor issues with VICmp/VFCmp constant expressions git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@54030 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Constants.h | 5 +++-- lib/Analysis/ConstantFolding.cpp | 4 +++- lib/VMCore/Constants.cpp | 29 ++++++++++++++++------------- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/include/llvm/Constants.h b/include/llvm/Constants.h index 5d85ee23e7c..d91dfca9f88 100644 --- a/include/llvm/Constants.h +++ b/include/llvm/Constants.h @@ -565,7 +565,7 @@ protected: static Constant *getTy(const Type *Ty, unsigned Opcode, Constant *C1, Constant *C2); static Constant *getCompareTy(unsigned short pred, Constant *C1, - Constant *C2); + Constant *C2, bool isVecCmp = false); static Constant *getSelectTy(const Type *Ty, Constant *C1, Constant *C2, Constant *C3); static Constant *getGetElementPtrTy(const Type *Ty, Constant *C, @@ -677,7 +677,8 @@ public: /// static Constant *get(unsigned Opcode, Constant *C1, Constant *C2); - /// @brief Return an ICmp or FCmp comparison operator constant expression. + /// @brief Return an ICmp, FCmp, VICmp, or VFCmp comparison operator constant + /// expression. static Constant *getCompare(unsigned short pred, Constant *C1, Constant *C2); /// ConstantExpr::get* - Return some common constants without having to diff --git a/lib/Analysis/ConstantFolding.cpp b/lib/Analysis/ConstantFolding.cpp index 43597c85f16..1a0e4b410c3 100644 --- a/lib/Analysis/ConstantFolding.cpp +++ b/lib/Analysis/ConstantFolding.cpp @@ -358,6 +358,8 @@ Constant *llvm::ConstantFoldInstOperands(unsigned Opcode, const Type *DestTy, return 0; case Instruction::ICmp: case Instruction::FCmp: + case Instruction::VICmp: + case Instruction::VFCmp: assert(0 &&"This function is invalid for compares: no predicate specified"); case Instruction::PtrToInt: // If the input is a inttoptr, eliminate the pair. This requires knowing @@ -473,7 +475,7 @@ Constant *llvm::ConstantFoldCompareInstOperands(unsigned Predicate, } } } - return ConstantExpr::getCompare(Predicate, Ops[0], Ops[1]); + return ConstantExpr::getCompare(Predicate, Ops[0], Ops[1]); } diff --git a/lib/VMCore/Constants.cpp b/lib/VMCore/Constants.cpp index e22449bab63..48034703c88 100644 --- a/lib/VMCore/Constants.cpp +++ b/lib/VMCore/Constants.cpp @@ -2003,21 +2003,24 @@ Constant *ConstantExpr::getTy(const Type *ReqTy, unsigned Opcode, } Constant *ConstantExpr::getCompareTy(unsigned short predicate, - Constant *C1, Constant *C2) { + Constant *C1, Constant *C2, + bool isVecCmp) { switch (predicate) { default: assert(0 && "Invalid CmpInst predicate"); - case FCmpInst::FCMP_FALSE: case FCmpInst::FCMP_OEQ: case FCmpInst::FCMP_OGT: - case FCmpInst::FCMP_OGE: case FCmpInst::FCMP_OLT: case FCmpInst::FCMP_OLE: - case FCmpInst::FCMP_ONE: case FCmpInst::FCMP_ORD: case FCmpInst::FCMP_UNO: - case FCmpInst::FCMP_UEQ: case FCmpInst::FCMP_UGT: case FCmpInst::FCMP_UGE: - case FCmpInst::FCMP_ULT: case FCmpInst::FCMP_ULE: case FCmpInst::FCMP_UNE: - case FCmpInst::FCMP_TRUE: - return getFCmp(predicate, C1, C2); - case ICmpInst::ICMP_EQ: case ICmpInst::ICMP_NE: case ICmpInst::ICMP_UGT: - case ICmpInst::ICMP_UGE: case ICmpInst::ICMP_ULT: case ICmpInst::ICMP_ULE: - case ICmpInst::ICMP_SGT: case ICmpInst::ICMP_SGE: case ICmpInst::ICMP_SLT: - case ICmpInst::ICMP_SLE: - return getICmp(predicate, C1, C2); + case CmpInst::FCMP_FALSE: case CmpInst::FCMP_OEQ: case CmpInst::FCMP_OGT: + case CmpInst::FCMP_OGE: case CmpInst::FCMP_OLT: case CmpInst::FCMP_OLE: + case CmpInst::FCMP_ONE: case CmpInst::FCMP_ORD: case CmpInst::FCMP_UNO: + case CmpInst::FCMP_UEQ: case CmpInst::FCMP_UGT: case CmpInst::FCMP_UGE: + case CmpInst::FCMP_ULT: case CmpInst::FCMP_ULE: case CmpInst::FCMP_UNE: + case CmpInst::FCMP_TRUE: + return isVecCmp ? getVFCmp(predicate, C1, C2) + : getFCmp(predicate, C1, C2); + case CmpInst::ICMP_EQ: case CmpInst::ICMP_NE: case CmpInst::ICMP_UGT: + case CmpInst::ICMP_UGE: case CmpInst::ICMP_ULT: case CmpInst::ICMP_ULE: + case CmpInst::ICMP_SGT: case CmpInst::ICMP_SGE: case CmpInst::ICMP_SLT: + case CmpInst::ICMP_SLE: + return isVecCmp ? getVICmp(predicate, C1, C2) + : getICmp(predicate, C1, C2); } } -- 2.34.1