diff options
Diffstat (limited to 'llvm/lib/IR/IntrinsicInst.cpp')
-rw-r--r-- | llvm/lib/IR/IntrinsicInst.cpp | 107 |
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()); } |