Commit c23da840 by Maxim Kuvyrkov Committed by Maxim Kuvyrkov

* rtl-factoring.c (collect_patterns_seqs): Handle CC0 targets.

From-SVN: r134551
parent 0a58c87e
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> 2008-04-21 Adam Nemet <anemet@caviumnetworks.com>
* coverage.c: Include tree-pass.h. * coverage.c: Include tree-pass.h.
......
...@@ -444,15 +444,17 @@ collect_pattern_seqs (void) ...@@ -444,15 +444,17 @@ collect_pattern_seqs (void)
htab_iterator hti0, hti1, hti2; htab_iterator hti0, hti1, hti2;
p_hash_bucket hash_bucket; p_hash_bucket hash_bucket;
p_hash_elem e0, e1; p_hash_elem e0, e1;
#ifdef STACK_REGS #if defined STACK_REGS || defined HAVE_CC0
basic_block bb; basic_block bb;
bitmap_head stack_reg_live; bitmap_head dont_collect;
/* Extra initialization step to ensure that no stack registers (if present) /* 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 or cc0 code (if present) are live across abnormal edges.
if a stack register is live after the insn. */ Set a flag in DONT_COLLECT for an insn if a stack register is live
bitmap_initialize (&stack_reg_live, NULL); after the insn or the insn is cc0 setter or user. */
bitmap_initialize (&dont_collect, NULL);
#ifdef STACK_REGS
FOR_EACH_BB (bb) FOR_EACH_BB (bb)
{ {
regset_head live; regset_head live;
...@@ -476,7 +478,7 @@ collect_pattern_seqs (void) ...@@ -476,7 +478,7 @@ collect_pattern_seqs (void)
{ {
if (REGNO_REG_SET_P (&live, reg)) 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; break;
} }
} }
...@@ -493,6 +495,28 @@ collect_pattern_seqs (void) ...@@ -493,6 +495,28 @@ collect_pattern_seqs (void)
} }
#endif #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. */ /* Initialize PATTERN_SEQS to empty. */
pattern_seqs = 0; pattern_seqs = 0;
...@@ -505,15 +529,15 @@ collect_pattern_seqs (void) ...@@ -505,15 +529,15 @@ collect_pattern_seqs (void)
FOR_EACH_HTAB_ELEMENT (hash_bucket->seq_candidates, e1, p_hash_elem, FOR_EACH_HTAB_ELEMENT (hash_bucket->seq_candidates, e1, p_hash_elem,
hti2) hti2)
if (e0 != e1 if (e0 != e1
#ifdef STACK_REGS #if defined STACK_REGS || defined HAVE_CC0
&& !bitmap_bit_p (&stack_reg_live, INSN_UID (e0->insn)) && !bitmap_bit_p (&dont_collect, INSN_UID (e0->insn))
&& !bitmap_bit_p (&stack_reg_live, INSN_UID (e1->insn)) && !bitmap_bit_p (&dont_collect, INSN_UID (e1->insn))
#endif #endif
) )
match_seqs (e0, e1); match_seqs (e0, e1);
#ifdef STACK_REGS #if defined STACK_REGS || defined HAVE_CC0
/* Free unused data. */ /* Free unused data. */
bitmap_clear (&stack_reg_live); bitmap_clear (&dont_collect);
#endif #endif
} }
......
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