[IR] CmpInst: add getUnsignedPredicate()

There's already getSignedPredicate(), it is not symmetrical to not have
it's opposite. I wanted to use it in new code, but it wasn't there..
This commit is contained in:
Roman Lebedev 2020-11-06 09:52:54 +03:00
parent 5e312e0041
commit a5ae3edaa3
No known key found for this signature in database
GPG Key ID: 083C3EBB4A1689E0
2 changed files with 30 additions and 1 deletions

View File

@ -920,6 +920,18 @@ public:
return getSignedPredicate(getPredicate());
}
/// For example, SLT->ULT, SLE->ULE, SGT->UGT, SGE->UGE, ULT->Failed assert
/// @returns the unsigned version of the signed predicate pred.
static Predicate getUnsignedPredicate(Predicate pred);
/// For example, SLT->ULT, SLE->ULE, SGT->UGT, SGE->UGE, ULT->Failed assert
/// @returns the unsigned version of the predicate for this instruction (which
/// has to be an signed predicate).
/// return the unsigned version of a predicate
Predicate getUnsignedPredicate() {
return getUnsignedPredicate(getPredicate());
}
/// This is just a convenience.
/// Determine if this is true when both operands are the same.
bool isTrueWhenEqual() const {

View File

@ -3847,7 +3847,7 @@ CmpInst::Predicate CmpInst::getNonStrictPredicate(Predicate pred) {
}
CmpInst::Predicate CmpInst::getSignedPredicate(Predicate pred) {
assert(CmpInst::isUnsigned(pred) && "Call only with signed predicates!");
assert(CmpInst::isUnsigned(pred) && "Call only with unsigned predicates!");
switch (pred) {
default:
@ -3863,6 +3863,23 @@ CmpInst::Predicate CmpInst::getSignedPredicate(Predicate pred) {
}
}
CmpInst::Predicate CmpInst::getUnsignedPredicate(Predicate pred) {
assert(CmpInst::isSigned(pred) && "Call only with signed predicates!");
switch (pred) {
default:
llvm_unreachable("Unknown predicate!");
case CmpInst::ICMP_SLT:
return CmpInst::ICMP_ULT;
case CmpInst::ICMP_SLE:
return CmpInst::ICMP_ULE;
case CmpInst::ICMP_SGT:
return CmpInst::ICMP_UGT;
case CmpInst::ICMP_SGE:
return CmpInst::ICMP_UGE;
}
}
bool CmpInst::isUnsigned(Predicate predicate) {
switch (predicate) {
default: return false;