gcse.c (modify_mem_list): Convert to an array of VECs.

* gcse.c (modify_mem_list): Convert to an array of VECs.
	(canon_modify_mem_list, compute_transp): Tweak formatting.
	(alloc_gcse_mem): Likewise.  Adjust for modify_mem_list change.
	(load_killed_in_block_p): Likewise.
	(record_last_mem_set_info): Likewise.
	(clear_modify_mem_tables): Likewise.

From-SVN: r171992
This commit is contained in:
Nathan Froyd 2011-04-05 17:20:44 +00:00 committed by Nathan Froyd
parent 170d8157ba
commit 6409abe3ab
2 changed files with 23 additions and 19 deletions

View File

@ -1,3 +1,12 @@
2011-04-05 Nathan Froyd <froydnj@codesourcery.com>
* gcse.c (modify_mem_list): Convert to an array of VECs.
(canon_modify_mem_list, compute_transp): Tweak formatting.
(alloc_gcse_mem): Likewise. Adjust for modify_mem_list change.
(load_killed_in_block_p): Likewise.
(record_last_mem_set_info): Likewise.
(clear_modify_mem_tables): Likewise.
2011-04-05 Tom de Vries <tom@codesourcery.com> 2011-04-05 Tom de Vries <tom@codesourcery.com>
PR middle-end/48461 PR middle-end/48461

View File

@ -382,7 +382,7 @@ static regset reg_set_bitmap;
/* Array, indexed by basic block number for a list of insns which modify /* Array, indexed by basic block number for a list of insns which modify
memory within that block. */ memory within that block. */
static rtx * modify_mem_list; static VEC (rtx,heap) **modify_mem_list;
static bitmap modify_mem_list_set; static bitmap modify_mem_list_set;
typedef struct modify_pair_s typedef struct modify_pair_s
@ -396,7 +396,7 @@ DEF_VEC_ALLOC_O(modify_pair,heap);
/* This array parallels modify_mem_list, except that it stores MEMs /* This array parallels modify_mem_list, except that it stores MEMs
being set and their canonicalized memory addresses. */ being set and their canonicalized memory addresses. */
static VEC(modify_pair,heap) **canon_modify_mem_list; static VEC (modify_pair,heap) **canon_modify_mem_list;
/* Bitmap indexed by block numbers to record which blocks contain /* Bitmap indexed by block numbers to record which blocks contain
function calls. */ function calls. */
@ -595,8 +595,8 @@ alloc_gcse_mem (void)
/* 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 = GCNEWVEC (rtx, last_basic_block); modify_mem_list = GCNEWVEC (VEC (rtx,heap) *, last_basic_block);
canon_modify_mem_list = GCNEWVEC (VEC(modify_pair,heap) *, canon_modify_mem_list = GCNEWVEC (VEC (modify_pair,heap) *,
last_basic_block); last_basic_block);
modify_mem_list_set = BITMAP_ALLOC (NULL); modify_mem_list_set = BITMAP_ALLOC (NULL);
blocks_with_calls = BITMAP_ALLOC (NULL); blocks_with_calls = BITMAP_ALLOC (NULL);
@ -991,26 +991,22 @@ mems_conflict_for_gcse_p (rtx dest, const_rtx setter ATTRIBUTE_UNUSED,
static int static int
load_killed_in_block_p (const_basic_block bb, int uid_limit, const_rtx x, int avail_p) load_killed_in_block_p (const_basic_block bb, int uid_limit, const_rtx x, int avail_p)
{ {
rtx list_entry = modify_mem_list[bb->index]; VEC (rtx,heap) *list = modify_mem_list[bb->index];
rtx setter;
unsigned ix;
/* If this is a readonly then we aren't going to be changing it. */ /* If this is a readonly then we aren't going to be changing it. */
if (MEM_READONLY_P (x)) if (MEM_READONLY_P (x))
return 0; return 0;
while (list_entry) FOR_EACH_VEC_ELT_REVERSE (rtx, list, ix, setter)
{ {
rtx setter;
/* Ignore entries in the list that do not apply. */ /* Ignore entries in the list that do not apply. */
if ((avail_p if ((avail_p
&& DF_INSN_LUID (XEXP (list_entry, 0)) < uid_limit) && DF_INSN_LUID (setter) < uid_limit)
|| (! avail_p || (! avail_p
&& DF_INSN_LUID (XEXP (list_entry, 0)) > uid_limit)) && DF_INSN_LUID (setter) > uid_limit))
{ continue;
list_entry = XEXP (list_entry, 1);
continue;
}
setter = XEXP (list_entry, 0);
/* If SETTER is a call everything is clobbered. Note that calls /* If SETTER is a call everything is clobbered. Note that calls
to pure functions are never put on the list, so we need not to pure functions are never put on the list, so we need not
@ -1028,7 +1024,6 @@ load_killed_in_block_p (const_basic_block bb, int uid_limit, const_rtx x, int av
note_stores (PATTERN (setter), mems_conflict_for_gcse_p, NULL); note_stores (PATTERN (setter), mems_conflict_for_gcse_p, NULL);
if (gcse_mems_conflict_p) if (gcse_mems_conflict_p)
return 1; return 1;
list_entry = XEXP (list_entry, 1);
} }
return 0; return 0;
} }
@ -1480,7 +1475,7 @@ record_last_mem_set_info (rtx insn)
/* load_killed_in_block_p will handle the case of calls clobbering /* load_killed_in_block_p will handle the case of calls clobbering
everything. */ everything. */
modify_mem_list[bb] = alloc_INSN_LIST (insn, modify_mem_list[bb]); VEC_safe_push (rtx, heap, modify_mem_list[bb], insn);
bitmap_set_bit (modify_mem_list_set, bb); bitmap_set_bit (modify_mem_list_set, bb);
if (CALL_P (insn)) if (CALL_P (insn))
@ -1621,7 +1616,7 @@ clear_modify_mem_tables (void)
EXECUTE_IF_SET_IN_BITMAP (modify_mem_list_set, 0, i, bi) EXECUTE_IF_SET_IN_BITMAP (modify_mem_list_set, 0, i, bi)
{ {
free_INSN_LIST_list (modify_mem_list + i); VEC_free (rtx, heap, modify_mem_list[i]);
VEC_free (modify_pair, heap, canon_modify_mem_list[i]); VEC_free (modify_pair, heap, canon_modify_mem_list[i]);
} }
bitmap_clear (modify_mem_list_set); bitmap_clear (modify_mem_list_set);
@ -1693,7 +1688,7 @@ compute_transp (const_rtx x, int indx, sbitmap *bmap)
blocks_with_calls, blocks_with_calls,
0, bb_index, bi) 0, bb_index, bi)
{ {
VEC(modify_pair,heap) *list VEC (modify_pair,heap) *list
= canon_modify_mem_list[bb_index]; = canon_modify_mem_list[bb_index];
modify_pair *pair; modify_pair *pair;
unsigned ix; unsigned ix;