diff options
author | kazu <kazu@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-03-17 11:43:07 +0000 |
---|---|---|
committer | kazu <kazu@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-03-17 11:43:07 +0000 |
commit | f8df4da220f65154d9da3ac31612c897b9a30905 (patch) | |
tree | 99a02ae06f9011d2c2dd649b42b386cd85246bb2 /gcc/final.c | |
parent | 74465368365bb56794e109253380e7bcce3896a1 (diff) | |
download | gcc-f8df4da220f65154d9da3ac31612c897b9a30905.tar.gz |
* final.c (final_scan_insn): Alter the condition of a
conditional trap if we have nonstandard CC.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@123021 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/final.c')
-rw-r--r-- | gcc/final.c | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/gcc/final.c b/gcc/final.c index 93112ec808b..a18f0299d4a 100644 --- a/gcc/final.c +++ b/gcc/final.c @@ -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). */ |