diff options
author | Zahira Ammarguellat <Zahira.Ammarguellat@intel.com> | 2023-05-31 15:38:20 -0400 |
---|---|---|
committer | Zahira Ammarguellat <Zahira.Ammarguellat@intel.com> | 2023-09-08 09:48:53 -0400 |
commit | 2c93e3c1c8ba70694bc0d3fd71ac90836a147f2d (patch) | |
tree | b421a22c87343efdb3979efedb83e22f7b26fd27 /clang/lib/CodeGen/CGCall.cpp | |
parent | 77054f3946161ea43b67a623f33d4647e5c850fc (diff) | |
download | llvm-2c93e3c1c8ba70694bc0d3fd71ac90836a147f2d.zip llvm-2c93e3c1c8ba70694bc0d3fd71ac90836a147f2d.tar.gz llvm-2c93e3c1c8ba70694bc0d3fd71ac90836a147f2d.tar.bz2 |
Take math-errno into account with '#pragma float_control(precise,on)' and
'attribute__((optnone)).
Differential Revision: https://reviews.llvm.org/D151834
Diffstat (limited to 'clang/lib/CodeGen/CGCall.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGCall.cpp | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp index 37de280..e15a463 100644 --- a/clang/lib/CodeGen/CGCall.cpp +++ b/clang/lib/CodeGen/CGCall.cpp @@ -2279,6 +2279,17 @@ static llvm::FPClassTest getNoFPClassTestMask(const LangOptions &LangOpts) { return Mask; } +void CodeGenModule::AdjustMemoryAttribute(StringRef Name, + CGCalleeInfo CalleeInfo, + llvm::AttributeList &Attrs) { + if (Attrs.getMemoryEffects().getModRef() == llvm::ModRefInfo::NoModRef) { + Attrs = Attrs.removeFnAttribute(getLLVMContext(), llvm::Attribute::Memory); + llvm::Attribute MemoryAttr = llvm::Attribute::getWithMemoryEffects( + getLLVMContext(), llvm::MemoryEffects::writeOnly()); + Attrs = Attrs.addFnAttribute(getLLVMContext(), MemoryAttr); + } +} + /// Construct the IR attribute list of a function or call. /// /// When adding an attribute, please consider where it should be handled: @@ -5501,11 +5512,18 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo, /*AttrOnCallSite=*/true, /*IsThunk=*/false); - if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(CurFuncDecl)) + if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(CurFuncDecl)) { if (FD->hasAttr<StrictFPAttr>()) // All calls within a strictfp function are marked strictfp Attrs = Attrs.addFnAttribute(getLLVMContext(), llvm::Attribute::StrictFP); + // If -ffast-math is enabled and the function is guarded by an + // '__attribute__((optnone)) adjust the memory attribute so the BE emits the + // library call instead of the intrinsic. + if (FD->hasAttr<OptimizeNoneAttr>() && getLangOpts().FastMath) + CGM.AdjustMemoryAttribute(CalleePtr->getName(), Callee.getAbstractInfo(), + Attrs); + } // Add call-site nomerge attribute if exists. if (InNoMergeAttributedStmt) Attrs = Attrs.addFnAttribute(getLLVMContext(), llvm::Attribute::NoMerge); |