x86: support -Ofast
Discussion on the implications of adding -Ofast support to binutils, particularly regarding its relaxation of strict commutativity and NaN handling.
Jan Beulich discusses the implications of adding -Ofast support to binutils, relating it to GCC’s -Ofast option. The conversation touches on how -Ofast relaxes constraints on instruction commutativity, especially concerning NaN handling in floating-point operations. It also explores whether this option should also control optimizations for NOP-like instructions, like the XCHG to MOV transformation.
- proposer
Proposes adding -Ofast support to binutils, explaining its analogy to GCC's option and its relaxation of NaN-related commutativity constraints.
“With this I was trying to offer a compromise on the earlier discussion regarding the XCHG -> MOV optimization. It was certainly my expectation that ...”
- reviewer
Engages in the discussion about -Ofast, its connection to commutativity and NaN handling, and the potential renaming of the control variable to encompass NOP-like instruction optimizations.
Technical Tradeoffs
- Balancing aggressive optimization with strict standards compliance.
- Defining the scope of the -Ofast flag in the assembler.
- Potential impact on program correctness due to relaxed constraints.
In Details
This thread discusses the addition of the -Ofast optimization level to the GNU Assembler for x86. The discussion draws parallels with GCC's -Ofast flag, which permits aggressive optimizations that may violate strict standards compliance, such as those related to floating-point NaN (Not a Number) handling and instruction commutativity. A key point of debate is whether this new assembler option should also control optimizations for instructions that are effectively NOPs in certain contexts, like the XCHG to MOV transformation.
- -Ofast
- An optimization level flag for compilers and assemblers that enables aggressive optimizations, potentially at the cost of strict adherence to floating-point standards or other language specifications. It may relax constraints on instruction ordering and commutativity.
- NaN
- Not a Number. A special floating-point value used to represent undefined or unrepresentable results, such as the result of 0/0.
- Commutativity
- A property of an operation where the order of operands does not affect the result (e.g., a + b = b + a). Floating-point operations may not be strictly commutative due to NaN handling or precision issues.
- XCHG
- An x86 assembly instruction that exchanges the contents of two operands (e.g., a register and memory).
- MOV
- An x86 assembly instruction that copies data from a source operand to a destination operand.
- NOP
- No Operation. An instruction that does nothing and simply advances the instruction pointer. Sometimes, other instructions can be optimized into NOPs or replaced by NOPs.