Commit 907deb1a by Bernd Schmidt Committed by Bernd Schmidt

ifcvt.c (dead_or_predicable): Use df_simulate_find_defs and…

ifcvt.c (dead_or_predicable): Use df_simulate_find_defs and df_simulate_find_noclobber_defs as appropriate.

	* ifcvt.c (dead_or_predicable): Use df_simulate_find_defs and
	df_simulate_find_noclobber_defs as appropriate.  Keep track of an
	extra set merge_set_noclobber, and use it to relax the final test
	slightly.
	* df.h (df_simulate_find_noclobber_defs): Declare.
	* df-problems.c (df_simulate_find_defs): Don't ignore partial or
	conditional defs.
	(df_simulate_find_noclobber_defs): New function.

From-SVN: r158639
parent ed277997
2010-04-22 Bernd Schmidt <bernds@codesourcery.com>
* ifcvt.c (dead_or_predicable): Use df_simulate_find_defs and
df_simulate_find_noclobber_defs as appropriate. Keep track of an
extra set merge_set_noclobber, and use it to relax the final test
slightly.
* df.h (df_simulate_find_noclobber_defs): Declare.
* df-problems.c (df_simulate_find_defs): Don't ignore partial or
conditional defs.
(df_simulate_find_noclobber_defs): New function.
2010-04-22 Uros Bizjak <ubizjak@gmail.com> 2010-04-22 Uros Bizjak <ubizjak@gmail.com>
* config/i386/i386.md: Use {} around multi-line preparation statements. * config/i386/i386.md: Use {} around multi-line preparation statements.
......
...@@ -3745,9 +3745,22 @@ df_simulate_find_defs (rtx insn, bitmap defs) ...@@ -3745,9 +3745,22 @@ df_simulate_find_defs (rtx insn, bitmap defs)
for (def_rec = DF_INSN_UID_DEFS (uid); *def_rec; def_rec++) for (def_rec = DF_INSN_UID_DEFS (uid); *def_rec; def_rec++)
{ {
df_ref def = *def_rec; df_ref def = *def_rec;
/* If the def is to only part of the reg, it does bitmap_set_bit (defs, DF_REF_REGNO (def));
not kill the other defs that reach here. */ }
if (!(DF_REF_FLAGS (def) & (DF_REF_PARTIAL | DF_REF_CONDITIONAL))) }
/* Find the set of real DEFs, which are not clobbers, for INSN. */
void
df_simulate_find_noclobber_defs (rtx insn, bitmap defs)
{
df_ref *def_rec;
unsigned int uid = INSN_UID (insn);
for (def_rec = DF_INSN_UID_DEFS (uid); *def_rec; def_rec++)
{
df_ref def = *def_rec;
if (!(DF_REF_FLAGS (def) & (DF_REF_MUST_CLOBBER | DF_REF_MAY_CLOBBER)))
bitmap_set_bit (defs, DF_REF_REGNO (def)); bitmap_set_bit (defs, DF_REF_REGNO (def));
} }
} }
...@@ -3939,7 +3952,7 @@ df_simulate_one_insn_forwards (basic_block bb, rtx insn, bitmap live) ...@@ -3939,7 +3952,7 @@ df_simulate_one_insn_forwards (basic_block bb, rtx insn, bitmap live)
while here the scan is performed forwards! So, first assume that the while here the scan is performed forwards! So, first assume that the
def is live, and if this is not true REG_UNUSED notes will rectify the def is live, and if this is not true REG_UNUSED notes will rectify the
situation. */ situation. */
df_simulate_find_defs (insn, live); df_simulate_find_noclobber_defs (insn, live);
/* Clear all of the registers that go dead. */ /* Clear all of the registers that go dead. */
for (link = REG_NOTES (insn); link; link = XEXP (link, 1)) for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
......
...@@ -978,6 +978,7 @@ extern void df_note_add_problem (void); ...@@ -978,6 +978,7 @@ extern void df_note_add_problem (void);
extern void df_md_add_problem (void); extern void df_md_add_problem (void);
extern void df_md_simulate_artificial_defs_at_top (basic_block, bitmap); extern void df_md_simulate_artificial_defs_at_top (basic_block, bitmap);
extern void df_md_simulate_one_insn (basic_block, rtx, bitmap); extern void df_md_simulate_one_insn (basic_block, rtx, bitmap);
extern void df_simulate_find_noclobber_defs (rtx, bitmap);
extern void df_simulate_find_defs (rtx, bitmap); extern void df_simulate_find_defs (rtx, bitmap);
extern void df_simulate_defs (rtx, bitmap); extern void df_simulate_defs (rtx, bitmap);
extern void df_simulate_uses (rtx, bitmap); extern void df_simulate_uses (rtx, bitmap);
......
...@@ -3994,7 +3994,7 @@ dead_or_predicable (basic_block test_bb, basic_block merge_bb, ...@@ -3994,7 +3994,7 @@ dead_or_predicable (basic_block test_bb, basic_block merge_bb,
that any registers modified are dead at the branch site. */ that any registers modified are dead at the branch site. */
rtx insn, cond, prev; rtx insn, cond, prev;
bitmap merge_set, test_live, test_set; bitmap merge_set, merge_set_noclobber, test_live, test_set;
unsigned i, fail = 0; unsigned i, fail = 0;
bitmap_iterator bi; bitmap_iterator bi;
...@@ -4030,11 +4030,14 @@ dead_or_predicable (basic_block test_bb, basic_block merge_bb, ...@@ -4030,11 +4030,14 @@ dead_or_predicable (basic_block test_bb, basic_block merge_bb,
/* Collect: /* Collect:
MERGE_SET = set of registers set in MERGE_BB MERGE_SET = set of registers set in MERGE_BB
MERGE_SET_NOCLOBBER = like MERGE_SET, but only includes registers
that are really set, not just clobbered.
TEST_LIVE = set of registers live at EARLIEST TEST_LIVE = set of registers live at EARLIEST
TEST_SET = set of registers set between EARLIEST and the TEST_SET = set of registers set between EARLIEST and the
end of the block. */ end of the block. */
merge_set = BITMAP_ALLOC (&reg_obstack); merge_set = BITMAP_ALLOC (&reg_obstack);
merge_set_noclobber = BITMAP_ALLOC (&reg_obstack);
test_live = BITMAP_ALLOC (&reg_obstack); test_live = BITMAP_ALLOC (&reg_obstack);
test_set = BITMAP_ALLOC (&reg_obstack); test_set = BITMAP_ALLOC (&reg_obstack);
...@@ -4051,13 +4054,8 @@ dead_or_predicable (basic_block test_bb, basic_block merge_bb, ...@@ -4051,13 +4054,8 @@ dead_or_predicable (basic_block test_bb, basic_block merge_bb,
{ {
if (NONDEBUG_INSN_P (insn)) if (NONDEBUG_INSN_P (insn))
{ {
unsigned int uid = INSN_UID (insn); df_simulate_find_defs (insn, merge_set);
df_ref *def_rec; df_simulate_find_noclobber_defs (insn, merge_set_noclobber);
for (def_rec = DF_INSN_UID_DEFS (uid); *def_rec; def_rec++)
{
df_ref def = *def_rec;
bitmap_set_bit (merge_set, DF_REF_REGNO (def));
}
} }
} }
...@@ -4065,7 +4063,7 @@ dead_or_predicable (basic_block test_bb, basic_block merge_bb, ...@@ -4065,7 +4063,7 @@ dead_or_predicable (basic_block test_bb, basic_block merge_bb,
hard registers before reload. */ hard registers before reload. */
if (SMALL_REGISTER_CLASSES && ! reload_completed) if (SMALL_REGISTER_CLASSES && ! reload_completed)
{ {
EXECUTE_IF_SET_IN_BITMAP (merge_set, 0, i, bi) EXECUTE_IF_SET_IN_BITMAP (merge_set_noclobber, 0, i, bi)
{ {
if (i < FIRST_PSEUDO_REGISTER if (i < FIRST_PSEUDO_REGISTER
&& ! fixed_regs[i] && ! fixed_regs[i]
...@@ -4085,7 +4083,7 @@ dead_or_predicable (basic_block test_bb, basic_block merge_bb, ...@@ -4085,7 +4083,7 @@ dead_or_predicable (basic_block test_bb, basic_block merge_bb,
{ {
if (INSN_P (insn)) if (INSN_P (insn))
{ {
df_simulate_find_defs (insn, test_set); df_simulate_find_noclobber_defs (insn, test_set);
df_simulate_one_insn_backwards (test_bb, insn, test_live); df_simulate_one_insn_backwards (test_bb, insn, test_live);
} }
prev = PREV_INSN (insn); prev = PREV_INSN (insn);
...@@ -4094,16 +4092,19 @@ dead_or_predicable (basic_block test_bb, basic_block merge_bb, ...@@ -4094,16 +4092,19 @@ dead_or_predicable (basic_block test_bb, basic_block merge_bb,
} }
/* We can perform the transformation if /* We can perform the transformation if
MERGE_SET & (TEST_SET | TEST_LIVE) MERGE_SET_NOCLOBBER & TEST_SET
and
MERGE_SET & TEST_LIVE)
and and
TEST_SET & DF_LIVE_IN (merge_bb) TEST_SET & DF_LIVE_IN (merge_bb)
are empty. */ are empty. */
if (bitmap_intersect_p (test_set, merge_set) if (bitmap_intersect_p (test_set, merge_set_noclobber)
|| bitmap_intersect_p (test_live, merge_set) || bitmap_intersect_p (test_live, merge_set)
|| bitmap_intersect_p (test_set, df_get_live_in (merge_bb))) || bitmap_intersect_p (test_set, df_get_live_in (merge_bb)))
fail = 1; fail = 1;
BITMAP_FREE (merge_set_noclobber);
BITMAP_FREE (merge_set); BITMAP_FREE (merge_set);
BITMAP_FREE (test_live); BITMAP_FREE (test_live);
BITMAP_FREE (test_set); BITMAP_FREE (test_set);
......
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