Commit 604e4ce3 by Kazu Hirata Committed by Kazu Hirata

final.c (final_scan_insn): Alter the condition of a conditional trap if we have nonstandard CC.

	* final.c (final_scan_insn): Alter the condition of a
	conditional trap if we have nonstandard CC.

From-SVN: r123021
parent 259b41c1
2007-03-17 Kazu Hirata <kazu@codesourcery.com>
* final.c (final_scan_insn): Alter the condition of a
conditional trap if we have nonstandard CC.
2007-03-16 Alexandre Oliva <aoliva@redhat.com>
* configure.ac: Remove excess quoting from asm line 0 test.
......
......@@ -2291,6 +2291,76 @@ final_scan_insn (rtx insn, FILE *file, int optimize ATTRIBUTE_UNUSED,
INSN_CODE (insn) = -1;
}
/* If this is a conditional trap, maybe modify it if the cc's
are in a nonstandard state so that it accomplishes the same
thing that it would do straightforwardly if the cc's were
set up normally. */
if (cc_status.flags != 0
&& NONJUMP_INSN_P (insn)
&& GET_CODE (body) == TRAP_IF
&& COMPARISON_P (TRAP_CONDITION (body))
&& XEXP (TRAP_CONDITION (body), 0) == cc0_rtx)
{
/* This function may alter the contents of its argument
and clear some of the cc_status.flags bits.
It may also return 1 meaning condition now always true
or -1 meaning condition now always false
or 2 meaning condition nontrivial but altered. */
int result = alter_cond (TRAP_CONDITION (body));
/* If TRAP_CONDITION has become always false, delete the
instruction. */
if (result == -1)
{
delete_insn (insn);
break;
}
/* If TRAP_CONDITION has become always true, replace
TRAP_CONDITION with const_true_rtx. */
if (result == 1)
TRAP_CONDITION (body) = const_true_rtx;
/* Rerecognize the instruction if it has changed. */
if (result != 0)
INSN_CODE (insn) = -1;
}
/* If this is a conditional trap, maybe modify it if the cc's
are in a nonstandard state so that it accomplishes the same
thing that it would do straightforwardly if the cc's were
set up normally. */
if (cc_status.flags != 0
&& NONJUMP_INSN_P (insn)
&& GET_CODE (body) == TRAP_IF
&& COMPARISON_P (TRAP_CONDITION (body))
&& XEXP (TRAP_CONDITION (body), 0) == cc0_rtx)
{
/* This function may alter the contents of its argument
and clear some of the cc_status.flags bits.
It may also return 1 meaning condition now always true
or -1 meaning condition now always false
or 2 meaning condition nontrivial but altered. */
int result = alter_cond (TRAP_CONDITION (body));
/* If TRAP_CONDITION has become always false, delete the
instruction. */
if (result == -1)
{
delete_insn (insn);
break;
}
/* If TRAP_CONDITION has become always true, replace
TRAP_CONDITION with const_true_rtx. */
if (result == 1)
TRAP_CONDITION (body) = const_true_rtx;
/* Rerecognize the instruction if it has changed. */
if (result != 0)
INSN_CODE (insn) = -1;
}
/* Make same adjustments to instructions that examine the
condition codes without jumping and instructions that
handle conditional moves (if this machine has either one). */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment