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: [vta/trunk?] don't mark block as dirty when scheduling insns within it


On Feb 29, 2008, Paolo Bonzini <bonzini@gnu.org> wrote:

> df parts are ok for trunk if they pass, the others are just obvious.

They didn't :-(   Some earlier short-circuiting tests left block
information incorrect.  Of course, I noticed that a few seconds after
posting the patch, doh!

I was tempted to move the new short-circuiting test  earlier, but I
was concerned this would stop the df scanning right below it.  I
didn't have the guts (or CPU time, so far) to test whether this would
hurt, but that's what I'm going to do next.

Meanwhile, this one passed bootstrap and regtest on x86_64-linux-gnu.
Ok?

for  gcc/ChangeLog
from  Alexandre Oliva  <aoliva@redhat.com>

	* df-scan.c (df_ref_chain_change_bb): Simplify.
	(df_insn_change_bb): Add new_bb argument.  Simplify.  Call
	set_block_for_insn if there's any change.
	* df.h ((df_insn_change_bb): Fix prototype.
	* cfgrtl.c (update_bb_for_insn_chain): Pass bb to
	df_insn_change_bb, don't call set_block_for_insn.
	* emit-rtl.c (reorder_insns): Likewise.
	* haifa-sched.c (move_insn): Likewise.

Index: gcc/df-scan.c
===================================================================
--- gcc/df-scan.c.orig	2007-12-15 18:10:48.000000000 -0200
+++ gcc/df-scan.c	2008-02-29 01:14:46.000000000 -0300
@@ -1,6 +1,6 @@
 /* Scanning of rtl for dataflow analysis.
-   Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
-   Free Software Foundation, Inc.
+   Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+   2008  Free Software Foundation, Inc.
    Originally contributed by Michael P. Hayes 
              (m.hayes@elec.canterbury.ac.nz, mhayes@redhat.com)
    Major rewrite contributed by Danny Berlin (dberlin@dberlin.org)
@@ -1753,14 +1753,10 @@ df_maybe_reorganize_def_refs (enum df_re
 }
 
 
-/* Change the BB of all refs in the ref chain to NEW_BB.
-   Assumes that all refs in the chain have the same BB.
-   If changed, return the original bb the chain belonged to
-   (or .
-   If no change, return NEW_BB. 
-   If something's wrong, it will return NULL. */
+/* Change the BB of all refs in the ref chain from OLD_BB to NEW_BB.
+   Assumes that all refs in the chain have the same BB.  */
 
-static basic_block
+static void
 df_ref_chain_change_bb (struct df_ref **ref_rec, 
                         basic_block old_bb,
                         basic_block new_bb)
@@ -1769,18 +1765,10 @@ df_ref_chain_change_bb (struct df_ref **
     {
       struct df_ref *ref = *ref_rec;
 
-      if (DF_REF_BB (ref) == new_bb)
-	return new_bb;
-      else
-	{
-	  gcc_assert (old_bb == NULL || DF_REF_BB (ref) == old_bb);
-	  old_bb = DF_REF_BB (ref);
-	  DF_REF_BB (ref) = new_bb;
-	}
+      gcc_assert (DF_REF_BB (ref) == old_bb);
+      DF_REF_BB (ref) = new_bb;
       ref_rec++;
     }
-
-  return old_bb;
 }
 
 
@@ -1789,13 +1777,14 @@ df_ref_chain_change_bb (struct df_ref **
    instructions from one block to another.  */  
 
 void
-df_insn_change_bb (rtx insn)
+df_insn_change_bb (rtx insn, basic_block new_bb)
 {
-  basic_block new_bb = BLOCK_FOR_INSN (insn);
-  basic_block old_bb = NULL;
+  basic_block old_bb = BLOCK_FOR_INSN (insn);
   struct df_insn_info *insn_info;
   unsigned int uid = INSN_UID (insn);
 
+  set_block_for_insn (insn, new_bb);
+
   if (!df)
     return;
 
@@ -1814,17 +1803,12 @@ df_insn_change_bb (rtx insn)
   if (!INSN_P (insn))
     return;
 
-  old_bb = df_ref_chain_change_bb (insn_info->defs, old_bb, new_bb);
-  if (old_bb == new_bb) 
-    return;
-
-  old_bb = df_ref_chain_change_bb (insn_info->uses, old_bb, new_bb);
-  if (old_bb == new_bb) 
+  if (old_bb == new_bb)
     return;
 
-  old_bb = df_ref_chain_change_bb (insn_info->eq_uses, old_bb, new_bb);
-  if (old_bb == new_bb) 
-    return;
+  df_ref_chain_change_bb (insn_info->defs, old_bb, new_bb);
+  df_ref_chain_change_bb (insn_info->uses, old_bb, new_bb);
+  df_ref_chain_change_bb (insn_info->eq_uses, old_bb, new_bb);
 
   df_set_bb_dirty (new_bb);
   if (old_bb)
Index: gcc/df.h
===================================================================
--- gcc/df.h.orig	2008-01-22 23:48:16.000000000 -0200
+++ gcc/df.h	2008-02-28 22:13:17.000000000 -0300
@@ -1,6 +1,6 @@
 /* Form lists of pseudo register references for autoinc optimization
    for GNU compiler.  This is part of flow optimization.
-   Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007
+   Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008
    Free Software Foundation, Inc.
    Originally contributed by Michael P. Hayes 
              (m.hayes@elec.canterbury.ac.nz, mhayes@redhat.com)
@@ -871,7 +871,7 @@ extern bool df_insn_rescan (rtx);
 extern void df_insn_rescan_all (void);
 extern void df_process_deferred_rescans (void);
 extern void df_recompute_luids (basic_block);
-extern void df_insn_change_bb (rtx);
+extern void df_insn_change_bb (rtx, basic_block);
 extern void df_maybe_reorganize_use_refs (enum df_ref_order);
 extern void df_maybe_reorganize_def_refs (enum df_ref_order);
 extern void df_ref_change_reg_with_loc (int, int, rtx);
Index: gcc/cfgrtl.c
===================================================================
--- gcc/cfgrtl.c.orig	2007-12-14 04:11:01.000000000 -0200
+++ gcc/cfgrtl.c	2008-02-28 22:28:30.000000000 -0300
@@ -1,6 +1,6 @@
 /* Control flow graph manipulation code for GNU compiler.
    Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
+   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
    Free Software Foundation, Inc.
 
 This file is part of GCC.
@@ -477,13 +477,8 @@ update_bb_for_insn_chain (rtx begin, rtx
 
   end = NEXT_INSN (end);
   for (insn = begin; insn != end; insn = NEXT_INSN (insn))
-    {
-      if (!BARRIER_P (insn))
-	{
-	  set_block_for_insn (insn, bb);
-	  df_insn_change_bb (insn);
-	}
-    }
+    if (!BARRIER_P (insn))
+      df_insn_change_bb (insn, bb);
 }
 
 /* Update BLOCK_FOR_INSN of insns in BB to BB,
Index: gcc/emit-rtl.c
===================================================================
--- gcc/emit-rtl.c.orig	2008-02-27 19:49:45.000000000 -0300
+++ gcc/emit-rtl.c	2008-02-28 22:15:02.000000000 -0300
@@ -3737,10 +3737,7 @@ reorder_insns (rtx from, rtx to, rtx aft
 
       for (x = from; x != NEXT_INSN (to); x = NEXT_INSN (x))
 	if (!BARRIER_P (x))
-	  {
-	    set_block_for_insn (x, bb);
-	    df_insn_change_bb (x);
-	  }
+	  df_insn_change_bb (x, bb);
     }
 }
 
Index: gcc/haifa-sched.c
===================================================================
--- gcc/haifa-sched.c.orig	2007-11-24 18:51:30.000000000 -0200
+++ gcc/haifa-sched.c	2008-02-28 22:15:18.000000000 -0300
@@ -1,6 +1,7 @@
 /* Instruction scheduling pass.
    Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-   2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+   2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+   Free Software Foundation, Inc.
    Contributed by Michael Tiemann (tiemann@cygnus.com) Enhanced by,
    and currently maintained by, Jim Wilson (wilson@cygnus.com)
 
@@ -1835,8 +1836,7 @@ move_insn (rtx insn)
 	  gcc_assert (BB_END (bb) == last);
 	}
 
-      set_block_for_insn (insn, bb);    
-      df_insn_change_bb (insn);
+      df_insn_change_bb (insn, bb);
   
       /* Update BB_END, if needed.  */
       if (BB_END (bb) == last)
-- 
Alexandre Oliva         http://www.lsd.ic.unicamp.br/~oliva/
FSF Latin America Board Member         http://www.fsfla.org/
Red Hat Compiler Engineer   aoliva@{redhat.com, gcc.gnu.org}
Free Software Evangelist  oliva@{lsd.ic.unicamp.br, gnu.org}

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