See https://github.com/llvm/llvm-project/issues/59866
Reviewed By: sivachandra
Differential Revision: https://reviews.llvm.org/
D143098
// |x| = 0x1.143ec4p0
float sign = x_sign ? -1.0f : 1.0f;
- return fputil::multiply_add(sign, 0x1.ddf9f4p0f, sign * 0x1.1p-24f);
+ // volatile is used to prevent compiler (gcc) from optimizing the
+ // computation, making the results incorrect in different rounding modes.
+ volatile float tmp = 0x1.ddf9f4p0f;
+ tmp = fputil::multiply_add(sign, tmp, sign * 0x1.1p-24f);
+
+ return tmp;
}
// |x| > 0x1.ada6a8p+27f