- friend class BinaryOperator;
- friend class ConstantExpr;
- void setIsExact(bool B) {
- SubclassOptionalData = (SubclassOptionalData & ~IsExact) | (B * IsExact);
+ void setHasUnsafeAlgebra(bool B) {
+ SubclassOptionalData =
+ (SubclassOptionalData & ~UnsafeAlgebra) | (B * UnsafeAlgebra);
+
+ // Unsafe algebra implies all the others
+ if (B) {
+ setHasNoNaNs(true);
+ setHasNoInfs(true);
+ setHasNoSignedZeros(true);
+ setHasAllowReciprocal(true);
+ }
+ }
+ void setHasNoNaNs(bool B) {
+ SubclassOptionalData =
+ (SubclassOptionalData & ~NoNaNs) | (B * NoNaNs);
+ }
+ void setHasNoInfs(bool B) {
+ SubclassOptionalData =
+ (SubclassOptionalData & ~NoInfs) | (B * NoInfs);
+ }
+ void setHasNoSignedZeros(bool B) {
+ SubclassOptionalData =
+ (SubclassOptionalData & ~NoSignedZeros) | (B * NoSignedZeros);
+ }
+ void setHasAllowReciprocal(bool B) {
+ SubclassOptionalData =
+ (SubclassOptionalData & ~AllowReciprocal) | (B * AllowReciprocal);
+ }
+
+ /// Convenience function for setting all the fast-math flags
+ void setFastMathFlags(FastMathFlags FMF) {
+ if (FMF.UnsafeAlgebra) {
+ // Set all the bits to true
+ setHasUnsafeAlgebra(true);
+ return;
+ }
+
+ setHasUnsafeAlgebra(FMF.UnsafeAlgebra);
+ setHasNoNaNs(FMF.NoNaNs);
+ setHasNoInfs(FMF.NoInfs);
+ setHasNoSignedZeros(FMF.NoSignedZeros);
+ setHasAllowReciprocal(FMF.AllowReciprocal);