Index: include/llvm/IR/Operator.h =================================================================== --- include/llvm/IR/Operator.h +++ include/llvm/IR/Operator.h @@ -207,17 +207,24 @@ bool isFast() const { return all(); } /// Flag setters - void setAllowReassoc() { Flags |= AllowReassoc; } - void setNoNaNs() { Flags |= NoNaNs; } - void setNoInfs() { Flags |= NoInfs; } - void setNoSignedZeros() { Flags |= NoSignedZeros; } - void setAllowReciprocal() { Flags |= AllowReciprocal; } - // TODO: Change the other set* functions to take a parameter? - void setAllowContract(bool B) { + void setAllowReassoc(bool B = true) { + Flags = (Flags & ~AllowReassoc) | B * AllowReassoc; + } + void setNoNaNs(bool B = true) { Flags = (Flags & ~NoNaNs) | B * NoNaNs; } + void setNoInfs(bool B = true) { Flags = (Flags & ~NoInfs) | B * NoInfs; } + void setNoSignedZeros(bool B = true) { + Flags = (Flags & ~NoSignedZeros) | B * NoSignedZeros; + } + void setAllowReciprocal(bool B = true) { + Flags = (Flags & ~AllowReciprocal) | B * AllowReciprocal; + } + void setAllowContract(bool B = true) { Flags = (Flags & ~AllowContract) | B * AllowContract; } - void setApproxFunc() { Flags |= ApproxFunc; } - void setFast() { set(); } + void setApproxFunc(bool B = true) { + Flags = (Flags & ~ApproxFunc) | B * ApproxFunc; + } + void setFast(bool B = true) { B ? set() : clear(); } void operator&=(const FastMathFlags &OtherFlags) { Flags &= OtherFlags.Flags;