Skip to content

Commit d86e2cc

Browse files
committed
[NFC] Method for evaluation of FCmpInst for constant operands
New method `FCmpInst::compare` is added, which evaluates the given compare predicate for constant operands. Interface is made similar to `ICmpInst::compare`. Differential Revision: https://reviews.llvm.org/D116168
1 parent 34558b0 commit d86e2cc

File tree

3 files changed

+47
-40
lines changed

3 files changed

+47
-40
lines changed

llvm/include/llvm/IR/Instructions.h

+4
Original file line numberDiff line numberDiff line change
@@ -1456,6 +1456,10 @@ class FCmpInst: public CmpInst {
14561456
///
14571457
static auto predicates() { return FCmpPredicates(); }
14581458

1459+
/// Return result of `LHS Pred RHS` comparison.
1460+
static bool compare(const APFloat &LHS, const APFloat &RHS,
1461+
FCmpInst::Predicate Pred);
1462+
14591463
/// Methods for support type inquiry through isa, cast, and dyn_cast:
14601464
static bool classof(const Instruction *I) {
14611465
return I->getOpcode() == Instruction::FCmp;

llvm/lib/IR/ConstantFold.cpp

+2-40
Original file line numberDiff line numberDiff line change
@@ -1801,46 +1801,8 @@ Constant *llvm::ConstantFoldCompareInstruction(unsigned short pred,
18011801
} else if (isa<ConstantFP>(C1) && isa<ConstantFP>(C2)) {
18021802
const APFloat &C1V = cast<ConstantFP>(C1)->getValueAPF();
18031803
const APFloat &C2V = cast<ConstantFP>(C2)->getValueAPF();
1804-
APFloat::cmpResult R = C1V.compare(C2V);
1805-
switch (pred) {
1806-
default: llvm_unreachable("Invalid FCmp Predicate");
1807-
case FCmpInst::FCMP_FALSE: return Constant::getNullValue(ResultTy);
1808-
case FCmpInst::FCMP_TRUE: return Constant::getAllOnesValue(ResultTy);
1809-
case FCmpInst::FCMP_UNO:
1810-
return ConstantInt::get(ResultTy, R==APFloat::cmpUnordered);
1811-
case FCmpInst::FCMP_ORD:
1812-
return ConstantInt::get(ResultTy, R!=APFloat::cmpUnordered);
1813-
case FCmpInst::FCMP_UEQ:
1814-
return ConstantInt::get(ResultTy, R==APFloat::cmpUnordered ||
1815-
R==APFloat::cmpEqual);
1816-
case FCmpInst::FCMP_OEQ:
1817-
return ConstantInt::get(ResultTy, R==APFloat::cmpEqual);
1818-
case FCmpInst::FCMP_UNE:
1819-
return ConstantInt::get(ResultTy, R!=APFloat::cmpEqual);
1820-
case FCmpInst::FCMP_ONE:
1821-
return ConstantInt::get(ResultTy, R==APFloat::cmpLessThan ||
1822-
R==APFloat::cmpGreaterThan);
1823-
case FCmpInst::FCMP_ULT:
1824-
return ConstantInt::get(ResultTy, R==APFloat::cmpUnordered ||
1825-
R==APFloat::cmpLessThan);
1826-
case FCmpInst::FCMP_OLT:
1827-
return ConstantInt::get(ResultTy, R==APFloat::cmpLessThan);
1828-
case FCmpInst::FCMP_UGT:
1829-
return ConstantInt::get(ResultTy, R==APFloat::cmpUnordered ||
1830-
R==APFloat::cmpGreaterThan);
1831-
case FCmpInst::FCMP_OGT:
1832-
return ConstantInt::get(ResultTy, R==APFloat::cmpGreaterThan);
1833-
case FCmpInst::FCMP_ULE:
1834-
return ConstantInt::get(ResultTy, R!=APFloat::cmpGreaterThan);
1835-
case FCmpInst::FCMP_OLE:
1836-
return ConstantInt::get(ResultTy, R==APFloat::cmpLessThan ||
1837-
R==APFloat::cmpEqual);
1838-
case FCmpInst::FCMP_UGE:
1839-
return ConstantInt::get(ResultTy, R!=APFloat::cmpLessThan);
1840-
case FCmpInst::FCMP_OGE:
1841-
return ConstantInt::get(ResultTy, R==APFloat::cmpGreaterThan ||
1842-
R==APFloat::cmpEqual);
1843-
}
1804+
CmpInst::Predicate Predicate = CmpInst::Predicate(pred);
1805+
return ConstantInt::get(ResultTy, FCmpInst::compare(C1V, C2V, Predicate));
18441806
} else if (auto *C1VTy = dyn_cast<VectorType>(C1->getType())) {
18451807

18461808
// Fast path for splatted constants.

llvm/lib/IR/Instructions.cpp

+41
Original file line numberDiff line numberDiff line change
@@ -4160,6 +4160,47 @@ bool ICmpInst::compare(const APInt &LHS, const APInt &RHS,
41604160
};
41614161
}
41624162

4163+
bool FCmpInst::compare(const APFloat &LHS, const APFloat &RHS,
4164+
FCmpInst::Predicate Pred) {
4165+
APFloat::cmpResult R = LHS.compare(RHS);
4166+
switch (Pred) {
4167+
default:
4168+
llvm_unreachable("Invalid FCmp Predicate");
4169+
case FCmpInst::FCMP_FALSE:
4170+
return false;
4171+
case FCmpInst::FCMP_TRUE:
4172+
return true;
4173+
case FCmpInst::FCMP_UNO:
4174+
return R == APFloat::cmpUnordered;
4175+
case FCmpInst::FCMP_ORD:
4176+
return R != APFloat::cmpUnordered;
4177+
case FCmpInst::FCMP_UEQ:
4178+
return R == APFloat::cmpUnordered || R == APFloat::cmpEqual;
4179+
case FCmpInst::FCMP_OEQ:
4180+
return R == APFloat::cmpEqual;
4181+
case FCmpInst::FCMP_UNE:
4182+
return R != APFloat::cmpEqual;
4183+
case FCmpInst::FCMP_ONE:
4184+
return R == APFloat::cmpLessThan || R == APFloat::cmpGreaterThan;
4185+
case FCmpInst::FCMP_ULT:
4186+
return R == APFloat::cmpUnordered || R == APFloat::cmpLessThan;
4187+
case FCmpInst::FCMP_OLT:
4188+
return R == APFloat::cmpLessThan;
4189+
case FCmpInst::FCMP_UGT:
4190+
return R == APFloat::cmpUnordered || R == APFloat::cmpGreaterThan;
4191+
case FCmpInst::FCMP_OGT:
4192+
return R == APFloat::cmpGreaterThan;
4193+
case FCmpInst::FCMP_ULE:
4194+
return R != APFloat::cmpGreaterThan;
4195+
case FCmpInst::FCMP_OLE:
4196+
return R == APFloat::cmpLessThan || R == APFloat::cmpEqual;
4197+
case FCmpInst::FCMP_UGE:
4198+
return R != APFloat::cmpLessThan;
4199+
case FCmpInst::FCMP_OGE:
4200+
return R == APFloat::cmpGreaterThan || R == APFloat::cmpEqual;
4201+
}
4202+
}
4203+
41634204
CmpInst::Predicate CmpInst::getFlippedSignednessPredicate(Predicate pred) {
41644205
assert(CmpInst::isRelational(pred) &&
41654206
"Call only with non-equality predicates!");

0 commit comments

Comments
 (0)