* rtl-factoring.c (collect_patterns_seqs): Handle CC0 targets.
From-SVN: r134551
This commit is contained in:
parent
0a58c87e58
commit
c23da840b2
@ -1,3 +1,7 @@
|
||||
2008-04-22 Maxim Kuvyrkov <maxim@codesourcery.com>
|
||||
|
||||
* rtl-factoring.c (collect_patterns_seqs): Handle CC0 targets.
|
||||
|
||||
2008-04-21 Adam Nemet <anemet@caviumnetworks.com>
|
||||
|
||||
* coverage.c: Include tree-pass.h.
|
||||
|
@ -444,15 +444,17 @@ collect_pattern_seqs (void)
|
||||
htab_iterator hti0, hti1, hti2;
|
||||
p_hash_bucket hash_bucket;
|
||||
p_hash_elem e0, e1;
|
||||
#ifdef STACK_REGS
|
||||
#if defined STACK_REGS || defined HAVE_CC0
|
||||
basic_block bb;
|
||||
bitmap_head stack_reg_live;
|
||||
bitmap_head dont_collect;
|
||||
|
||||
/* Extra initialization step to ensure that no stack registers (if present)
|
||||
are live across abnormal edges. Set a flag in STACK_REG_LIVE for an insn
|
||||
if a stack register is live after the insn. */
|
||||
bitmap_initialize (&stack_reg_live, NULL);
|
||||
or cc0 code (if present) are live across abnormal edges.
|
||||
Set a flag in DONT_COLLECT for an insn if a stack register is live
|
||||
after the insn or the insn is cc0 setter or user. */
|
||||
bitmap_initialize (&dont_collect, NULL);
|
||||
|
||||
#ifdef STACK_REGS
|
||||
FOR_EACH_BB (bb)
|
||||
{
|
||||
regset_head live;
|
||||
@ -476,7 +478,7 @@ collect_pattern_seqs (void)
|
||||
{
|
||||
if (REGNO_REG_SET_P (&live, reg))
|
||||
{
|
||||
bitmap_set_bit (&stack_reg_live, INSN_UID (insn));
|
||||
bitmap_set_bit (&dont_collect, INSN_UID (insn));
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -493,6 +495,28 @@ collect_pattern_seqs (void)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_CC0
|
||||
/* Mark CC0 setters and users as ineligible for collection into sequences.
|
||||
This is an over-conservative fix, since it is OK to include
|
||||
a cc0_setter, but only if we also include the corresponding cc0_user,
|
||||
and vice versa. */
|
||||
FOR_EACH_BB (bb)
|
||||
{
|
||||
rtx insn;
|
||||
rtx next_tail;
|
||||
|
||||
next_tail = NEXT_INSN (BB_END (bb));
|
||||
|
||||
for (insn = BB_HEAD (bb); insn != next_tail; insn = NEXT_INSN (insn))
|
||||
{
|
||||
if (INSN_P (insn) && reg_mentioned_p (cc0_rtx, PATTERN (insn)))
|
||||
bitmap_set_bit (&dont_collect, INSN_UID (insn));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* defined STACK_REGS || defined HAVE_CC0 */
|
||||
|
||||
/* Initialize PATTERN_SEQS to empty. */
|
||||
pattern_seqs = 0;
|
||||
|
||||
@ -505,15 +529,15 @@ collect_pattern_seqs (void)
|
||||
FOR_EACH_HTAB_ELEMENT (hash_bucket->seq_candidates, e1, p_hash_elem,
|
||||
hti2)
|
||||
if (e0 != e1
|
||||
#ifdef STACK_REGS
|
||||
&& !bitmap_bit_p (&stack_reg_live, INSN_UID (e0->insn))
|
||||
&& !bitmap_bit_p (&stack_reg_live, INSN_UID (e1->insn))
|
||||
#if defined STACK_REGS || defined HAVE_CC0
|
||||
&& !bitmap_bit_p (&dont_collect, INSN_UID (e0->insn))
|
||||
&& !bitmap_bit_p (&dont_collect, INSN_UID (e1->insn))
|
||||
#endif
|
||||
)
|
||||
match_seqs (e0, e1);
|
||||
#ifdef STACK_REGS
|
||||
#if defined STACK_REGS || defined HAVE_CC0
|
||||
/* Free unused data. */
|
||||
bitmap_clear (&stack_reg_live);
|
||||
bitmap_clear (&dont_collect);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user