diff options
author | Fraser Cormack <fraser@codeplay.com> | 2022-03-09 15:02:53 +0000 |
---|---|---|
committer | Fraser Cormack <fraser@codeplay.com> | 2022-03-30 14:39:18 +0100 |
commit | da6131f20a2545218c3b054933a6cad6180cf4a2 (patch) | |
tree | dddebebea310585d375500715e8afa1ff289bbac /llvm/lib/IR/IntrinsicInst.cpp | |
parent | e18cc5277fd8f29da6ba5273a2f4c8359754ccb6 (diff) | |
download | llvm-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.cpp | 39 |
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()); } |