This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH]: Handle lonely CC0 setter in sched-deps.c


Gabor Loki wrote:
Jim Wilson wrote:
On Mon, 2008-04-07 at 15:22 +0400, Maxim Kuvyrkov wrote:
Here's a proposed patch for seqabstr pass. The patch implements conservative fix to not collect cc0 instructions into sequences for abstraction. This is done similarly to handling live stack regs. Any comments?

There should be a comment explaining that 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. There is no need to always exclude all cc0 insns.

Please see the updated comment in the attached patch.


This is OK with that change, unless Gabor Loki
wants to comment otherwise.

Maxim,


May I ask you a favour? Could you check that the patch from
http://gcc.gnu.org/ml/gcc-patches/2008-03/msg00824.html
solves your problem? If not, apply your patch.

With this patch, the compiler doesn't build on coldfire/m68k because get_attr_length is not defined there. Anyway, I agree with Hans-Peter that this patch won't fix the underlying problem.


OK to apply?

--
Maxim
2008-04-07  Maxim Kuvyrkov  <maxim@codesourcery.com>

	* rtl-factoring.c (collect_patterns_seqs): Handle CC0 targets.
Index: rtl-factoring.c
===================================================================
--- rtl-factoring.c	(revision 134308)
+++ rtl-factoring.c	(working copy)
@@ -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
 }
 

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]