[PATCH] D67291: Teach the IRBuilder about constrained FPToSI and FPToUI
Kevin P. Neal via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 6 10:42:59 PDT 2019
kpn created this revision.
kpn added reviewers: spatel, rsmith, rjmccall, andrew.w.kaylor.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
The IRBuilder doesn't know that two floating point to integer instructions have constrained equivalents. This patch adds the support by building on the strict FP mode now present in the IRBuilder.
Repository:
rL LLVM
https://reviews.llvm.org/D67291
Files:
include/llvm/IR/IRBuilder.h
unittests/IR/IRBuilderTest.cpp
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<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);
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<ConstrainedFPIntrinsic::RoundingMode> Rounding = None,
Optional<ConstrainedFPIntrinsic::ExceptionBehavior> 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<CallInst>(setFPAttrs(C, FPMathTag, UseFMF));
+ break;
+ }
+ if (isa<FPMathOperator>(C))
+ C = cast<CallInst>(setFPAttrs(C, FPMathTag, UseFMF));
+ return C;
}
// Provided to resolve 'CreateIntCast(Ptr, Ptr, "...")', giving a
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D67291.219137.patch
Type: text/x-patch
Size: 3498 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190906/d85091ec/attachment.bin>
More information about the llvm-commits
mailing list