* rtl-factoring.c (collect_patterns_seqs): Handle CC0 targets.
authorMaxim Kuvyrkov <maxim@codesourcery.com>
Tue, 22 Apr 2008 07:24:06 +0000 (07:24 +0000)
committerMaxim Kuvyrkov <mkuvyrkov@gcc.gnu.org>
Tue, 22 Apr 2008 07:24:06 +0000 (07:24 +0000)
From-SVN: r134551

gcc/ChangeLog
gcc/rtl-factoring.c

index e7fc5ef03e8b747d360db0be80209b85658a6dcc..6396413c6c8f6549e69baba771b7e5bdbcc2f043 100644 (file)
@@ -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.
index 77c2197b41d70f6702d63e811d7a330fbd12da25..8882f0f6e48b6f31689c736d8bd7cd7d027f6ad8 100644 (file)
@@ -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
 }