diff options
-rw-r--r-- | llvm/include/llvm/IR/IRBuilder.h | 6 | ||||
-rw-r--r-- | llvm/unittests/IR/IRBuilderTest.cpp | 10 |
2 files changed, 16 insertions, 0 deletions
diff --git a/llvm/include/llvm/IR/IRBuilder.h b/llvm/include/llvm/IR/IRBuilder.h index 4d3abac..8179e38 100644 --- a/llvm/include/llvm/IR/IRBuilder.h +++ b/llvm/include/llvm/IR/IRBuilder.h @@ -2021,10 +2021,16 @@ public: } Value *CreateUIToFP(Value *V, Type *DestTy, const Twine &Name = ""){ + if (IsFPConstrained) + return CreateConstrainedFPCast(Intrinsic::experimental_constrained_uitofp, + V, DestTy, nullptr, Name); return CreateCast(Instruction::UIToFP, V, DestTy, Name); } Value *CreateSIToFP(Value *V, Type *DestTy, const Twine &Name = ""){ + if (IsFPConstrained) + return CreateConstrainedFPCast(Intrinsic::experimental_constrained_sitofp, + V, DestTy, nullptr, Name); return CreateCast(Instruction::SIToFP, V, DestTy, Name); } diff --git a/llvm/unittests/IR/IRBuilderTest.cpp b/llvm/unittests/IR/IRBuilderTest.cpp index 1ea9294..4ceff2d 100644 --- a/llvm/unittests/IR/IRBuilderTest.cpp +++ b/llvm/unittests/IR/IRBuilderTest.cpp @@ -222,6 +222,16 @@ TEST_F(IRBuilderTest, ConstrainedFP) { II = cast<IntrinsicInst>(VInt); EXPECT_EQ(II->getIntrinsicID(), Intrinsic::experimental_constrained_fptosi); + VDouble = Builder.CreateUIToFP(VInt, Builder.getDoubleTy()); + ASSERT_TRUE(isa<IntrinsicInst>(VDouble)); + II = cast<IntrinsicInst>(VDouble); + EXPECT_EQ(II->getIntrinsicID(), Intrinsic::experimental_constrained_uitofp); + + VDouble = Builder.CreateSIToFP(VInt, Builder.getDoubleTy()); + ASSERT_TRUE(isa<IntrinsicInst>(VDouble)); + II = cast<IntrinsicInst>(VDouble); + EXPECT_EQ(II->getIntrinsicID(), Intrinsic::experimental_constrained_sitofp); + V = Builder.CreateFPTrunc(VDouble, Type::getFloatTy(Ctx)); ASSERT_TRUE(isa<IntrinsicInst>(V)); II = cast<IntrinsicInst>(V); |