diff --git a/llvm/lib/IR/IRBuilder.cpp b/llvm/lib/IR/IRBuilder.cpp index b321d8b325fe0..0c2016662b4d7 100644 --- a/llvm/lib/IR/IRBuilder.cpp +++ b/llvm/lib/IR/IRBuilder.cpp @@ -934,7 +934,8 @@ CallInst *IRBuilderBase::CreateBinaryIntrinsic(Intrinsic::ID ID, Value *LHS, Instruction *FMFSource, const Twine &Name) { Module *M = BB->getModule(); - Function *Fn = Intrinsic::getDeclaration(M, ID, { LHS->getType() }); + Function *Fn = + Intrinsic::getDeclaration(M, ID, {LHS->getType(), RHS->getType()}); return createCallHelper(Fn, {LHS, RHS}, Name, FMFSource); } diff --git a/llvm/unittests/IR/IRBuilderTest.cpp b/llvm/unittests/IR/IRBuilderTest.cpp index ef5f974419029..aedc60fbe8d23 100644 --- a/llvm/unittests/IR/IRBuilderTest.cpp +++ b/llvm/unittests/IR/IRBuilderTest.cpp @@ -55,12 +55,13 @@ class IRBuilderTest : public testing::Test { TEST_F(IRBuilderTest, Intrinsics) { IRBuilder<> Builder(BB); - Value *V; + Value *V, *IV; Instruction *I; CallInst *Call; IntrinsicInst *II; V = Builder.CreateLoad(GV->getValueType(), GV); + IV = Builder.getInt32(2); I = cast(Builder.CreateFAdd(V, V)); I->setHasNoInfs(true); I->setHasNoNaNs(false); @@ -109,6 +110,18 @@ TEST_F(IRBuilderTest, Intrinsics) { EXPECT_TRUE(II->hasNoInfs()); EXPECT_FALSE(II->hasNoNaNs()); + Call = Builder.CreateBinaryIntrinsic(Intrinsic::powi, V, IV); + II = cast(Call); + EXPECT_EQ(II->getIntrinsicID(), Intrinsic::powi); + EXPECT_FALSE(II->hasNoInfs()); + EXPECT_FALSE(II->hasNoNaNs()); + + Call = Builder.CreateBinaryIntrinsic(Intrinsic::powi, V, IV, I); + II = cast(Call); + EXPECT_EQ(II->getIntrinsicID(), Intrinsic::powi); + EXPECT_TRUE(II->hasNoInfs()); + EXPECT_FALSE(II->hasNoNaNs()); + Call = Builder.CreateIntrinsic(Intrinsic::fma, {V->getType()}, {V, V, V}); II = cast(Call); EXPECT_EQ(II->getIntrinsicID(), Intrinsic::fma);