Index: include/llvm/IR/IRBuilder.h =================================================================== --- include/llvm/IR/IRBuilder.h +++ include/llvm/IR/IRBuilder.h @@ -1913,11 +1913,17 @@ return V; } - Value *CreateFPToUI(Value *V, Type *DestTy, const Twine &Name = ""){ + Value *CreateFPToUI(Value *V, Type *DestTy, const Twine &Name = "") { + if (IsFPConstrained) + return CreateConstrainedFPCast(Intrinsic::experimental_constrained_fptoui, + V, DestTy, nullptr, Name); return CreateCast(Instruction::FPToUI, V, DestTy, Name); } - Value *CreateFPToSI(Value *V, Type *DestTy, const Twine &Name = ""){ + Value *CreateFPToSI(Value *V, Type *DestTy, const Twine &Name = "") { + if (IsFPConstrained) + return CreateConstrainedFPCast(Intrinsic::experimental_constrained_fptosi, + V, DestTy, nullptr, Name); return CreateCast(Instruction::FPToSI, V, DestTy, Name); } @@ -2059,7 +2065,6 @@ MDNode *FPMathTag = nullptr, Optional Rounding = None, Optional Except = None) { - Value *RoundingV = getConstrainedFPRounding(Rounding); Value *ExceptV = getConstrainedFPExcept(Except); FastMathFlags UseFMF = FMF; @@ -2067,13 +2072,22 @@ UseFMF = FMFSource->getFastMathFlags(); CallInst *C; - if (ID == Intrinsic::experimental_constrained_fpext) + switch (ID) { + default: { + Value *RoundingV = getConstrainedFPRounding(Rounding); + C = CreateIntrinsic(ID, {DestTy, V->getType()}, {V, RoundingV, ExceptV}, + nullptr, Name); + } break; + case Intrinsic::experimental_constrained_fpext: + case Intrinsic::experimental_constrained_fptoui: + case Intrinsic::experimental_constrained_fptosi: C = CreateIntrinsic(ID, {DestTy, V->getType()}, {V, ExceptV}, nullptr, Name); - else - C = CreateIntrinsic(ID, {DestTy, V->getType()}, {V, RoundingV, ExceptV}, - nullptr, Name); - return cast(setFPAttrs(C, FPMathTag, UseFMF)); + break; + } + if (isa(C)) + C = cast(setFPAttrs(C, FPMathTag, UseFMF)); + return C; } // Provided to resolve 'CreateIntCast(Ptr, Ptr, "...")', giving a Index: unittests/IR/IRBuilderTest.cpp =================================================================== --- unittests/IR/IRBuilderTest.cpp +++ unittests/IR/IRBuilderTest.cpp @@ -171,6 +171,7 @@ IRBuilder<> Builder(BB); Value *V; Value *VDouble; + Value *VInt; CallInst *Call; IntrinsicInst *II; GlobalVariable *GVDouble = new GlobalVariable(*M, Type::getDoubleTy(Ctx), @@ -208,6 +209,16 @@ II = cast(V); EXPECT_EQ(II->getIntrinsicID(), Intrinsic::experimental_constrained_frem); + VInt = Builder.CreateFPToUI(VDouble, Builder.getInt32Ty()); + ASSERT_TRUE(isa(VInt)); + II = cast(VInt); + EXPECT_EQ(II->getIntrinsicID(), Intrinsic::experimental_constrained_fptoui); + + VInt = Builder.CreateFPToSI(VDouble, Builder.getInt32Ty()); + ASSERT_TRUE(isa(VInt)); + II = cast(VInt); + EXPECT_EQ(II->getIntrinsicID(), Intrinsic::experimental_constrained_fptosi); + V = Builder.CreateFPTrunc(VDouble, Type::getFloatTy(Ctx)); ASSERT_TRUE(isa(V)); II = cast(V);