Author: Kevin P. Neal Date: 2020-12-18T12:42:06-05:00 New Revision: 7fef551cb123d9f1956f8ec7a142bd8a63d25fa9
URL: https://github.com/llvm/llvm-project/commit/7fef551cb123d9f1956f8ec7a142bd8a63d25fa9 DIFF: https://github.com/llvm/llvm-project/commit/7fef551cb123d9f1956f8ec7a142bd8a63d25fa9.diff LOG: Revert "Revert "[FPEnv] Teach the IRBuilder about invoke's correct use of the strictfp attribute."" Similar to D69312, and documented in D69839, the IRBuilder needs to add the strictfp attribute to invoke instructions when constrained floating point is enabled. This is try 2, with the test corrected. Differential Revision: https://reviews.llvm.org/D93134 Added: clang/test/CodeGen/exceptions-strictfp.c Modified: llvm/include/llvm/IR/IRBuilder.h Removed: ################################################################################ diff --git a/clang/test/CodeGen/exceptions-strictfp.c b/clang/test/CodeGen/exceptions-strictfp.c new file mode 100644 index 000000000000..6f9e9f891b6c --- /dev/null +++ b/clang/test/CodeGen/exceptions-strictfp.c @@ -0,0 +1,37 @@ +// RUN: %clang_cc1 -triple armv7-apple-unknown -ffp-exception-behavior=strict -fexperimental-strict-floating-point -emit-llvm -o - %s -fexceptions -exception-model=sjlj -fblocks | FileCheck %s + +// Verify strictfp attributes on invoke calls (and therefore also on +// function definitions). + +// rdar://problem/8621849 +void test1() { + extern void test1_helper(void (^)(int)); + + // CHECK: define arm_aapcscc void @test1() [[STRICTFP0:#[0-9]+]] personality i8* bitcast (i32 (...)* @__gcc_personality_sj0 to i8*) + + __block int x = 10; + + // CHECK: invoke arm_aapcscc void @test1_helper({{.*}}) [[STRICTFP1:#[0-9]+]] + test1_helper(^(int v) { x = v; }); + + // CHECK: landingpad { i8*, i32 } + // CHECK-NEXT: cleanup +} + +void test2_helper(); +void test2() { + // CHECK: define arm_aapcscc void @test2() [[STRICTFP0]] personality i8* bitcast (i32 (...)* @__gcc_personality_sj0 to i8*) { + __block int x = 10; + ^{ (void)x; }; + + // CHECK: invoke arm_aapcscc void @test2_helper({{.*}}) [[STRICTFP1:#[0-9]+]] + test2_helper(5, 6, 7); + + // CHECK: landingpad { i8*, i32 } + // CHECK-NEXT: cleanup +} +void test2_helper(int x, int y) { +} + +// CHECK: attributes [[STRICTFP0]] = { {{.*}}strictfp{{.*}} } +// CHECK: attributes [[STRICTFP1]] = { strictfp } diff --git a/llvm/include/llvm/IR/IRBuilder.h b/llvm/include/llvm/IR/IRBuilder.h index 56005b26a538..6bc5e89453ad 100644 --- a/llvm/include/llvm/IR/IRBuilder.h +++ b/llvm/include/llvm/IR/IRBuilder.h @@ -350,7 +350,7 @@ class IRBuilderBase { } } - void setConstrainedFPCallAttr(CallInst *I) { + void setConstrainedFPCallAttr(CallBase *I) { I->addAttribute(AttributeList::FunctionIndex, Attribute::StrictFP); } @@ -1088,16 +1088,21 @@ class IRBuilderBase { ArrayRef<Value *> Args, ArrayRef<OperandBundleDef> OpBundles, const Twine &Name = "") { - return Insert( - InvokeInst::Create(Ty, Callee, NormalDest, UnwindDest, Args, OpBundles), - Name); + InvokeInst *II = + InvokeInst::Create(Ty, Callee, NormalDest, UnwindDest, Args, OpBundles); + if (IsFPConstrained) + setConstrainedFPCallAttr(II); + return Insert(II, Name); } InvokeInst *CreateInvoke(FunctionType *Ty, Value *Callee, BasicBlock *NormalDest, BasicBlock *UnwindDest, ArrayRef<Value *> Args = None, const Twine &Name = "") { - return Insert(InvokeInst::Create(Ty, Callee, NormalDest, UnwindDest, Args), - Name); + InvokeInst *II = + InvokeInst::Create(Ty, Callee, NormalDest, UnwindDest, Args); + if (IsFPConstrained) + setConstrainedFPCallAttr(II); + return Insert(II, Name); } InvokeInst *CreateInvoke(FunctionCallee Callee, BasicBlock *NormalDest, _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits