https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79341
--- Comment #41 from Dominik Vogt <vogt at linux dot vnet.ibm.com> ---
> The first loop loops until add is -1.000000E+12, at which point for the
> first time tem is -9.223373E+18 and thus different from -9.223372E+18, and
> -9.223373E+18 should not be representable in signed long.
> Do you perhaps use HW dfp rather than software emulation?
Well, just what the test driver used:
... -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects
-fsanitize=float-cast-overflow -fsanitize-recover=float-cast-overflow
-DUSE_INT128 -DUSE_DFP -DBROKEN_DECIMAL_INT128 -lm -m64 ...
When the comparison is done in main, the values "min" and "tem" have 64-Bit
precision. The actual comparison is
if (tem.0_1 != -9223372036854775808)
Which is true because that value doesn't fit in a _Decimal32. The if body is
executed, and "tem" is converted to 32 bit format and stored in %f0. Gdb says
that the converted value is exactly the same as the value of "min", and that
seems to be the cause of the test failure.
In assembly:
ste %f2,160(%r15) <---- store "tem" on stack
le %f2,160(%r15) <---- load "tem" from stack
ldetr %f2,%f2,0 <---- convert "short" dfp value to "long"
cdtr %f2,%f4 <---- compare with "min"
je .L33
le %f0,160(%r15) <---- reload "tem"
brasl %r14,cvt_sl_d32
This must look differently for you. Now, why does the test fail for me but not
for you?