aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/IR/IntrinsicInst.cpp
diff options
context:
space:
mode:
authorFraser Cormack <fraser@codeplay.com>2022-03-30 13:14:33 +0100
committerFraser Cormack <fraser@codeplay.com>2022-03-30 17:05:11 +0100
commit73244e8f8568fb0ebf0be5943c5d290f5b91d0c1 (patch)
tree7df669ed368807c5b9636d795db1b9b692f2498b /llvm/lib/IR/IntrinsicInst.cpp
parenta0e5d9e1f41bb9dca94815f714646640d656d085 (diff)
downloadllvm-73244e8f8568fb0ebf0be5943c5d290f5b91d0c1.zip
llvm-73244e8f8568fb0ebf0be5943c5d290f5b91d0c1.tar.gz
llvm-73244e8f8568fb0ebf0be5943c5d290f5b91d0c1.tar.bz2
[VP] Add vp.icmp comparison intrinsic and docs
This patch mostly follows up on D121292 which introduced the vp.fcmp intrinsic. Reviewed By: craig.topper Differential Revision: https://reviews.llvm.org/D122729
Diffstat (limited to 'llvm/lib/IR/IntrinsicInst.cpp')
-rw-r--r--llvm/lib/IR/IntrinsicInst.cpp24
1 files changed, 21 insertions, 3 deletions
diff --git a/llvm/lib/IR/IntrinsicInst.cpp b/llvm/lib/IR/IntrinsicInst.cpp
index eeffbaf..67bcb11 100644
--- a/llvm/lib/IR/IntrinsicInst.cpp
+++ b/llvm/lib/IR/IntrinsicInst.cpp
@@ -576,6 +576,24 @@ bool VPCmpIntrinsic::isVPCmp(Intrinsic::ID ID) {
return false;
}
+static ICmpInst::Predicate getIntPredicateFromMD(const Value *Op) {
+ Metadata *MD = cast<MetadataAsValue>(Op)->getMetadata();
+ if (!MD || !isa<MDString>(MD))
+ return ICmpInst::BAD_ICMP_PREDICATE;
+ return StringSwitch<ICmpInst::Predicate>(cast<MDString>(MD)->getString())
+ .Case("eq", ICmpInst::ICMP_EQ)
+ .Case("ne", ICmpInst::ICMP_NE)
+ .Case("ugt", ICmpInst::ICMP_UGT)
+ .Case("uge", ICmpInst::ICMP_UGE)
+ .Case("ult", ICmpInst::ICMP_ULT)
+ .Case("ule", ICmpInst::ICMP_ULE)
+ .Case("sgt", ICmpInst::ICMP_SGT)
+ .Case("sge", ICmpInst::ICMP_SGE)
+ .Case("slt", ICmpInst::ICMP_SLT)
+ .Case("sle", ICmpInst::ICMP_SLE)
+ .Default(ICmpInst::BAD_ICMP_PREDICATE);
+}
+
CmpInst::Predicate VPCmpIntrinsic::getPredicate() const {
bool IsFP = true;
Optional<unsigned> CCArgIdx;
@@ -590,9 +608,9 @@ CmpInst::Predicate VPCmpIntrinsic::getPredicate() const {
#define END_REGISTER_VP_INTRINSIC(VPID) break;
#include "llvm/IR/VPIntrinsics.def"
}
- assert(CCArgIdx.hasValue() && IsFP &&
- "Unexpected vector-predicated comparison");
- return getFPPredicateFromMD(getArgOperand(*CCArgIdx));
+ assert(CCArgIdx.hasValue() && "Unexpected vector-predicated comparison");
+ return IsFP ? getFPPredicateFromMD(getArgOperand(*CCArgIdx))
+ : getIntPredicateFromMD(getArgOperand(*CCArgIdx));
}
unsigned VPReductionIntrinsic::getVectorParamPos() const {