reload1.c (move2add_last_cc0): New.

* reload1.c (move2add_last_cc0): New.
	(reload_cse_move2add): Detect implicit sets.
	(move2add_note_store): Notice a store into cc0.

From-SVN: r65754
This commit is contained in:
Kazu Hirata 2003-04-17 21:42:19 +00:00 committed by Kazu Hirata
parent 220a35cc8e
commit a211395bbb
2 changed files with 40 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2003-04-17 Kazu Hirata <kazu@cs.umass.edu>
* reload1.c (move2add_last_cc0): New.
(reload_cse_move2add): Detect implicit sets.
(move2add_note_store): Notice a store into cc0.
2003-04-17 Roger Sayle <roger@eyesopen.com> 2003-04-17 Roger Sayle <roger@eyesopen.com>
PR c/10375 PR c/10375

View File

@ -9094,6 +9094,9 @@ static int move2add_last_label_luid;
&& TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (OUTMODE), \ && TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (OUTMODE), \
GET_MODE_BITSIZE (INMODE)))) GET_MODE_BITSIZE (INMODE))))
/* The source of the last set to cc0 we've seen. */
static rtx move2add_last_cc0;
static void static void
reload_cse_move2add (first) reload_cse_move2add (first)
rtx first; rtx first;
@ -9106,6 +9109,7 @@ reload_cse_move2add (first)
move2add_last_label_luid = 0; move2add_last_label_luid = 0;
move2add_luid = 2; move2add_luid = 2;
move2add_last_cc0 = NULL_RTX;
for (insn = first; insn; insn = NEXT_INSN (insn), move2add_luid++) for (insn = first; insn; insn = NEXT_INSN (insn), move2add_luid++)
{ {
rtx pat, note; rtx pat, note;
@ -9288,6 +9292,29 @@ reload_cse_move2add (first)
} }
} }
note_stores (PATTERN (insn), move2add_note_store, NULL); note_stores (PATTERN (insn), move2add_note_store, NULL);
/* If INSN is a conditional branch, we try to extract an
implicit set out of it. */
if (any_condjump_p (insn) && onlyjump_p (insn))
{
rtx cnd = get_condition (insn, NULL);
#ifdef HAVE_cc0
if (cnd != NULL_RTX && move2add_last_cc0 != NULL_RTX)
cnd = simplify_replace_rtx (cnd, cc0_rtx, move2add_last_cc0);
#endif
if (cnd != NULL_RTX
&& GET_CODE (cnd) == NE
&& GET_CODE (XEXP (cnd, 0)) == REG
&& SCALAR_INT_MODE_P (GET_MODE (XEXP (cnd, 0)))
&& GET_CODE (XEXP (cnd, 1)) == CONST_INT)
{
rtx implicit_set =
gen_rtx_SET (VOIDmode, SET_DEST (cnd), SET_SRC (cnd));
move2add_note_store (SET_DEST (implicit_set), implicit_set, 0);
}
}
/* If this is a CALL_INSN, all call used registers are stored with /* If this is a CALL_INSN, all call used registers are stored with
unknown values. */ unknown values. */
if (GET_CODE (insn) == CALL_INSN) if (GET_CODE (insn) == CALL_INSN)
@ -9334,6 +9361,13 @@ move2add_note_store (dst, set, data)
reg_set_luid[REGNO (XEXP (dst, 0))] = 0; reg_set_luid[REGNO (XEXP (dst, 0))] = 0;
return; return;
} }
/* Note a store into cc0 so that we can later find an implicit
set. */
if (CC0_P (dst))
{
move2add_last_cc0 = SET_SRC (set);
return;
}
if (GET_CODE (dst) != REG) if (GET_CODE (dst) != REG)
return; return;