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> 2007-03-16 Alexandre Oliva <aoliva@redhat.com>
* configure.ac: Remove excess quoting from asm line 0 test. * 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, ...@@ -2291,6 +2291,76 @@ final_scan_insn (rtx insn, FILE *file, int optimize ATTRIBUTE_UNUSED,
INSN_CODE (insn) = -1; 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 /* Make same adjustments to instructions that examine the
condition codes without jumping and instructions that condition codes without jumping and instructions that
handle conditional moves (if this machine has either one). */ 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