From: Maxim Kuvyrkov Date: Tue, 22 Apr 2008 07:24:06 +0000 (+0000) Subject: * rtl-factoring.c (collect_patterns_seqs): Handle CC0 targets. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c23da840b2427b1cf9a2d3275b869165d49d9df1;p=gcc.git * rtl-factoring.c (collect_patterns_seqs): Handle CC0 targets. From-SVN: r134551 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e7fc5ef03e8..6396413c6c8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2008-04-22 Maxim Kuvyrkov + + * rtl-factoring.c (collect_patterns_seqs): Handle CC0 targets. + 2008-04-21 Adam Nemet * coverage.c: Include tree-pass.h. diff --git a/gcc/rtl-factoring.c b/gcc/rtl-factoring.c index 77c2197b41d..8882f0f6e48 100644 --- a/gcc/rtl-factoring.c +++ b/gcc/rtl-factoring.c @@ -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 }