This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [vta/trunk?] don't mark block as dirty when scheduling insns within it
- From: Alexandre Oliva <aoliva at redhat dot com>
- To: Paolo Bonzini <bonzini at gnu dot org>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Sat, 01 Mar 2008 00:33:40 -0300
- Subject: Re: [vta/trunk?] don't mark block as dirty when scheduling insns within it
- References: <oroda2kj6b.fsf@oliva.athome.lsd.ic.unicamp.br> <47C51CB8.4030404@gnu.org> <oroda04key.fsf@oliva.athome.lsd.ic.unicamp.br> <47C7BA25.7030603@gnu.org> <ord4qf390m.fsf@oliva.athome.lsd.ic.unicamp.br> <47C87183.80703@gnu.org>
On Feb 29, 2008, Paolo Bonzini <bonzini@gnu.org> wrote:
>> Meanwhile, this one passed bootstrap and regtest on x86_64-linux-gnu.
>> Ok?
> Yes, of course -- sorry, I should have spotted that myself.
This is more in line with your original suggestion, and it works just
fine, so I'm going ahead and checking it in.
Thanks for your suggestion.
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 2008-02-29 15:36:55.000000000 -0300
+++ gcc/df-scan.c 2008-02-29 15:37:29.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,17 @@ 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);
+ if (old_bb == new_bb)
+ return;
+
+ set_block_for_insn (insn, new_bb);
+
if (!df)
return;
@@ -1814,17 +1806,9 @@ 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)
- 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-02-29 15:36:55.000000000 -0300
+++ gcc/df.h 2008-02-29 15:36:58.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 2008-02-29 15:36:55.000000000 -0300
+++ gcc/cfgrtl.c 2008-02-29 15:36:58.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-29 15:36:55.000000000 -0300
+++ gcc/emit-rtl.c 2008-02-29 15:36:58.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 2008-02-29 15:36:55.000000000 -0300
+++ gcc/haifa-sched.c 2008-02-29 15:36:58.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}