[PATCH] D69312: [FPEnv] Teach the IRBuilder about correct use of the strictfp attribute.
Kevin P. Neal via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 25 10:07:03 PDT 2019
This revision was automatically updated to reflect the committed changes.
Closed by commit rGde79836312e0: [FPEnv] Teach the IRBuilder about correct use of the strictfp attribute. (authored by kpn).
Changed prior to commit:
https://reviews.llvm.org/D69312?vs=226057&id=226452#toc
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D69312/new/
https://reviews.llvm.org/D69312
Files:
llvm/include/llvm/IR/IRBuilder.h
llvm/unittests/IR/IRBuilderTest.cpp
Index: llvm/unittests/IR/IRBuilderTest.cpp
===================================================================
--- llvm/unittests/IR/IRBuilderTest.cpp
+++ llvm/unittests/IR/IRBuilderTest.cpp
@@ -229,6 +229,15 @@
II = cast<IntrinsicInst>(VDouble);
EXPECT_EQ(II->getIntrinsicID(), Intrinsic::experimental_constrained_fpext);
+ // Verify attributes on the call are created automatically.
+ AttributeSet CallAttrs = II->getAttributes().getFnAttributes();
+ EXPECT_EQ(CallAttrs.hasAttribute(Attribute::StrictFP), true);
+
+ // Verify attributes on the containing function are created automatically.
+ AttributeList Attrs = BB->getParent()->getAttributes();
+ AttributeSet FnAttrs = Attrs.getFnAttributes();
+ EXPECT_EQ(FnAttrs.hasAttribute(Attribute::StrictFP), true);
+
// Verify the codepaths for setting and overriding the default metadata.
V = Builder.CreateFAdd(V, V);
ASSERT_TRUE(isa<ConstrainedFPIntrinsic>(V));
Index: llvm/include/llvm/IR/IRBuilder.h
===================================================================
--- llvm/include/llvm/IR/IRBuilder.h
+++ llvm/include/llvm/IR/IRBuilder.h
@@ -255,6 +255,21 @@
return DefaultConstrainedRounding;
}
+ void setConstrainedFPFunctionAttr() {
+ assert(BB && "Must have a basic block to set any function attributes!");
+
+ Function *F = BB->getParent();
+ if (!F->hasFnAttribute(Attribute::StrictFP)) {
+ F->addFnAttr(Attribute::StrictFP);
+ }
+ }
+
+ void setConstrainedFPCallAttr(CallInst *I) {
+ if (!I->hasFnAttr(Attribute::StrictFP))
+ I->addAttribute(AttributeList::FunctionIndex, Attribute::StrictFP);
+ setConstrainedFPFunctionAttr();
+ }
+
//===--------------------------------------------------------------------===//
// RAII helpers.
//===--------------------------------------------------------------------===//
@@ -1479,6 +1494,7 @@
CallInst *C = CreateIntrinsic(ID, {L->getType()},
{L, R, RoundingV, ExceptV}, nullptr, Name);
+ setConstrainedFPCallAttr(C);
setFPAttrs(C, FPMathTag, UseFMF);
return C;
}
@@ -2084,6 +2100,8 @@
Name);
break;
}
+ setConstrainedFPCallAttr(C);
+
if (isa<FPMathOperator>(C))
setFPAttrs(C, FPMathTag, UseFMF);
return C;
@@ -2240,6 +2258,8 @@
ArrayRef<Value *> Args = None, const Twine &Name = "",
MDNode *FPMathTag = nullptr) {
CallInst *CI = CallInst::Create(FTy, Callee, Args, DefaultOperandBundles);
+ if (IsFPConstrained)
+ setConstrainedFPCallAttr(CI);
if (isa<FPMathOperator>(CI))
setFPAttrs(CI, FPMathTag, FMF);
return Insert(CI, Name);
@@ -2249,6 +2269,8 @@
ArrayRef<OperandBundleDef> OpBundles,
const Twine &Name = "", MDNode *FPMathTag = nullptr) {
CallInst *CI = CallInst::Create(FTy, Callee, Args, OpBundles);
+ if (IsFPConstrained)
+ setConstrainedFPCallAttr(CI);
if (isa<FPMathOperator>(CI))
setFPAttrs(CI, FPMathTag, FMF);
return Insert(CI, Name);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D69312.226452.patch
Type: text/x-patch
Size: 3101 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191025/7f18d58c/attachment.bin>
More information about the llvm-commits
mailing list