mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 02:33:06 +01:00
[VP] getDeclarationForParams
`VPIntrinsic::getDeclarationForParams` creates a vp intrinsic declaration for parameters you want to call it with. This is in preparation of a new builder class that makes emitting vp intrinsic code nearly as convenient as using a plain ir builder (aka `VectorBuilder`, to be used by D99750). Reviewed By: frasercrmck, craig.topper, vkmr Differential Revision: https://reviews.llvm.org/D102686
This commit is contained in:
parent
a146be49ac
commit
64d5c9acc6
@ -389,6 +389,11 @@ public:
|
||||
/// This is the common base class for vector predication intrinsics.
|
||||
class VPIntrinsic : public IntrinsicInst {
|
||||
public:
|
||||
/// \brief Declares a llvm.vp.* intrinsic in \p M that matches the parameters
|
||||
/// \p Params.
|
||||
static Function *getDeclarationForParams(Module *M, Intrinsic::ID,
|
||||
ArrayRef<Value *> Params);
|
||||
|
||||
static Optional<unsigned> getMaskParamPos(Intrinsic::ID IntrinsicID);
|
||||
static Optional<unsigned> getVectorLengthParamPos(Intrinsic::ID IntrinsicID);
|
||||
|
||||
|
@ -421,6 +421,17 @@ bool VPIntrinsic::canIgnoreVectorLengthParam() const {
|
||||
return false;
|
||||
}
|
||||
|
||||
Function *VPIntrinsic::getDeclarationForParams(Module *M, Intrinsic::ID VPID,
|
||||
ArrayRef<Value *> Params) {
|
||||
assert(isVPIntrinsic(VPID) && "not a VP intrinsic");
|
||||
|
||||
// TODO: Extend this for other VP intrinsics as they are upstreamed. This
|
||||
// works for binary arithmetic VP intrinsics.
|
||||
auto *VPFunc = Intrinsic::getDeclaration(M, VPID, Params[0]->getType());
|
||||
assert(VPFunc && "Could not declare VP intrinsic");
|
||||
return VPFunc;
|
||||
}
|
||||
|
||||
Instruction::BinaryOps BinaryOpIntrinsic::getBinaryOp() const {
|
||||
switch (getIntrinsicID()) {
|
||||
case Intrinsic::uadd_with_overflow:
|
||||
|
@ -222,4 +222,36 @@ TEST_F(VPIntrinsicTest, IntrinsicIDRoundTrip) {
|
||||
ASSERT_NE(FullTripCounts, 0u);
|
||||
}
|
||||
|
||||
/// Check that VPIntrinsic::getDeclarationForParams works.
|
||||
TEST_F(VPIntrinsicTest, VPIntrinsicDeclarationForParams) {
|
||||
std::unique_ptr<Module> M = CreateVPDeclarationModule();
|
||||
assert(M);
|
||||
|
||||
auto OutM = std::make_unique<Module>("", M->getContext());
|
||||
|
||||
for (auto &F : *M) {
|
||||
auto *FuncTy = F.getFunctionType();
|
||||
|
||||
// Declare intrinsic anew with explicit types.
|
||||
std::vector<Value *> Values;
|
||||
for (auto *ParamTy : FuncTy->params())
|
||||
Values.push_back(UndefValue::get(ParamTy));
|
||||
|
||||
ASSERT_NE(F.getIntrinsicID(), Intrinsic::not_intrinsic);
|
||||
auto *NewDecl = VPIntrinsic::getDeclarationForParams(
|
||||
OutM.get(), F.getIntrinsicID(), Values);
|
||||
ASSERT_TRUE(NewDecl);
|
||||
|
||||
// Check that 'old decl' == 'new decl'.
|
||||
ASSERT_EQ(F.getIntrinsicID(), NewDecl->getIntrinsicID());
|
||||
auto ItNewParams = NewDecl->getFunctionType()->param_begin();
|
||||
auto EndItNewParams = NewDecl->getFunctionType()->param_end();
|
||||
for (auto *ParamTy : FuncTy->params()) {
|
||||
ASSERT_NE(ItNewParams, EndItNewParams);
|
||||
ASSERT_EQ(*ItNewParams, ParamTy);
|
||||
++ItNewParams;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // end anonymous namespace
|
||||
|
Loading…
Reference in New Issue
Block a user