[PATCH] Don't reset cselib hash table during vt_initialize after every bb, only after every ebb (take 2)

Jakub Jelinek jakub@redhat.com
Mon Mar 1 19:37:00 GMT 2010


On Sun, Feb 28, 2010 at 12:11:14AM +0100, Steven Bosscher wrote:
> > Makes sense, will change it.  The code in the patch has been
> > copied from sched-ebb.c.
> 
> Yes, well, sched-ebb.c is also not exactly an example of how to
> properly manage the CFG. It does funny things like calling
> compute_bb_for_insn (which should be valid anyway if someone runs this
> scheduler), and then basically completely ignores the CFG and all
> basic block boundaries in schedule_ebb. This is one of the few passes
> that really doesn't work at all in cfglayout mode before register
> allocation.

Okay, here is what I've bootstrapped/regtested on x86_64-linux and
i686-linux (the patch is mostly reindentation).  Ok for trunk?

2010-03-01  Jakub Jelinek  <jakub@redhat.com>
	    Steven Bosscher  <steven@gcc.gnu.org>

	* var-tracking.c (vt_initialize): Scan insns in ebb chunks instead
	of bb.

--- gcc/var-tracking.c.jj	2010-02-26 11:17:23.000000000 +0100
+++ gcc/var-tracking.c	2010-03-01 17:17:58.000000000 +0100
@@ -7399,9 +7399,9 @@ vt_initialize (void)
     {
       rtx insn;
       HOST_WIDE_INT pre, post = 0;
-      int count;
       unsigned int next_uid_before = cselib_get_next_uid ();
       unsigned int next_uid_after = next_uid_before;
+      basic_block first_bb, last_bb;
 
       if (MAY_HAVE_DEBUG_INSNS)
 	{
@@ -7411,55 +7411,70 @@ vt_initialize (void)
 		     cselib_get_next_uid ());
 	}
 
+      first_bb = bb;
+      for (;;)
+	{
+	  edge e;
+	  if (bb->next_bb == EXIT_BLOCK_PTR
+	      || ! single_pred_p (bb->next_bb))
+	    break;
+	  e = find_edge (bb, bb->next_bb);
+	  if (! e || (e->flags & EDGE_FALLTHRU) == 0)
+	    break;
+	  bb = bb->next_bb;
+	}
+      last_bb = bb;
+
       /* Count the number of micro operations.  */
-      VTI (bb)->n_mos = 0;
-      for (insn = BB_HEAD (bb); insn != NEXT_INSN (BB_END (bb));
-	   insn = NEXT_INSN (insn))
+      FOR_BB_BETWEEN (bb, first_bb, last_bb->next_bb, next_bb)
 	{
-	  if (INSN_P (insn))
+	  VTI (bb)->n_mos = 0;
+	  for (insn = BB_HEAD (bb); insn != NEXT_INSN (BB_END (bb));
+	       insn = NEXT_INSN (insn))
 	    {
-	      if (!frame_pointer_needed)
+	      if (INSN_P (insn))
 		{
-		  insn_stack_adjust_offset_pre_post (insn, &pre, &post);
-		  if (pre)
+		  if (!frame_pointer_needed)
 		    {
-		      VTI (bb)->n_mos++;
-		      if (dump_file && (dump_flags & TDF_DETAILS))
-			log_op_type (GEN_INT (pre), bb, insn,
-				     MO_ADJUST, dump_file);
+		      insn_stack_adjust_offset_pre_post (insn, &pre, &post);
+		      if (pre)
+			{
+			  VTI (bb)->n_mos++;
+			  if (dump_file && (dump_flags & TDF_DETAILS))
+			    log_op_type (GEN_INT (pre), bb, insn,
+					 MO_ADJUST, dump_file);
+			}
+		      if (post)
+			{
+			  VTI (bb)->n_mos++;
+			  if (dump_file && (dump_flags & TDF_DETAILS))
+			    log_op_type (GEN_INT (post), bb, insn,
+					 MO_ADJUST, dump_file);
+			}
 		    }
-		  if (post)
+		  cselib_hook_called = false;
+		  if (MAY_HAVE_DEBUG_INSNS)
 		    {
-		      VTI (bb)->n_mos++;
+		      cselib_process_insn (insn);
 		      if (dump_file && (dump_flags & TDF_DETAILS))
-			log_op_type (GEN_INT (post), bb, insn,
-				     MO_ADJUST, dump_file);
+			{
+			  print_rtl_single (dump_file, insn);
+			  dump_cselib_table (dump_file);
+			}
 		    }
-		}
-	      cselib_hook_called = false;
-	      if (MAY_HAVE_DEBUG_INSNS)
-		{
-		  cselib_process_insn (insn);
-		  if (dump_file && (dump_flags & TDF_DETAILS))
+		  if (!cselib_hook_called)
+		    count_with_sets (insn, 0, 0);
+		  if (CALL_P (insn))
 		    {
-		      print_rtl_single (dump_file, insn);
-		      dump_cselib_table (dump_file);
+		      VTI (bb)->n_mos++;
+		      if (dump_file && (dump_flags & TDF_DETAILS))
+			log_op_type (PATTERN (insn), bb, insn,
+				     MO_CALL, dump_file);
 		    }
 		}
-	      if (!cselib_hook_called)
-		count_with_sets (insn, 0, 0);
-	      if (CALL_P (insn))
-		{
-		  VTI (bb)->n_mos++;
-		  if (dump_file && (dump_flags & TDF_DETAILS))
-		    log_op_type (PATTERN (insn), bb, insn,
-				 MO_CALL, dump_file);
-		}
 	    }
 	}
 
