aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/IR/IntrinsicInst.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/IR/IntrinsicInst.cpp')
-rw-r--r--llvm/lib/IR/IntrinsicInst.cpp107
1 files changed, 100 insertions, 7 deletions
diff --git a/llvm/lib/IR/IntrinsicInst.cpp b/llvm/lib/IR/IntrinsicInst.cpp
index e27758c5de02..b132a9dcb812 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:
@@ -299,13 +303,18 @@ ElementCount VPIntrinsic::getStaticVectorLength() const {
};
Value *VPMask = getMaskParam();
- assert(VPMask && "No mask param?");
+ if (!VPMask) {
+ assert((getIntrinsicID() == Intrinsic::vp_merge ||
+ getIntrinsicID() == Intrinsic::vp_select) &&
+ "Unexpected VP intrinsic without mask operand");
+ return GetVectorLengthOfType(getType());
+ }
return GetVectorLengthOfType(VPMask->getType());
}
Value *VPIntrinsic::getMaskParam() const {
if (auto MaskPos = getMaskParamPos(getIntrinsicID()))
- return getArgOperand(MaskPos.getValue());
+ return getArgOperand(*MaskPos);
return nullptr;
}
@@ -316,7 +325,7 @@ void VPIntrinsic::setMaskParam(Value *NewMask) {
Value *VPIntrinsic::getVectorLengthParam() const {
if (auto EVLPos = getVectorLengthParamPos(getIntrinsicID()))
- return getArgOperand(EVLPos.getValue());
+ return getArgOperand(*EVLPos);
return nullptr;
}
@@ -354,7 +363,7 @@ VPIntrinsic::getVectorLengthParamPos(Intrinsic::ID IntrinsicID) {
/// scatter.
MaybeAlign VPIntrinsic::getPointerAlignment() const {
Optional<unsigned> PtrParamOpt = getMemoryPointerParamPos(getIntrinsicID());
- assert(PtrParamOpt.hasValue() && "no pointer argument!");
+ assert(PtrParamOpt && "no pointer argument!");
return getParamAlign(PtrParamOpt.getValue());
}
@@ -380,7 +389,7 @@ Optional<unsigned> VPIntrinsic::getMemoryPointerParamPos(Intrinsic::ID VPID) {
/// \return The data (payload) operand of this store or scatter.
Value *VPIntrinsic::getMemoryDataParam() const {
auto DataParamOpt = getMemoryDataParamPos(getIntrinsicID());
- if (!DataParamOpt.hasValue())
+ if (!DataParamOpt)
return nullptr;
return getArgOperand(DataParamOpt.getValue());
}
@@ -492,6 +501,20 @@ Function *VPIntrinsic::getDeclarationForParams(Module *M, Intrinsic::ID VPID,
VPFunc = Intrinsic::getDeclaration(M, VPID, OverloadTy);
break;
}
+ case Intrinsic::vp_trunc:
+ case Intrinsic::vp_sext:
+ case Intrinsic::vp_zext:
+ case Intrinsic::vp_fptoui:
+ case Intrinsic::vp_fptosi:
+ case Intrinsic::vp_uitofp:
+ case Intrinsic::vp_sitofp:
+ case Intrinsic::vp_fptrunc:
+ case Intrinsic::vp_fpext:
+ case Intrinsic::vp_ptrtoint:
+ case Intrinsic::vp_inttoptr:
+ VPFunc =
+ Intrinsic::getDeclaration(M, VPID, {ReturnType, Params[0]->getType()});
+ break;
case Intrinsic::vp_merge:
case Intrinsic::vp_select:
VPFunc = Intrinsic::getDeclaration(M, VPID, {Params[1]->getType()});
@@ -500,6 +523,10 @@ Function *VPIntrinsic::getDeclarationForParams(Module *M, Intrinsic::ID VPID,
VPFunc = Intrinsic::getDeclaration(
M, VPID, {ReturnType, Params[0]->getType()});
break;
+ case Intrinsic::experimental_vp_strided_load:
+ VPFunc = Intrinsic::getDeclaration(
+ M, VPID, {ReturnType, Params[0]->getType(), Params[1]->getType()});
+ break;
case Intrinsic::vp_gather:
VPFunc = Intrinsic::getDeclaration(
M, VPID, {ReturnType, Params[0]->getType()});
@@ -508,6 +535,11 @@ Function *VPIntrinsic::getDeclarationForParams(Module *M, Intrinsic::ID VPID,
VPFunc = Intrinsic::getDeclaration(
M, VPID, {Params[0]->getType(), Params[1]->getType()});
break;
+ case Intrinsic::experimental_vp_strided_store:
+ VPFunc = Intrinsic::getDeclaration(
+ M, VPID,
+ {Params[0]->getType(), Params[1]->getType(), Params[2]->getType()});
+ break;
case Intrinsic::vp_scatter:
VPFunc = Intrinsic::getDeclaration(
M, VPID, {Params[0]->getType(), Params[1]->getType()});
@@ -529,6 +561,67 @@ bool VPReductionIntrinsic::isVPReduction(Intrinsic::ID ID) {
return false;
}
+bool VPCastIntrinsic::isVPCast(Intrinsic::ID ID) {
+ switch (ID) {
+ default:
+ break;
+#define BEGIN_REGISTER_VP_INTRINSIC(VPID, ...) case Intrinsic::VPID:
+#define VP_PROPERTY_CASTOP return true;
+#define END_REGISTER_VP_INTRINSIC(VPID) break;
+#include "llvm/IR/VPIntrinsics.def"
+ }
+ 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;
+}
+
+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;
+ 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 && "Unexpected vector-predicated comparison");
+ return IsFP ? getFPPredicateFromMD(getArgOperand(*CCArgIdx))
+ : getIntPredicateFromMD(getArgOperand(*CCArgIdx));
+}
+
unsigned VPReductionIntrinsic::getVectorParamPos() const {
return *VPReductionIntrinsic::getVectorParamPos(getIntrinsicID());
}