aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxim Kuvyrkov <maxim@codesourcery.com>2008-04-22 07:24:06 +0000
committerMaxim Kuvyrkov <mkuvyrkov@gcc.gnu.org>2008-04-22 07:24:06 +0000
commitc23da840b2427b1cf9a2d3275b869165d49d9df1 (patch)
treeef4f5f501d6f17a8d45c557f6f0f7bb73597c155
parent0a58c87e58465a6b993892e87d956c5d7569a5c1 (diff)
downloadgcc-c23da840b2427b1cf9a2d3275b869165d49d9df1.zip
gcc-c23da840b2427b1cf9a2d3275b869165d49d9df1.tar.gz
gcc-c23da840b2427b1cf9a2d3275b869165d49d9df1.tar.bz2
* rtl-factoring.c (collect_patterns_seqs): Handle CC0 targets.
From-SVN: r134551
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/rtl-factoring.c46
2 files changed, 39 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e7fc5ef..6396413 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/rtl-factoring.c b/gcc/rtl-factoring.c
index 77c2197..8882f0f 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
}