diff options
| author | Melanie Blower <melanie.blower@intel.com> | 2019-11-05 13:41:21 -0800 |
|---|---|---|
| committer | Melanie Blower <melanie.blower@intel.com> | 2019-11-07 07:22:45 -0800 |
| commit | af57dbf12e54f3a8ff48534bf1078f4de104c1cd (patch) | |
| tree | c5ae577882a5e6750c379d1735cdc423b88ce83c /clang/lib/CodeGen/CodeGenFunction.cpp | |
| parent | de61aa3118b9bac85c468ea7ec40604a086744f5 (diff) | |
Add support for options -frounding-math, ftrapping-math, -ffp-model=, and -ffp-exception-behavior=
Add options to control floating point behavior: trapping and
exception behavior, rounding, and control of optimizations that affect
floating point calculations. More details in UsersManual.rst.
Reviewers: rjmccall
Differential Revision: https://reviews.llvm.org/D62731
Diffstat (limited to 'clang/lib/CodeGen/CodeGenFunction.cpp')
| -rw-r--r-- | clang/lib/CodeGen/CodeGenFunction.cpp | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp index 89dd06948baa..b7f70b8aa5c0 100644 --- a/clang/lib/CodeGen/CodeGenFunction.cpp +++ b/clang/lib/CodeGen/CodeGenFunction.cpp @@ -33,6 +33,7 @@ #include "clang/Frontend/FrontendDiagnostic.h" #include "llvm/IR/DataLayout.h" #include "llvm/IR/Dominators.h" +#include "llvm/IR/IntrinsicInst.h" #include "llvm/IR/Intrinsics.h" #include "llvm/IR/MDBuilder.h" #include "llvm/IR/Operator.h" @@ -87,6 +88,7 @@ CodeGenFunction::CodeGenFunction(CodeGenModule &cgm, bool suppressNewContext) FMF.setAllowReassoc(); } Builder.setFastMathFlags(FMF); + SetFPModel(); } CodeGenFunction::~CodeGenFunction() { @@ -102,6 +104,59 @@ CodeGenFunction::~CodeGenFunction() { CGM.getOpenMPRuntime().functionFinished(*this); } +// Map the LangOption for rounding mode into +// the corresponding enum in the IR. +static llvm::ConstrainedFPIntrinsic::RoundingMode ToConstrainedRoundingMD( + LangOptions::FPRoundingModeKind Kind) { + + switch (Kind) { + case LangOptions::FPR_ToNearest: + return llvm::ConstrainedFPIntrinsic::rmToNearest; + case LangOptions::FPR_Downward: + return llvm::ConstrainedFPIntrinsic::rmDownward; + case LangOptions::FPR_Upward: + return llvm::ConstrainedFPIntrinsic::rmUpward; + case LangOptions::FPR_TowardZero: + return llvm::ConstrainedFPIntrinsic::rmTowardZero; + case LangOptions::FPR_Dynamic: + return llvm::ConstrainedFPIntrinsic::rmDynamic; + } + llvm_unreachable("Unsupported FP RoundingMode"); +} + +// Map the LangOption for exception behavior into +// the corresponding enum in the IR. +static llvm::ConstrainedFPIntrinsic::ExceptionBehavior ToConstrainedExceptMD( + LangOptions::FPExceptionModeKind Kind) { + + switch (Kind) { + case LangOptions::FPE_Ignore: + return llvm::ConstrainedFPIntrinsic::ebIgnore; + case LangOptions::FPE_MayTrap: + return llvm::ConstrainedFPIntrinsic::ebMayTrap; + case LangOptions::FPE_Strict: + return llvm::ConstrainedFPIntrinsic::ebStrict; + } + llvm_unreachable("Unsupported FP Exception Behavior"); +} + +void CodeGenFunction::SetFPModel() { + auto fpRoundingMode = ToConstrainedRoundingMD( + getLangOpts().getFPRoundingMode()); + auto fpExceptionBehavior = ToConstrainedExceptMD( + getLangOpts().getFPExceptionMode()); + + if (fpExceptionBehavior == llvm::ConstrainedFPIntrinsic::ebIgnore && + fpRoundingMode == llvm::ConstrainedFPIntrinsic::rmToNearest) + // Constrained intrinsics are not used. + ; + else { + Builder.setIsFPConstrained(true); + Builder.setDefaultConstrainedRounding(fpRoundingMode); + Builder.setDefaultConstrainedExcept(fpExceptionBehavior); + } +} + CharUnits CodeGenFunction::getNaturalPointeeTypeAlignment(QualType T, LValueBaseInfo *BaseInfo, TBAAAccessInfo *TBAAInfo) { |
