[llvm] d535a91 - [FPEnv] IRBuilder fails to add strictfp attribute
Kevin P. Neal via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 3 10:25:39 PDT 2020
Author: Kevin P. Neal
Date: 2020-08-03T13:25:24-04:00
New Revision: d535a91d13b88b547ba24ec50337aa0715d74d4d
URL: https://github.com/llvm/llvm-project/commit/d535a91d13b88b547ba24ec50337aa0715d74d4d
DIFF: https://github.com/llvm/llvm-project/commit/d535a91d13b88b547ba24ec50337aa0715d74d4d.diff
LOG: [FPEnv] IRBuilder fails to add strictfp attribute
The strictfp attribute is required on all function calls in a function
that is itself marked with the strictfp attribute. The IRBuilder knows
this and has a method for adding the attribute to function call instructions.
If a function being called has the strictfp attribute itself then the
IRBuilder will refuse to add the attribute to the calling instruction
despite being asked to add it. Eliminate this error.
Differential Revision: https://reviews.llvm.org/D84878
Added:
Modified:
llvm/include/llvm/IR/IRBuilder.h
llvm/unittests/IR/IRBuilderTest.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/IR/IRBuilder.h b/llvm/include/llvm/IR/IRBuilder.h
index d467789132ac..aa0286ab11f9 100644
--- a/llvm/include/llvm/IR/IRBuilder.h
+++ b/llvm/include/llvm/IR/IRBuilder.h
@@ -294,8 +294,7 @@ class IRBuilderBase {
}
void setConstrainedFPCallAttr(CallInst *I) {
- if (!I->hasFnAttr(Attribute::StrictFP))
- I->addAttribute(AttributeList::FunctionIndex, Attribute::StrictFP);
+ I->addAttribute(AttributeList::FunctionIndex, Attribute::StrictFP);
}
void setDefaultOperandBundles(ArrayRef<OperandBundleDef> OpBundles) {
diff --git a/llvm/unittests/IR/IRBuilderTest.cpp b/llvm/unittests/IR/IRBuilderTest.cpp
index fa0e33a07bb4..204e476b8632 100644
--- a/llvm/unittests/IR/IRBuilderTest.cpp
+++ b/llvm/unittests/IR/IRBuilderTest.cpp
@@ -332,6 +332,33 @@ TEST_F(IRBuilderTest, ConstrainedFPIntrinsics) {
EXPECT_EQ(fp::ebStrict, CII->getExceptionBehavior());
}
+TEST_F(IRBuilderTest, ConstrainedFPFunctionCall) {
+ IRBuilder<> Builder(BB);
+
+ // Create an empty constrained FP function.
+ FunctionType *FTy = FunctionType::get(Type::getVoidTy(Ctx),
+ /*isVarArg=*/false);
+ Function *Callee =
+ Function::Create(FTy, Function::ExternalLinkage, "", M.get());
+ BasicBlock *CalleeBB = BasicBlock::Create(Ctx, "", Callee);
+ IRBuilder<> CalleeBuilder(CalleeBB);
+ CalleeBuilder.setIsFPConstrained(true);
+ CalleeBuilder.setConstrainedFPFunctionAttr();
+ CalleeBuilder.CreateRetVoid();
+
+ // Now call the empty constrained FP function.
+ Builder.setIsFPConstrained(true);
+ Builder.setConstrainedFPFunctionAttr();
+ CallInst *FCall = Builder.CreateCall(Callee, None);
+
+ // Check the attributes to verify the strictfp attribute is on the call.
+ EXPECT_TRUE(FCall->getAttributes().getFnAttributes().hasAttribute(
+ Attribute::StrictFP));
+
+ Builder.CreateRetVoid();
+ EXPECT_FALSE(verifyModule(*M));
+}
+
TEST_F(IRBuilderTest, Lifetime) {
IRBuilder<> Builder(BB);
AllocaInst *Var1 = Builder.CreateAlloca(Builder.getInt8Ty());
More information about the llvm-commits
mailing list