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. //===--------------------------------------------------------------------===//