diff options
-rw-r--r-- | llvm/include/llvm/IR/IRBuilder.h | 30 | ||||
-rw-r--r-- | llvm/unittests/IR/IRBuilderTest.cpp | 11 |
2 files changed, 33 insertions, 8 deletions
diff --git a/llvm/include/llvm/IR/IRBuilder.h b/llvm/include/llvm/IR/IRBuilder.h index 35014ed5ece..e5dcea1d4c0 100644 --- a/llvm/include/llvm/IR/IRBuilder.h +++ b/llvm/include/llvm/IR/IRBuilder.h @@ -1913,11 +1913,17 @@ public: 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 @@ public: MDNode *FPMathTag = nullptr, Optional<ConstrainedFPIntrinsic::RoundingMode> Rounding = None, Optional<ConstrainedFPIntrinsic::ExceptionBehavior> Except = None) { - Value *RoundingV = getConstrainedFPRounding(Rounding); Value *ExceptV = getConstrainedFPExcept(Except); FastMathFlags UseFMF = FMF; @@ -2067,13 +2072,22 @@ public: UseFMF = FMFSource->getFastMathFlags(); CallInst *C; - if (ID == Intrinsic::experimental_constrained_fpext) - C = CreateIntrinsic(ID, {DestTy, V->getType()}, {V, ExceptV}, nullptr, - Name); - else + switch (ID) { + default: { + Value *RoundingV = getConstrainedFPRounding(Rounding); C = CreateIntrinsic(ID, {DestTy, V->getType()}, {V, RoundingV, ExceptV}, nullptr, Name); - return cast<CallInst>(setFPAttrs(C, FPMathTag, UseFMF)); + } 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); + break; + } + if (isa<FPMathOperator>(C)) + C = cast<CallInst>(setFPAttrs(C, FPMathTag, UseFMF)); + return C; } // Provided to resolve 'CreateIntCast(Ptr, Ptr, "...")', giving a diff --git a/llvm/unittests/IR/IRBuilderTest.cpp b/llvm/unittests/IR/IRBuilderTest.cpp index 538c2a0dd93..8fb5337a291 100644 --- a/llvm/unittests/IR/IRBuilderTest.cpp +++ b/llvm/unittests/IR/IRBuilderTest.cpp @@ -171,6 +171,7 @@ TEST_F(IRBuilderTest, ConstrainedFP) { 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 @@ TEST_F(IRBuilderTest, ConstrainedFP) { II = cast<IntrinsicInst>(V); EXPECT_EQ(II->getIntrinsicID(), Intrinsic::experimental_constrained_frem); + VInt = Builder.CreateFPToUI(VDouble, Builder.getInt32Ty()); + ASSERT_TRUE(isa<IntrinsicInst>(VInt)); + II = cast<IntrinsicInst>(VInt); + EXPECT_EQ(II->getIntrinsicID(), Intrinsic::experimental_constrained_fptoui); + + VInt = Builder.CreateFPToSI(VDouble, Builder.getInt32Ty()); + ASSERT_TRUE(isa<IntrinsicInst>(VInt)); + II = cast<IntrinsicInst>(VInt); + EXPECT_EQ(II->getIntrinsicID(), Intrinsic::experimental_constrained_fptosi); + V = Builder.CreateFPTrunc(VDouble, Type::getFloatTy(Ctx)); ASSERT_TRUE(isa<IntrinsicInst>(V)); II = cast<IntrinsicInst>(V); |