optabs.c (prepare_float_lib_cmp): Always attach a REG_EQUAL note to the comparison...

* optabs.c (prepare_float_lib_cmp): Always attach a REG_EQUAL note
	to the comparison, as emit_libcall_block calls copy_rtx on equiv.

From-SVN: r72262
This commit is contained in:
Roger Sayle 2003-10-09 12:57:30 +00:00 committed by Roger Sayle
parent 569fa502d1
commit 17796a89ab
2 changed files with 58 additions and 61 deletions

View File

@ -1,3 +1,8 @@
2003-10-09 Roger Sayle <roger@eyesopen.com>
* optabs.c (prepare_float_lib_cmp): Always attach a REG_EQUAL note
to the comparison, as emit_libcall_block calls copy_rtx on equiv.
2003-10-09 Dorit Naishlos <dorit@il.ibm.com>
* haifa-sched.c (ok_for_early_schedule): New function.

View File

@ -3871,70 +3871,62 @@ prepare_float_lib_cmp (rtx *px, rtx *py, enum rtx_code *pcomparison,
y = convert_to_mode (mode, y, 0);
}
/* If we're optimizing attach a REG_EQUAL note describing the semantics
of the libcall to the RTL. The allows the RTL optimizers to delete
the libcall if the condition can be determined at compile-time. */
if (optimize
&& ! side_effects_p (x)
&& ! side_effects_p (y))
/* Attach a REG_EQUAL note describing the semantics of the libcall to
the RTL. The allows the RTL optimizers to delete the libcall if the
condition can be determined at compile-time. */
if (comparison == UNORDERED)
{
if (comparison == UNORDERED)
{
rtx temp = simplify_gen_relational (NE, word_mode, mode, x, x);
equiv = simplify_gen_relational (NE, word_mode, mode, y, y);
equiv = simplify_gen_ternary (IF_THEN_ELSE, word_mode, word_mode,
temp, const_true_rtx, equiv);
}
else
{
equiv = simplify_gen_relational (comparison, word_mode, mode, x, y);
if (! FLOAT_LIB_COMPARE_RETURNS_BOOL (mode, comparison))
{
rtx true_rtx, false_rtx;
switch (comparison)
{
case EQ:
true_rtx = const0_rtx;
false_rtx = const_true_rtx;
break;
case NE:
true_rtx = const_true_rtx;
false_rtx = const0_rtx;
break;
case GT:
true_rtx = const1_rtx;
false_rtx = const0_rtx;
break;
case GE:
true_rtx = const0_rtx;
false_rtx = constm1_rtx;
break;
case LT:
true_rtx = constm1_rtx;
false_rtx = const0_rtx;
break;
case LE:
true_rtx = const0_rtx;
false_rtx = const1_rtx;
break;
default:
abort ();
}
equiv = simplify_gen_ternary (IF_THEN_ELSE, word_mode,
word_mode, equiv,
true_rtx, false_rtx);
}
}
rtx temp = simplify_gen_relational (NE, word_mode, mode, x, x);
equiv = simplify_gen_relational (NE, word_mode, mode, y, y);
equiv = simplify_gen_ternary (IF_THEN_ELSE, word_mode, word_mode,
temp, const_true_rtx, equiv);
}
else
equiv = NULL_RTX;
{
equiv = simplify_gen_relational (comparison, word_mode, mode, x, y);
if (! FLOAT_LIB_COMPARE_RETURNS_BOOL (mode, comparison))
{
rtx true_rtx, false_rtx;
switch (comparison)
{
case EQ:
true_rtx = const0_rtx;
false_rtx = const_true_rtx;
break;
case NE:
true_rtx = const_true_rtx;
false_rtx = const0_rtx;
break;
case GT:
true_rtx = const1_rtx;
false_rtx = const0_rtx;
break;
case GE:
true_rtx = const0_rtx;
false_rtx = constm1_rtx;
break;
case LT:
true_rtx = constm1_rtx;
false_rtx = const0_rtx;
break;
case LE:
true_rtx = const0_rtx;
false_rtx = const1_rtx;
break;
default:
abort ();
}
equiv = simplify_gen_ternary (IF_THEN_ELSE, word_mode, word_mode,
equiv, true_rtx, false_rtx);
}
}
start_sequence ();
value = emit_library_call_value (libfunc, NULL_RTX, LCT_CONST,