https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108447
--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Seems relations are just the VREL_VARYING = 0, // No known relation, AKA varying. VREL_UNDEFINED, // Impossible relation, ie (r1 < r2) && (r2 > r1) VREL_LT, // r1 < r2 VREL_LE, // r1 <= r2 VREL_GT, // r1 > r2 VREL_GE, // r1 >= r2 VREL_EQ, // r1 == r2 VREL_NE, // r1 != r2 and some special ones and we just union/intersect those, the information whether it was a floating point 4 state relation or integral 3 state is lost. So, either we should punt on the relations for now if the comparison operands are floating point that honor NANs, or we need a way to differentiate between integral/pointer and floating point relations (and for the latter perhaps be able to express the various others, like LTGT, UNLT, UNLE, UNGE, UNGT, UNEQ, UNNE etc.). Aldy/Andrew, can you please have a look? Thanks.