-      count = VTI (bb)->n_mos;
-
       if (MAY_HAVE_DEBUG_INSNS)
 	{
 	  cselib_preserve_only_values (false);
@@ -7472,22 +7487,53 @@ vt_initialize (void)
 	}
 
       /* Add the micro-operations to the array.  */
-      VTI (bb)->mos = XNEWVEC (micro_operation, VTI (bb)->n_mos);
-      VTI (bb)->n_mos = 0;
-      for (insn = BB_HEAD (bb); insn != NEXT_INSN (BB_END (bb));
-	   insn = NEXT_INSN (insn))
+      FOR_BB_BETWEEN (bb, first_bb, last_bb->next_bb, next_bb)
 	{
-	  if (INSN_P (insn))
+	  int count = VTI (bb)->n_mos;
+	  VTI (bb)->mos = XNEWVEC (micro_operation, count);
+	  VTI (bb)->n_mos = 0;
+	  for (insn = BB_HEAD (bb); insn != NEXT_INSN (BB_END (bb));
+	       insn = NEXT_INSN (insn))
 	    {
-	      if (!frame_pointer_needed)
+	      if (INSN_P (insn))
 		{
-		  insn_stack_adjust_offset_pre_post (insn, &pre, &post);
-		  if (pre)
+		  if (!frame_pointer_needed)
+		    {
+		      insn_stack_adjust_offset_pre_post (insn, &pre, &post);
+		      if (pre)
+			{
+			  micro_operation *mo
+			    = VTI (bb)->mos + VTI (bb)->n_mos++;
+
+			  mo->type = MO_ADJUST;
+			  mo->u.adjust = pre;
+			  mo->insn = insn;
+
+			  if (dump_file && (dump_flags & TDF_DETAILS))
+			    log_op_type (PATTERN (insn), bb, insn,
+					 MO_ADJUST, dump_file);
+			}
+		    }
+
+		  cselib_hook_called = false;
+		  if (MAY_HAVE_DEBUG_INSNS)
+		    {
+		      cselib_process_insn (insn);
+		      if (dump_file && (dump_flags & TDF_DETAILS))
+			{
+			  print_rtl_single (dump_file, insn);
+			  dump_cselib_table (dump_file);
+			}
+		    }
+		  if (!cselib_hook_called)
+		    add_with_sets (insn, 0, 0);
+
+		  if (!frame_pointer_needed && post)
 		    {
 		      micro_operation *mo = VTI (bb)->mos + VTI (bb)->n_mos++;
 
 		      mo->type = MO_ADJUST;
-		      mo->u.adjust = pre;
+		      mo->u.adjust = post;
 		      mo->insn = insn;
 
 		      if (dump_file && (dump_flags & TDF_DETAILS))
@@ -7495,35 +7541,12 @@ vt_initialize (void)
 				     MO_ADJUST, dump_file);
 		    }
 		}
-
-	      cselib_hook_called = false;
-	      if (MAY_HAVE_DEBUG_INSNS)
-		{
-		  cselib_process_insn (insn);
-		  if (dump_file && (dump_flags & TDF_DETAILS))
-		    {
-		      print_rtl_single (dump_file, insn);
-		      dump_cselib_table (dump_file);
-		    }
-		}
-	      if (!cselib_hook_called)
-		add_with_sets (insn, 0, 0);
-
-	      if (!frame_pointer_needed && post)
-		{
-		  micro_operation *mo = VTI (bb)->mos + VTI (bb)->n_mos++;
-
-		  mo->type = MO_ADJUST;
-		  mo->u.adjust = post;
-		  mo->insn = insn;
-
-		  if (dump_file && (dump_flags & TDF_DETAILS))
-		    log_op_type (PATTERN (insn), bb, insn,
-				 MO_ADJUST, dump_file);
-		}
 	    }
+	  gcc_assert (count == VTI (bb)->n_mos);
 	}
-      gcc_assert (count == VTI (bb)->n_mos);
+
+      bb = last_bb;
+
       if (MAY_HAVE_DEBUG_INSNS)
 	{
 	  cselib_preserve_only_values (true);


	Jakub



More information about the Gcc-patches mailing list