diff --git a/llvm/include/llvm/IR/IRBuilder.h b/llvm/include/llvm/IR/IRBuilder.h --- a/llvm/include/llvm/IR/IRBuilder.h +++ b/llvm/include/llvm/IR/IRBuilder.h @@ -96,8 +96,14 @@ MDNode *DefaultFPMathTag; FastMathFlags FMF; + /// If set, builder creates constrained floating point operations. bool IsFPConstrained; + + /// Exception behavior used by default for constrained floating point + /// operations. ConstrainedFPIntrinsic::ExceptionBehavior DefaultConstrainedExcept; + + /// Rounding mode used by default for constrained floating point operations. ConstrainedFPIntrinsic::RoundingMode DefaultConstrainedRounding; ArrayRef DefaultOperandBundles; @@ -301,6 +307,36 @@ } }; + // RAII object that stores constrained floating point settings and + // restores them when the object is destroyed. + class FloatingPointStateSaver { + IRBuilderBase &Builder; + bool IsFPConstrainted; + ConstrainedFPIntrinsic::ExceptionBehavior DefaultConstrainedExcept; + ConstrainedFPIntrinsic::RoundingMode DefaultConstrainedRounding; + + public: + FloatingPointStateSaver(IRBuilderBase &Builder) + : Builder(Builder), + IsFPConstrainted(Builder.getIsFPConstrained()), + DefaultConstrainedExcept(Builder.getDefaultConstrainedExcept()), + DefaultConstrainedRounding(Builder.getDefaultConstrainedRounding()) { + } + FloatingPointStateSaver(IRBuilderBase &Builder, bool NewIsFPConstrained, + ConstrainedFPIntrinsic::ExceptionBehavior NewDefaultConstrainedExcept, + ConstrainedFPIntrinsic::RoundingMode NewDefaultConstrainedRounding) + : FloatingPointStateSaver(Builder) { + Builder.setIsFPConstrained(NewIsFPConstrained); + Builder.setDefaultConstrainedExcept(NewDefaultConstrainedExcept); + Builder.setDefaultConstrainedRounding(NewDefaultConstrainedRounding); + } + ~FloatingPointStateSaver() { + Builder.setDefaultConstrainedRounding(DefaultConstrainedRounding); + Builder.setDefaultConstrainedExcept(DefaultConstrainedExcept); + Builder.setIsFPConstrained(IsFPConstrainted); + } + }; + //===--------------------------------------------------------------------===// // Miscellaneous creation methods. //===--------------------------------------------------------------------===// diff --git a/llvm/include/llvm/IR/IntrinsicInst.h b/llvm/include/llvm/IR/IntrinsicInst.h --- a/llvm/include/llvm/IR/IntrinsicInst.h +++ b/llvm/include/llvm/IR/IntrinsicInst.h @@ -212,11 +212,11 @@ /// when constrained floating point is enabled. See the LLVM Language /// Reference Manual for details. enum RoundingMode : uint8_t { - rmDynamic, ///< This corresponds to "fpround.dynamic". rmToNearest, ///< This corresponds to "fpround.tonearest". rmDownward, ///< This corresponds to "fpround.downward". rmUpward, ///< This corresponds to "fpround.upward". - rmTowardZero ///< This corresponds to "fpround.tozero". + rmTowardZero, ///< This corresponds to "fpround.tozero". + rmDynamic ///< This corresponds to "fpround.dynamic". }; /// Specifies the required exception behavior. This is only used when