aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/IR/IntrinsicInst.cpp
diff options
context:
space:
mode:
authorFraser Cormack <fraser@codeplay.com>2022-03-09 15:02:53 +0000
committerFraser Cormack <fraser@codeplay.com>2022-03-30 14:39:18 +0100
commitda6131f20a2545218c3b054933a6cad6180cf4a2 (patch)
treedddebebea310585d375500715e8afa1ff289bbac /llvm/lib/IR/IntrinsicInst.cpp
parente18cc5277fd8f29da6ba5273a2f4c8359754ccb6 (diff)
downloadllvm-da6131f20a2545218c3b054933a6cad6180cf4a2.zip
llvm-da6131f20a2545218c3b054933a6cad6180cf4a2.tar.gz
llvm-da6131f20a2545218c3b054933a6cad6180cf4a2.tar.bz2
[VP] Add vp.fcmp comparison intrinsic and docs
This patch adds the first support for vector-predicated comparison intrinsics, starting with vp.fcmp. It uses metadata to encode its condition code, like the llvm.experimental.constrained.fcmp intrinsic. Reviewed By: craig.topper Differential Revision: https://reviews.llvm.org/D121292
Diffstat (limited to 'llvm/lib/IR/IntrinsicInst.cpp')
-rw-r--r--llvm/lib/IR/IntrinsicInst.cpp39
1 files changed, 37 insertions, 2 deletions
diff --git a/llvm/lib/IR/IntrinsicInst.cpp b/llvm/lib/IR/IntrinsicInst.cpp
index fd71cbb..eeffbaf 100644
--- a/llvm/lib/IR/IntrinsicInst.cpp
+++ b/llvm/lib/IR/IntrinsicInst.cpp
@@ -236,8 +236,8 @@ bool ConstrainedFPIntrinsic::isDefaultFPEnvironment() const {
return true;
}
-FCmpInst::Predicate ConstrainedFPCmpIntrinsic::getPredicate() const {
- Metadata *MD = cast<MetadataAsValue>(getArgOperand(2))->getMetadata();
+static FCmpInst::Predicate getFPPredicateFromMD(const Value *Op) {
+ Metadata *MD = cast<MetadataAsValue>(Op)->getMetadata();
if (!MD || !isa<MDString>(MD))
return FCmpInst::BAD_FCMP_PREDICATE;
return StringSwitch<FCmpInst::Predicate>(cast<MDString>(MD)->getString())
@@ -258,6 +258,10 @@ FCmpInst::Predicate ConstrainedFPCmpIntrinsic::getPredicate() const {
.Default(FCmpInst::BAD_FCMP_PREDICATE);
}
+FCmpInst::Predicate ConstrainedFPCmpIntrinsic::getPredicate() const {
+ return getFPPredicateFromMD(getArgOperand(2));
+}
+
bool ConstrainedFPIntrinsic::isUnaryOp() const {
switch (getIntrinsicID()) {
default:
@@ -560,6 +564,37 @@ bool VPCastIntrinsic::isVPCast(Intrinsic::ID ID) {
return false;
}
+bool VPCmpIntrinsic::isVPCmp(Intrinsic::ID ID) {
+ switch (ID) {
+ default:
+ break;
+#define BEGIN_REGISTER_VP_INTRINSIC(VPID, ...) case Intrinsic::VPID:
+#define VP_PROPERTY_CMP(CCPOS, ...) return true;
+#define END_REGISTER_VP_INTRINSIC(VPID) break;
+#include "llvm/IR/VPIntrinsics.def"
+ }
+ return false;
+}
+
+CmpInst::Predicate VPCmpIntrinsic::getPredicate() const {
+ bool IsFP = true;
+ Optional<unsigned> CCArgIdx;
+ switch (getIntrinsicID()) {
+ default:
+ break;
+#define BEGIN_REGISTER_VP_INTRINSIC(VPID, ...) case Intrinsic::VPID:
+#define VP_PROPERTY_CMP(CCPOS, ISFP) \
+ CCArgIdx = CCPOS; \
+ IsFP = ISFP; \
+ break;
+#define END_REGISTER_VP_INTRINSIC(VPID) break;
+#include "llvm/IR/VPIntrinsics.def"
+ }
+ assert(CCArgIdx.hasValue() && IsFP &&
+ "Unexpected vector-predicated comparison");
+ return getFPPredicateFromMD(getArgOperand(*CCArgIdx));
+}
+
unsigned VPReductionIntrinsic::getVectorParamPos() const {
return *VPReductionIntrinsic::getVectorParamPos(getIntrinsicID());
}