This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[cond-optab] Teach final about (compare FOO (const_int 0))
- From: Paolo Bonzini <bonzini at gnu dot org>
- To: gcc patches <gcc-patches at gcc dot gnu dot org>
- Date: Wed, 25 Mar 2009 19:01:57 +0100
- Subject: [cond-optab] Teach final about (compare FOO (const_int 0))
This is dual to the combine hunk of yesterday. Since the
notice_cc_update will usually put a register in cc_status.value1 or
cc_status.value2, we have to teach final.c to look into a (compare FOO
(const_int 0)).
* final.c (final_scan_insn): Compare cc_status values
against LHS of a (compare FOO (const_int 0)) cc0 source.
Paolo
Index: ../../final.c
===================================================================
--- ../../final.c (revision 144857)
+++ ../../final.c (working copy)
@@ -2316,6 +2316,7 @@ final_scan_insn (rtx insn, FILE *file, i
&& GET_CODE (SET_DEST (set)) == CC0
&& insn != last_ignored_compare)
{
+ rtx src = SET_SRC (set);
if (GET_CODE (SET_SRC (set)) == SUBREG)
SET_SRC (set) = alter_subreg (&SET_SRC (set));
else if (GET_CODE (SET_SRC (set)) == COMPARE)
@@ -2326,11 +2327,14 @@ final_scan_insn (rtx insn, FILE *file, i
if (GET_CODE (XEXP (SET_SRC (set), 1)) == SUBREG)
XEXP (SET_SRC (set), 1)
= alter_subreg (&XEXP (SET_SRC (set), 1));
+ if (XEXP (SET_SRC (set), 1)
+ == CONST0_RTX (GET_MODE (XEXP (SET_SRC (set), 0))))
+ src = XEXP (SET_SRC (set), 0);
}
if ((cc_status.value1 != 0
- && rtx_equal_p (SET_SRC (set), cc_status.value1))
+ && rtx_equal_p (src, cc_status.value1))
|| (cc_status.value2 != 0
- && rtx_equal_p (SET_SRC (set), cc_status.value2)))
+ && rtx_equal_p (src, cc_status.value2)))
{
/* Don't delete insn if it has an addressing side-effect. */
if (! FIND_REG_INC_NOTE (insn, NULL_RTX)