------- Comment #4 from hjl dot tools at gmail dot com 2008-09-12 17:53 ------- We can't define FLOAT_STORE_FLAG_VALUE for SSE since we can't represent 0xfffffff as a valid FP value. This patch makes fold_rtx to match simplify_relational_operation:
--- ./cse.c.foo 2008-09-08 10:46:09.000000000 -0700 +++ ./cse.c 2008-09-12 10:46:18.000000000 -0700 @@ -3217,14 +3217,16 @@ fold_rtx (rtx x, rtx insn) rtx true_rtx = const_true_rtx, false_rtx = const0_rtx; enum machine_mode mode_arg1; -#ifdef FLOAT_STORE_FLAG_VALUE if (SCALAR_FLOAT_MODE_P (mode)) { +#ifdef FLOAT_STORE_FLAG_VALUE true_rtx = (CONST_DOUBLE_FROM_REAL_VALUE (FLOAT_STORE_FLAG_VALUE (mode), mode)); +#else + true_rtx = NULL_RTX; +#endif false_rtx = CONST0_RTX (mode); } -#endif code = find_comparison_args (code, &folded_arg0, &folded_arg1, &mode_arg0, &mode_arg1); @@ -3332,8 +3334,17 @@ fold_rtx (rtx x, rtx insn) const_arg1)) || (REG_P (folded_arg1) && (REG_QTY (REGNO (folded_arg1)) == ent->comparison_qty)))) - return (comparison_dominates_p (ent->comparison_code, code) - ? true_rtx : false_rtx); + { + if (comparison_dominates_p (ent->comparison_code, code)) + { + if (true_rtx) + return true_rtx; + else + break; + } + else + return false_rtx; + } } } } -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37489