[patch][cprop.c] Random cleanups to un-gcse cprop.c
Steven Bosscher
stevenb.gcc@gmail.com
Thu Mar 31 22:16:00 GMT 2011
Hi,
This is a boring one. An almost-perfect %s/gcse/cprop/g except for
flag_gcse, and a few other random cleanups. Hardly noteworthy. This
goes in after the cprop_cleanup_2.diff patch as obvious unless someone
objects.
Ciao!
Steven
-------------- next part --------------
* cprop.c: s/gcse/cprop/ everywhere except for flag_gcse.
(gcse_obstack): Renamed to cprop_obstack.
(GNEW, GNEWVEC, GNEWVAR): Remove.
(gmalloc): Remove.
(alloc_hash_table): Use XNEWVAR instead of GNEWVAR.
(GOBNEW, GOBNEWVAR): Adjust for gcse_obstack renaming.
(gcse_alloc): Likewise, and rename to cprop_alloc.
(alloc_gcse_men, free_gcse_mem): Remove.
(gcse_constant_p): Rename to cprop_constant_p, and adjust all callers.
(compute_hash_table_work): Allocate and free reg_set_bitmap here.
(one_cprop_pass): Likewise. Adjust for gcse_obstack renaming.
*** cprop.c.v3 2011-03-31 23:16:27.000000000 +0200
--- cprop.c 2011-03-31 23:26:06.000000000 +0200
*************** along with GCC; see the file COPYING3.
*** 51,57 ****
/* An obstack for our working variables. */
! static struct obstack gcse_obstack;
struct reg_use {rtx reg_rtx; };
--- 51,57 ----
/* An obstack for our working variables. */
! static struct obstack cprop_obstack;
struct reg_use {rtx reg_rtx; };
*************** static int global_const_prop_count;
*** 138,186 ****
static int global_copy_prop_count;
! #define GNEW(T) ((T *) gmalloc (sizeof (T)))
!
! #define GNEWVEC(T, N) ((T *) gmalloc (sizeof (T) * (N)))
!
! #define GNEWVAR(T, S) ((T *) gmalloc ((S)))
!
! #define GOBNEW(T) ((T *) gcse_alloc (sizeof (T)))
! #define GOBNEWVAR(T, S) ((T *) gcse_alloc ((S)))
!
! /* Cover function to xmalloc to record bytes allocated. */
!
! static void *
! gmalloc (size_t size)
! {
! bytes_used += size;
! return xmalloc (size);
! }
/* Cover function to obstack_alloc. */
static void *
! gcse_alloc (unsigned long size)
{
bytes_used += size;
! return obstack_alloc (&gcse_obstack, size);
! }
!
! /* Allocate memory for the reg/memory set tracking tables.
! This is called at the start of each pass. */
!
! static void
! alloc_gcse_mem (void)
! {
! /* Allocate vars to track sets of regs. */
! reg_set_bitmap = ALLOC_REG_SET (NULL);
! }
!
! /* Free memory allocated by alloc_gcse_mem. */
!
! static void
! free_gcse_mem (void)
! {
! FREE_REG_SET (reg_set_bitmap);
}
/* Return nonzero if register X is unchanged from INSN to the end
--- 138,153 ----
static int global_copy_prop_count;
! #define GOBNEW(T) ((T *) cprop_alloc (sizeof (T)))
! #define GOBNEWVAR(T, S) ((T *) cprop_alloc ((S)))
/* Cover function to obstack_alloc. */
static void *
! cprop_alloc (unsigned long size)
{
bytes_used += size;
! return obstack_alloc (&cprop_obstack, size);
}
/* Return nonzero if register X is unchanged from INSN to the end
*************** insert_set_in_table (rtx x, rtx insn, st
*** 292,298 ****
is sharable. */
static bool
! gcse_constant_p (const_rtx x)
{
return CONSTANT_P (x) && (GET_CODE (x) != CONST || shared_const_p (x));
}
--- 259,265 ----
is sharable. */
static bool
! cprop_constant_p (const_rtx x)
{
return CONSTANT_P (x) && (GET_CODE (x) != CONST || shared_const_p (x));
}
*************** hash_scan_set (rtx pat, rtx insn, struct
*** 328,334 ****
if (note != 0
&& REG_NOTE_KIND (note) == REG_EQUAL
&& !REG_P (src)
! && gcse_constant_p (XEXP (note, 0)))
src = XEXP (note, 0), pat = gen_rtx_SET (VOIDmode, dest, src);
/* Record sets for constant/copy propagation. */
--- 295,301 ----
if (note != 0
&& REG_NOTE_KIND (note) == REG_EQUAL
&& !REG_P (src)
! && cprop_constant_p (XEXP (note, 0)))
src = XEXP (note, 0), pat = gen_rtx_SET (VOIDmode, dest, src);
/* Record sets for constant/copy propagation. */
*************** hash_scan_set (rtx pat, rtx insn, struct
*** 336,342 ****
&& src != dest
&& ! HARD_REGISTER_P (src)
&& reg_available_p (src, insn))
! || gcse_constant_p (src))
insert_set_in_table (pat, insn, table);
}
}
--- 303,309 ----
&& src != dest
&& ! HARD_REGISTER_P (src)
&& reg_available_p (src, insn))
! || cprop_constant_p (src))
insert_set_in_table (pat, insn, table);
}
}
*************** compute_hash_table_work (struct hash_tab
*** 438,443 ****
--- 405,413 ----
{
basic_block bb;
+ /* Allocate vars to track sets of regs. */
+ reg_set_bitmap = ALLOC_REG_SET (NULL);
+
FOR_EACH_BB (bb)
{
rtx insn;
*************** compute_hash_table_work (struct hash_tab
*** 467,472 ****
--- 437,444 ----
if (implicit_sets[bb->index] != NULL_RTX)
hash_scan_set (implicit_sets[bb->index], BB_HEAD (bb), table);
}
+
+ FREE_REG_SET (reg_set_bitmap);
}
/* Allocate space for the set/expr hash TABLE.
*************** alloc_hash_table (struct hash_table_d *t
*** 488,494 ****
??? Later take some measurements. */
table->size |= 1;
n = table->size * sizeof (struct expr *);
! table->table = GNEWVAR (struct expr *, n);
}
/* Free things allocated by alloc_hash_table. */
--- 460,466 ----
??? Later take some measurements. */
table->size |= 1;
n = table->size * sizeof (struct expr *);
! table->table = XNEWVAR (struct expr *, n);
}
/* Free things allocated by alloc_hash_table. */
*************** find_avail_set (int regno, rtx insn)
*** 931,937 ****
If the source operand changed, we may still use it for the next
iteration of this loop, but we may not use it for substitutions. */
! if (gcse_constant_p (src) || reg_not_set_p (src, insn))
set1 = set;
/* If the source of the set is anything except a register, then
--- 903,909 ----
If the source operand changed, we may still use it for the next
iteration of this loop, but we may not use it for substitutions. */
! if (cprop_constant_p (src) || reg_not_set_p (src, insn))
set1 = set;
/* If the source of the set is anything except a register, then
*************** cprop_insn (rtx insn)
*** 1145,1151 ****
src = SET_SRC (pat);
/* Constant propagation. */
! if (gcse_constant_p (src))
{
if (constprop_register (insn, reg_used->reg_rtx, src))
{
--- 1117,1123 ----
src = SET_SRC (pat);
/* Constant propagation. */
! if (cprop_constant_p (src))
{
if (constprop_register (insn, reg_used->reg_rtx, src))
{
*************** do_local_cprop (rtx x, rtx insn)
*** 1261,1267 ****
rtx this_rtx = l->loc;
rtx note;
! if (gcse_constant_p (this_rtx))
newcnst = this_rtx;
if (REG_P (this_rtx) && REGNO (this_rtx) >= FIRST_PSEUDO_REGISTER
/* Don't copy propagate if it has attached REG_EQUIV note.
--- 1233,1239 ----
rtx this_rtx = l->loc;
rtx note;
! if (cprop_constant_p (this_rtx))
newcnst = this_rtx;
if (REG_P (this_rtx) && REGNO (this_rtx) >= FIRST_PSEUDO_REGISTER
/* Don't copy propagate if it has attached REG_EQUIV note.
*************** implicit_set_cond_p (const_rtx cond)
*** 1400,1406 ****
return 0;
}
! return gcse_constant_p (cst);
}
/* Find the implicit sets of a function. An "implicit set" is a constraint
--- 1372,1378 ----
return 0;
}
! return cprop_constant_p (cst);
}
/* Find the implicit sets of a function. An "implicit set" is a constraint
*************** find_bypass_set (int regno, int bb)
*** 1497,1503 ****
gcc_assert (GET_CODE (set->expr) == SET);
src = SET_SRC (set->expr);
! if (gcse_constant_p (src))
result = set;
if (! REG_P (src))
--- 1469,1475 ----
gcc_assert (GET_CODE (set->expr) == SET);
src = SET_SRC (set->expr);
! if (cprop_constant_p (src))
result = set;
if (! REG_P (src))
*************** one_cprop_pass (void)
*** 1808,1815 ****
global_copy_prop_count = local_copy_prop_count = 0;
bytes_used = 0;
! gcc_obstack_init (&gcse_obstack);
! alloc_gcse_mem ();
/* Do a local const/copy propagation pass first. The global pass
only handles global opportunities.
--- 1780,1786 ----
global_copy_prop_count = local_copy_prop_count = 0;
bytes_used = 0;
! gcc_obstack_init (&cprop_obstack);
/* Do a local const/copy propagation pass first. The global pass
only handles global opportunities.
*************** one_cprop_pass (void)
*** 1824,1830 ****
FIXME: The global analysis would not get into infinite loops if it
would use the DF solver (via df_simple_dataflow) instead of
the solver implemented in this file. */
! if (local_cprop_pass ())
{
delete_unreachable_blocks ();
df_analyze ();
--- 1795,1802 ----
FIXME: The global analysis would not get into infinite loops if it
would use the DF solver (via df_simple_dataflow) instead of
the solver implemented in this file. */
! changed |= local_cprop_pass ();
! if (changed)
{
delete_unreachable_blocks ();
df_analyze ();
*************** one_cprop_pass (void)
*** 1851,1856 ****
--- 1823,1831 ----
alloc_cprop_mem (last_basic_block, set_hash_table.n_elems);
compute_cprop_data ();
+ /* Allocate vars to track sets of regs. */
+ reg_set_bitmap = ALLOC_REG_SET (NULL);
+
FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR->next_bb->next_bb, EXIT_BLOCK_PTR, next_bb)
{
/* Reset tables used to keep track of what's still valid [since
*************** one_cprop_pass (void)
*** 1872,1883 ****
}
changed |= bypass_conditional_jumps ();
free_cprop_mem ();
}
free_hash_table (&set_hash_table);
! free_gcse_mem ();
! obstack_free (&gcse_obstack, NULL);
if (dump_file)
{
--- 1847,1859 ----
}
changed |= bypass_conditional_jumps ();
+
+ FREE_REG_SET (reg_set_bitmap);
free_cprop_mem ();
}
free_hash_table (&set_hash_table);
! obstack_free (&cprop_obstack, NULL);
if (dump_file)
{
More information about the Gcc-patches
mailing list