I was fiddling in Compiler Explorer, and I found that the order of arguments passed to std::min changes the emitted assembly.
Here\'s the example on Godbolt Compiler Expl
To expand on the existing answers that say std::min
isn't commutative: Here's a concrete example that reliably distinguishes std_min_xy
from std_min_yx
. Godbolt:
bool distinguish1() {
return 1 / std_min_xy(0.0, -0.0) > 0.0;
}
bool distinguish2() {
return 1 / std_min_yx(0.0, -0.0) > 0.0;
}
distinguish1()
evaluates to 1 / 0.0 > 0.0
, i.e. INFTY > 0.0
, or true
.
distinguish2()
evaluates to 1 / -0.0 > 0.0
, i.e. -INFTY > 0.0
, or false
.
(All this under IEEE rules, of course. I don't think the C++ standard mandates that compilers preserve this particular behavior. Honestly I was surprised that the expression -0.0
actually evaluated to a negative zero in the first place!
-ffinite-math-only eliminates this way of telling the difference, and -ffinite-math-only -funsafe-math-optimizations completely eliminates the difference in codegen.