Commit ccef9ef5 by Daniel Berlin Committed by Jeff Law

gcse.c: Update comment at top.

        * gcse.c: Update comment at top.
        Update comment on mem handling.
        mem_last_set, mem_first_set, mem_set_in_block: gone.
        Declaration of reg_set_info: gone.
        (oprs_unchanged_p): Don't use mem_*set_* anymore. They are
        pointless with load_killed_in_block_p (they are *more*
        conservative then it, not less, and less accurate).
        (oprs_not_set_p): Ditto.
        (alloc_gcse_mem): Don't allocate mem_set_in_block
        (free_gcse_mem): Don't free it, either.
        (record_last_mem_set_info): Update comment in front, remove
        mem_*set_* stuff. Note the reason we don't handle stores directly
        here.
        (compute_hash_table): Update comments to reflect reality. Remove
        mem_*set_* references.
        (reset_opr_set_tables): Remove mem_*set_* references.
        (mark_call): Ditto.
        (mark_set): Ditto.  Also remove double sets of bitmaps for REG's.
        (mark_clobber): Ditto (on both parts, we double set here too).
        (expr_killed_p): Remove mem_set_in_block test.
        (compute_transp): Remove mem_set_in_block test.

From-SVN: r44055
parent b85946fc
...@@ -28,6 +28,28 @@ Mon Jul 16 18:07:07 2001 J"orn Rennecke <amylaar@redhat.com> ...@@ -28,6 +28,28 @@ Mon Jul 16 18:07:07 2001 J"orn Rennecke <amylaar@redhat.com>
2001-07-16 Daniel Berlin <dan@cgsoftware.com> 2001-07-16 Daniel Berlin <dan@cgsoftware.com>
* gcse.c: Update comment at top.
Update comment on mem handling.
mem_last_set, mem_first_set, mem_set_in_block: gone.
Declaration of reg_set_info: gone.
(oprs_unchanged_p): Don't use mem_*set_* anymore. They are
pointless with load_killed_in_block_p (they are *more*
conservative then it, not less, and less accurate).
(oprs_not_set_p): Ditto.
(alloc_gcse_mem): Don't allocate mem_set_in_block
(free_gcse_mem): Don't free it, either.
(record_last_mem_set_info): Update comment in front, remove
mem_*set_* stuff. Note the reason we don't handle stores directly
here.
(compute_hash_table): Update comments to reflect reality. Remove
mem_*set_* references.
(reset_opr_set_tables): Remove mem_*set_* references.
(mark_call): Ditto.
(mark_set): Ditto. Also remove double sets of bitmaps for REG's.
(mark_clobber): Ditto (on both parts, we double set here too).
(expr_killed_p): Remove mem_set_in_block test.
(compute_transp): Remove mem_set_in_block test.
* ssa-ccp.c: (optimize_unexecutable_edges): Add note about removal * ssa-ccp.c: (optimize_unexecutable_edges): Add note about removal
of edge, and removal of phi alternative to dump file. of edge, and removal of phi alternative to dump file.
(ssa_ccp_substitute_constants): Add note about register now being (ssa_ccp_substitute_constants): Add note about register now being
......
...@@ -24,7 +24,6 @@ Boston, MA 02111-1307, USA. */ ...@@ -24,7 +24,6 @@ Boston, MA 02111-1307, USA. */
- do rough calc of how many regs are needed in each block, and a rough - do rough calc of how many regs are needed in each block, and a rough
calc of how many regs are available in each class and use that to calc of how many regs are available in each class and use that to
throttle back the code in cases where RTX_COST is minimal. throttle back the code in cases where RTX_COST is minimal.
- dead store elimination
- a store to the same address as a load does not kill the load if the - a store to the same address as a load does not kill the load if the
source of the store is also the destination of the load. Handling this source of the store is also the destination of the load. Handling this
allows more load motion, particularly out of loops. allows more load motion, particularly out of loops.
...@@ -497,16 +496,6 @@ static rtx * modify_mem_list; ...@@ -497,16 +496,6 @@ static rtx * modify_mem_list;
/* This array parallels modify_mem_list, but is kept canonicalized. */ /* This array parallels modify_mem_list, but is kept canonicalized. */
static rtx * canon_modify_mem_list; static rtx * canon_modify_mem_list;
/* For each block, non-zero if memory is set in that block.
This is computed during hash table computation and is used by
expr_killed_p and compute_transp.
??? Handling of memory is very simple, we don't make any attempt
to optimize things (later).
??? This can be computed by compute_sets since the information
doesn't change. */
static char *mem_set_in_block;
/* Various variables for statistics gathering. */ /* Various variables for statistics gathering. */
/* Memory used in a pass. /* Memory used in a pass.
...@@ -1032,7 +1021,6 @@ alloc_gcse_mem (f) ...@@ -1032,7 +1021,6 @@ alloc_gcse_mem (f)
/* Allocate vars to track sets of regs, memory per block. */ /* Allocate vars to track sets of regs, memory per block. */
reg_set_in_block = (sbitmap *) sbitmap_vector_alloc (n_basic_blocks, reg_set_in_block = (sbitmap *) sbitmap_vector_alloc (n_basic_blocks,
max_gcse_regno); max_gcse_regno);
mem_set_in_block = (char *) gmalloc (n_basic_blocks);
/* Allocate array to keep a list of insns which modify memory in each /* Allocate array to keep a list of insns which modify memory in each
basic block. */ basic block. */
modify_mem_list = (rtx *) gmalloc (n_basic_blocks * sizeof (rtx *)); modify_mem_list = (rtx *) gmalloc (n_basic_blocks * sizeof (rtx *));
...@@ -1052,7 +1040,6 @@ free_gcse_mem () ...@@ -1052,7 +1040,6 @@ free_gcse_mem ()
free (reg_set_bitmap); free (reg_set_bitmap);
sbitmap_vector_free (reg_set_in_block); sbitmap_vector_free (reg_set_in_block);
free (mem_set_in_block);
/* re-Cache any INSN_LIST nodes we have allocated. */ /* re-Cache any INSN_LIST nodes we have allocated. */
{ {
int i; int i;
...@@ -1317,15 +1304,6 @@ compute_sets (f) ...@@ -1317,15 +1304,6 @@ compute_sets (f)
static int *reg_first_set; static int *reg_first_set;
static int *reg_last_set; static int *reg_last_set;
/* While computing "first/last set" info, this is the CUID of first/last insn
to set memory or -1 if not set. `mem_last_set' is also used when
performing GCSE to record whether memory has been set since the beginning
of the block.
Note that handling of memory is very simple, we don't make any attempt
to optimize things (later). */
static int mem_first_set;
static int mem_last_set;
/* See whether X, the source of a set, is something we want to consider for /* See whether X, the source of a set, is something we want to consider for
GCSE. */ GCSE. */
...@@ -1409,12 +1387,6 @@ oprs_unchanged_p (x, insn, avail_p) ...@@ -1409,12 +1387,6 @@ oprs_unchanged_p (x, insn, avail_p)
if (load_killed_in_block_p (BLOCK_FOR_INSN (insn), INSN_CUID (insn), if (load_killed_in_block_p (BLOCK_FOR_INSN (insn), INSN_CUID (insn),
x, avail_p)) x, avail_p))
return 0; return 0;
if (avail_p && mem_last_set != NEVER_SET
&& mem_last_set >= INSN_CUID (insn))
return 0;
else if (! avail_p && mem_first_set != NEVER_SET
&& mem_first_set < INSN_CUID (insn))
return 0;
else else
return oprs_unchanged_p (XEXP (x, 0), insn, avail_p); return oprs_unchanged_p (XEXP (x, 0), insn, avail_p);
...@@ -2410,7 +2382,6 @@ canon_list_insert (dest, unused1, v_insn) ...@@ -2410,7 +2382,6 @@ canon_list_insert (dest, unused1, v_insn)
alloc_INSN_LIST (dest, canon_modify_mem_list[BLOCK_NUM (insn)]); alloc_INSN_LIST (dest, canon_modify_mem_list[BLOCK_NUM (insn)]);
} }
/* Record memory first/last/block set information for INSN. */
/* Record memory modification information for INSN. We do not actually care /* Record memory modification information for INSN. We do not actually care
about the memory location(s) that are set, or even how they are set (consider about the memory location(s) that are set, or even how they are set (consider
a CALL_INSN). We merely need to record which insns modify memory. */ a CALL_INSN). We merely need to record which insns modify memory. */
...@@ -2419,11 +2390,8 @@ static void ...@@ -2419,11 +2390,8 @@ static void
record_last_mem_set_info (insn) record_last_mem_set_info (insn)
rtx insn; rtx insn;
{ {
if (mem_first_set == NEVER_SET) /* load_killed_in_block_p will handle the case of calls clobbering
mem_first_set = INSN_CUID (insn); everything. */
mem_last_set = INSN_CUID (insn);
mem_set_in_block[BLOCK_NUM (insn)] = 1;
modify_mem_list[BLOCK_NUM (insn)] = modify_mem_list[BLOCK_NUM (insn)] =
alloc_INSN_LIST (insn, modify_mem_list[BLOCK_NUM (insn)]); alloc_INSN_LIST (insn, modify_mem_list[BLOCK_NUM (insn)]);
...@@ -2486,12 +2454,9 @@ compute_hash_table (set_p) ...@@ -2486,12 +2454,9 @@ compute_hash_table (set_p)
/* While we compute the hash table we also compute a bit array of which /* While we compute the hash table we also compute a bit array of which
registers are set in which blocks. registers are set in which blocks.
We also compute which blocks set memory, in the absence of aliasing
support [which is TODO].
??? This isn't needed during const/copy propagation, but it's cheap to ??? This isn't needed during const/copy propagation, but it's cheap to
compute. Later. */ compute. Later. */
sbitmap_vector_zero (reg_set_in_block, n_basic_blocks); sbitmap_vector_zero (reg_set_in_block, n_basic_blocks);
memset ((char *) mem_set_in_block, 0, n_basic_blocks);
/* re-Cache any INSN_LIST nodes we have allocated. */ /* re-Cache any INSN_LIST nodes we have allocated. */
{ {
...@@ -2519,14 +2484,12 @@ compute_hash_table (set_p) ...@@ -2519,14 +2484,12 @@ compute_hash_table (set_p)
/* First pass over the instructions records information used to /* First pass over the instructions records information used to
determine when registers and memory are first and last set. determine when registers and memory are first and last set.
??? The mem_set_in_block and hard-reg reg_set_in_block computation ??? hard-reg reg_set_in_block computation
could be moved to compute_sets since they currently don't change. */ could be moved to compute_sets since they currently don't change. */
for (i = 0; i < max_gcse_regno; i++) for (i = 0; i < max_gcse_regno; i++)
reg_first_set[i] = reg_last_set[i] = NEVER_SET; reg_first_set[i] = reg_last_set[i] = NEVER_SET;
mem_first_set = NEVER_SET;
mem_last_set = NEVER_SET;
for (insn = BLOCK_HEAD (bb); for (insn = BLOCK_HEAD (bb);
insn && insn != NEXT_INSN (BLOCK_END (bb)); insn && insn != NEXT_INSN (BLOCK_END (bb));
...@@ -2747,7 +2710,6 @@ reset_opr_set_tables () ...@@ -2747,7 +2710,6 @@ reset_opr_set_tables ()
/* Also keep a record of the last instruction to modify memory. /* Also keep a record of the last instruction to modify memory.
For now this is very trivial, we only record whether any memory For now this is very trivial, we only record whether any memory
location has been modified. */ location has been modified. */
mem_last_set = 0;
{ {
int i; int i;
...@@ -2794,8 +2756,6 @@ oprs_not_set_p (x, insn) ...@@ -2794,8 +2756,6 @@ oprs_not_set_p (x, insn)
if (load_killed_in_block_p (BLOCK_FOR_INSN (insn), if (load_killed_in_block_p (BLOCK_FOR_INSN (insn),
INSN_CUID (insn), x, 0)) INSN_CUID (insn), x, 0))
return 0; return 0;
if (mem_last_set != 0)
return 0;
else else
return oprs_not_set_p (XEXP (x, 0), insn); return oprs_not_set_p (XEXP (x, 0), insn);
...@@ -2834,7 +2794,6 @@ static void ...@@ -2834,7 +2794,6 @@ static void
mark_call (insn) mark_call (insn)
rtx insn; rtx insn;
{ {
mem_last_set = INSN_CUID (insn);
if (! CONST_CALL_P (insn)) if (! CONST_CALL_P (insn))
record_last_mem_set_info (insn); record_last_mem_set_info (insn);
} }
...@@ -2858,11 +2817,6 @@ mark_set (pat, insn) ...@@ -2858,11 +2817,6 @@ mark_set (pat, insn)
else if (GET_CODE (dest) == MEM) else if (GET_CODE (dest) == MEM)
record_last_mem_set_info (insn); record_last_mem_set_info (insn);
if (GET_CODE (dest) == REG)
SET_BIT (reg_set_bitmap, REGNO (dest));
else if (GET_CODE (dest) == MEM)
mem_last_set = INSN_CUID (insn);
if (GET_CODE (SET_SRC (pat)) == CALL) if (GET_CODE (SET_SRC (pat)) == CALL)
mark_call (insn); mark_call (insn);
} }
...@@ -2881,10 +2835,6 @@ mark_clobber (pat, insn) ...@@ -2881,10 +2835,6 @@ mark_clobber (pat, insn)
if (GET_CODE (clob) == REG) if (GET_CODE (clob) == REG)
SET_BIT (reg_set_bitmap, REGNO (clob)); SET_BIT (reg_set_bitmap, REGNO (clob));
else else
mem_last_set = INSN_CUID (insn);
if (GET_CODE (clob) == REG)
SET_BIT (reg_set_bitmap, REGNO (clob));
else
record_last_mem_set_info (insn); record_last_mem_set_info (insn);
} }
...@@ -3121,8 +3071,6 @@ expr_killed_p (x, bb) ...@@ -3121,8 +3071,6 @@ expr_killed_p (x, bb)
case MEM: case MEM:
if (load_killed_in_block_p (bb, get_max_uid () + 1, x, 0)) if (load_killed_in_block_p (bb, get_max_uid () + 1, x, 0))
return 1; return 1;
if (mem_set_in_block[bb->index])
return 1;
else else
return expr_killed_p (XEXP (x, 0), bb); return expr_killed_p (XEXP (x, 0), bb);
...@@ -3825,18 +3773,6 @@ compute_transp (x, indx, bmap, set_p) ...@@ -3825,18 +3773,6 @@ compute_transp (x, indx, bmap, set_p)
list_entry = XEXP (list_entry, 1); list_entry = XEXP (list_entry, 1);
} }
} }
if (set_p)
{
for (bb = 0; bb < n_basic_blocks; bb++)
if (mem_set_in_block[bb])
SET_BIT (bmap[bb], indx);
}
else
{
for (bb = 0; bb < n_basic_blocks; bb++)
if (mem_set_in_block[bb])
RESET_BIT (bmap[bb], indx);
}
x = XEXP (x, 0); x = XEXP (x, 0);
goto repeat; goto repeat;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment