[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.

Differential Revision: https://reviews.llvm.org/D93134
This commit is contained in:
Kevin P. Neal 2020-12-15 12:35:46 -05:00
parent aa63e17626
commit 67a1ffd88a
2 changed files with 48 additions and 6 deletions

View File

@ -0,0 +1,37 @@
// RUN: %clang_cc1 -triple armv7-apple-unknown -ffp-exception-behavior=strict -fexperimental-strict-floating-point -emit-llvm -o - %s -fexceptions -fsjlj-exceptions -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 }

View File

@ -301,7 +301,7 @@ public:
}
}
void setConstrainedFPCallAttr(CallInst *I) {
void setConstrainedFPCallAttr(CallBase *I) {
I->addAttribute(AttributeList::FunctionIndex, Attribute::StrictFP);
}
@ -1023,16 +1023,21 @@ public:
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,