From: Michael Beck Date: Mon, 20 Jun 2005 09:05:01 +0000 (+0000) Subject: BugFix: tarval_cmp(NaN, NaN) was wrongly evaluated to Eq, now is evaluated to Uo X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=3c13a8360c3d732fd07290419afadf7bb87707e9;p=libfirm BugFix: tarval_cmp(NaN, NaN) was wrongly evaluated to Eq, now is evaluated to Uo as needed for IEEE-754 [r6072] --- diff --git a/ir/tv/tv.c b/ir/tv/tv.c index b690fd1f1..816b38dcb 100644 --- a/ir/tv/tv.c +++ b/ir/tv/tv.c @@ -783,10 +783,16 @@ pn_Cmp tarval_cmp(tarval *a, tarval *b) assert(a); assert(b); - if (a == tarval_bad || b == tarval_bad) assert(0 && "Comparison with tarval_bad"); - if (a == tarval_undefined || b == tarval_undefined) return pn_Cmp_False; - if (a == b) return pn_Cmp_Eq; - if (a->mode != b->mode) return pn_Cmp_False; + if (a == tarval_bad || b == tarval_bad) { + assert(0 && "Comparison with tarval_bad"); + return pn_Cmp_False; + } + + if (a == tarval_undefined || b == tarval_undefined) + return pn_Cmp_False; + + if (a->mode != b->mode) + return pn_Cmp_False; if (get_mode_n_vector_elems(a->mode) > 1) { /* vector arithmetic not implemented yet */ @@ -800,9 +806,15 @@ pn_Cmp tarval_cmp(tarval *a, tarval *b) case irms_memory: case irms_auxiliary: case irms_reference: + if (a == b) + return pn_Cmp_Eq; return pn_Cmp_False; case irms_float_number: + /* + * BEWARE: we cannot compare a == b here, because + * a NaN is always Unordered to any other value, even to itself! + */ switch (fc_comp(a->value, b->value)) { case -1: return pn_Cmp_Lt; case 0: assert(0 && "different tarvals compare equal"); return pn_Cmp_Eq; @@ -812,9 +824,13 @@ pn_Cmp tarval_cmp(tarval *a, tarval *b) } case irms_int_number: case irms_character: + if (a == b) + return pn_Cmp_Eq; return sc_comp(a->value, b->value) == 1 ? pn_Cmp_Gt : pn_Cmp_Lt; case irms_internal_boolean: + if (a == b) + return pn_Cmp_Eq; return a == tarval_b_true ? pn_Cmp_Gt : pn_Cmp_Lt; } return pn_Cmp_False;