https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120910
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Last reconfirmed| |2025-07-01 Keywords| |wrong-code Status|UNCONFIRMED |NEW Ever confirmed|0 |1 --- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> --- testl $2139095040, %edx je .L10 vmovss .LC6(%rip), %xmm0 //0x0.8p-24 vcvtps2ph $4, %xmm0, %xmm0 cmpl $-1043857408, %ebx ja .L1 vmovd %ebx, %xmm3 vmovss .LC7(%rip), %xmm0 vcvtps2ph $4, %xmm0, %xmm0 vcomiss .LC2(%rip), %xmm3 ja .L1 ce3 does the move. IF-CASE-1 found, start 6, then 7 rescanning insn with uid = 37. changing bb of uid 39 changing bb of uid 107 from 7 to 6 changing bb of uid 42 from 7 to 6 deleting insn with uid = 91. deleting block 7 Conversion succeeded on pass 1. Confirmed. I suspect the problem is (insn 42 107 36 6 (set (reg:V8HI 20 xmm0 [117]) (vec_concat:V8HI (unspec:V4HI [ (reg:V4SF 20 xmm0 [118]) (const_int 4 [0x4]) ] UNSPEC_VCVTPS2PH) (const_vector:V4HI [ (const_int 0 [0]) repeated x4 ]))) "t56.c":15:40 discrim 1 9621 {*vcvtps2ph} (nil)) is not detected as being able to trap with -ftrapping-math. Note with -fno-trapping-math, this transformation is correct as trapping in this case deals with floating exceptions. So clang not producing any underflow is just pure accident as their setting is off there. And since you are tracking floating exceptions, you need -ftrapping-math.