Commit 3dc99c19 by David Malcolm Committed by David Malcolm

Use rtx_insn_list in various places

gcc/
2014-08-27  David Malcolm  <dmalcolm@redhat.com>

	* rtl.h (free_INSN_LIST_list): Strengthen param from rtx * to
	rtx_insn_list **.
	(alloc_INSN_LIST): Strengthen return type from rtx to
	rtx_insn_list *.
	(copy_INSN_LIST): Likewise for return type and param.
	(concat_INSN_LIST): Likewise for both params and return type.
	(remove_free_INSN_LIST_elem): Strenghten first param from rtx to
	rtx_insn *.  Strengthen second param from rtx * to rtx_insn_list **.
	(remove_free_INSN_LIST_node): Strenghten return type from rtx to
	rtx_insn *.  Strengthen param from rtx * to rtx_insn_list **.

	* sched-int.h (struct deps_reg): Strengthen fields "uses", "sets",
	"implicit_sets", "control_uses", "clobbers" from rtx to
	rtx_insn_list *.
	(struct deps_desc): Likewise for fields "pending_read_insns",
	"pending_write_insns", "pending_jump_insns",
	"last_pending_memory_flush", "last_function_call",
	"last_function_call_may_noreturn", "sched_before_next_call",
	"sched_before_next_jump".
	(struct _haifa_deps_insn_data): Likewise for field "cond_deps".
	(remove_from_deps): Strengthen second param from rtx to rtx_insn *.

	* gcse.c (struct ls_expr): Strengthen fields "loads" and "stores"
	from rtx to rtx_insn_list *.
	(ldst_entry): Replace use of NULL_RTX with NULL when dealing with
	rtx_insn_list *.

	* haifa-sched.c (insn_queue): Strengthen this variable from rtx *
	to rtx_insn_list **.
	(dep_cost_1): Strengthen local "dep_cost_rtx_link" from rtx to
	rtx_insn_list *.
	(queue_insn): Likewise for local "link".
	(struct haifa_saved_data): Strengthen field "insn_queue" from
	rtx * to rtx_insn_list **.
	(save_backtrack_point): Update allocation of save->insn_queue to
	reflect the strengthening of elements from rtx to rtx_insn_list *.
	(queue_to_ready): Strengthen local "link" from rtx to
	rtx_insn_list *; use methods "next" and "insn" when traversing the
	list.
	(early_queue_to_ready): Likewise for locals "link", "next_link",
	"prev_link".
	(schedule_block): Update allocation of insn_queue to reflect the
	strengthening of elements from rtx to rtx_insn_list *.  Strengthen
	local "link" from rtx to rtx_insn_list *, and use methods when
	working it.
	(add_to_speculative_block): Strengthen locals "twins" and
	"next_node" from rtx to rtx_insn_list *, and use methods when
	working with them.  Strengthen local "twin" from rtx to
	rtx_insn *, eliminating a checked cast.
	(fix_recovery_deps): Strengthen locals "ready_list" and "link"
	from rtx to rtx_insn_list *, and use methods when working with
	them.

	* lists.c (alloc_INSN_LIST): Strengthen return type and local "r"
	from rtx to rtx_insn_list *, adding a checked cast.
	(free_INSN_LIST_list): Strengthen param "listp" from rtx * to
	rtx_insn_list **.
	(copy_INSN_LIST): Strengthen return type and locals "new_queue",
	"newlink" from rtx to rtx_insn_list *.  Strengthen local
	"pqueue" from rtx * to rtx_insn_list **.  Strengthen local "x"
	from rtx to rtx_insn *.
	(concat_INSN_LIST): Strengthen return type and local "new_rtx",
	from rtx to rtx_insn_list *.  Use methods of the latter class.
	(remove_free_INSN_LIST_elem): Strengthen param "elem" from rtx to
	rtx_insn *, and param "listp" from rtx * to rtx_insn_list **.
	(remove_free_INSN_LIST_node): Strengthen return type and local
	"elem" from rtx to rtx_insn *.  Strenghten param "listp" from
	rtx * to rtx_insn_list **.  Strengthen local "node" from rtx to
	rtx_insn_list *, using "insn" method.

	* sched-deps.c (add_dependence_list):  Strengthen param "list"
	from rtx to rtx_insn_list *, and use methods when working with it.
	(add_dependence_list_and_free):  Strengthen param "listp" from
	rtx * to rtx_insn_list **.
	(remove_from_dependence_list): Strenghten param "listp" from rtx *
	to rtx_insn_list **, and use methods when working with *listp.
	(remove_from_both_dependence_lists): Strengthen param "listp" from
	rtx * to rtx_insn_list **
	(add_insn_mem_dependence): Strengthen local "insn_list" from rtx *
	to rtx_insn_list **.  Eliminate local "link", in favor of two new
	locals "insn_node" and "mem_node", an rtx_insn_list * and an rtx
	respectively.
	(deps_analyze_insn): Split out uses 'f local "t" as an INSN_LIST
	by introducing local "cond_deps".
	(remove_from_deps): Strengthen param "insn" from rtx to
	rtx_insn *.

	* sched-rgn.c (concat_insn_mem_list): Strengthen param
	"copy_insns" and local "new_insns" from rtx to rtx_insn_list *.
	Strengthen param "old_insns_p" from rtx * to rtx_insn_list **.
	Use methods of rtx_insn_list.

	* store-motion.c (struct st_expr): Strengthen fields
	"antic_stores" and "avail_stores" from rtx to rtx_insn_list *.
	(st_expr_entry): Replace NULL_RTX with NULL when dealing with
	rtx_insn_list *.
	(find_moveable_store): Split out "tmp" into multiple more-tightly
	scoped locals.  Use methods of rtx_insn_list *.
	(compute_store_table): Strengthen local "tmp" from rtx to
	rtx_insn *.  Use methods of rtx_insn_list *.

From-SVN: r214590
parent a756c6be
2014-08-27 David Malcolm <dmalcolm@redhat.com> 2014-08-27 David Malcolm <dmalcolm@redhat.com>
* rtl.h (free_INSN_LIST_list): Strengthen param from rtx * to
rtx_insn_list **.
(alloc_INSN_LIST): Strengthen return type from rtx to
rtx_insn_list *.
(copy_INSN_LIST): Likewise for return type and param.
(concat_INSN_LIST): Likewise for both params and return type.
(remove_free_INSN_LIST_elem): Strenghten first param from rtx to
rtx_insn *. Strengthen second param from rtx * to rtx_insn_list **.
(remove_free_INSN_LIST_node): Strenghten return type from rtx to
rtx_insn *. Strengthen param from rtx * to rtx_insn_list **.
* sched-int.h (struct deps_reg): Strengthen fields "uses", "sets",
"implicit_sets", "control_uses", "clobbers" from rtx to
rtx_insn_list *.
(struct deps_desc): Likewise for fields "pending_read_insns",
"pending_write_insns", "pending_jump_insns",
"last_pending_memory_flush", "last_function_call",
"last_function_call_may_noreturn", "sched_before_next_call",
"sched_before_next_jump".
(struct _haifa_deps_insn_data): Likewise for field "cond_deps".
(remove_from_deps): Strengthen second param from rtx to rtx_insn *.
* gcse.c (struct ls_expr): Strengthen fields "loads" and "stores"
from rtx to rtx_insn_list *.
(ldst_entry): Replace use of NULL_RTX with NULL when dealing with
rtx_insn_list *.
* haifa-sched.c (insn_queue): Strengthen this variable from rtx *
to rtx_insn_list **.
(dep_cost_1): Strengthen local "dep_cost_rtx_link" from rtx to
rtx_insn_list *.
(queue_insn): Likewise for local "link".
(struct haifa_saved_data): Strengthen field "insn_queue" from
rtx * to rtx_insn_list **.
(save_backtrack_point): Update allocation of save->insn_queue to
reflect the strengthening of elements from rtx to rtx_insn_list *.
(queue_to_ready): Strengthen local "link" from rtx to
rtx_insn_list *; use methods "next" and "insn" when traversing the
list.
(early_queue_to_ready): Likewise for locals "link", "next_link",
"prev_link".
(schedule_block): Update allocation of insn_queue to reflect the
strengthening of elements from rtx to rtx_insn_list *. Strengthen
local "link" from rtx to rtx_insn_list *, and use methods when
working it.
(add_to_speculative_block): Strengthen locals "twins" and
"next_node" from rtx to rtx_insn_list *, and use methods when
working with them. Strengthen local "twin" from rtx to
rtx_insn *, eliminating a checked cast.
(fix_recovery_deps): Strengthen locals "ready_list" and "link"
from rtx to rtx_insn_list *, and use methods when working with
them.
* lists.c (alloc_INSN_LIST): Strengthen return type and local "r"
from rtx to rtx_insn_list *, adding a checked cast.
(free_INSN_LIST_list): Strengthen param "listp" from rtx * to
rtx_insn_list **.
(copy_INSN_LIST): Strengthen return type and locals "new_queue",
"newlink" from rtx to rtx_insn_list *. Strengthen local
"pqueue" from rtx * to rtx_insn_list **. Strengthen local "x"
from rtx to rtx_insn *.
(concat_INSN_LIST): Strengthen return type and local "new_rtx",
from rtx to rtx_insn_list *. Use methods of the latter class.
(remove_free_INSN_LIST_elem): Strengthen param "elem" from rtx to
rtx_insn *, and param "listp" from rtx * to rtx_insn_list **.
(remove_free_INSN_LIST_node): Strengthen return type and local
"elem" from rtx to rtx_insn *. Strenghten param "listp" from
rtx * to rtx_insn_list **. Strengthen local "node" from rtx to
rtx_insn_list *, using "insn" method.
* sched-deps.c (add_dependence_list): Strengthen param "list"
from rtx to rtx_insn_list *, and use methods when working with it.
(add_dependence_list_and_free): Strengthen param "listp" from
rtx * to rtx_insn_list **.
(remove_from_dependence_list): Strenghten param "listp" from rtx *
to rtx_insn_list **, and use methods when working with *listp.
(remove_from_both_dependence_lists): Strengthen param "listp" from
rtx * to rtx_insn_list **
(add_insn_mem_dependence): Strengthen local "insn_list" from rtx *
to rtx_insn_list **. Eliminate local "link", in favor of two new
locals "insn_node" and "mem_node", an rtx_insn_list * and an rtx
respectively.
(deps_analyze_insn): Split out uses 'f local "t" as an INSN_LIST
by introducing local "cond_deps".
(remove_from_deps): Strengthen param "insn" from rtx to
rtx_insn *.
* sched-rgn.c (concat_insn_mem_list): Strengthen param
"copy_insns" and local "new_insns" from rtx to rtx_insn_list *.
Strengthen param "old_insns_p" from rtx * to rtx_insn_list **.
Use methods of rtx_insn_list.
* store-motion.c (struct st_expr): Strengthen fields
"antic_stores" and "avail_stores" from rtx to rtx_insn_list *.
(st_expr_entry): Replace NULL_RTX with NULL when dealing with
rtx_insn_list *.
(find_moveable_store): Split out "tmp" into multiple more-tightly
scoped locals. Use methods of rtx_insn_list *.
(compute_store_table): Strengthen local "tmp" from rtx to
rtx_insn *. Use methods of rtx_insn_list *.
2014-08-27 David Malcolm <dmalcolm@redhat.com>
* coretypes.h (class rtx_insn_list): Add forward declaration. * coretypes.h (class rtx_insn_list): Add forward declaration.
* rtl.h (class rtx_insn_list): New subclass of rtx_def * rtl.h (class rtx_insn_list): New subclass of rtx_def
(is_a_helper <rtx_insn_list *>::test): New. (is_a_helper <rtx_insn_list *>::test): New.
......
...@@ -347,8 +347,8 @@ struct ls_expr ...@@ -347,8 +347,8 @@ struct ls_expr
struct expr * expr; /* Gcse expression reference for LM. */ struct expr * expr; /* Gcse expression reference for LM. */
rtx pattern; /* Pattern of this mem. */ rtx pattern; /* Pattern of this mem. */
rtx pattern_regs; /* List of registers mentioned by the mem. */ rtx pattern_regs; /* List of registers mentioned by the mem. */
rtx loads; /* INSN list of loads seen. */ rtx_insn_list *loads; /* INSN list of loads seen. */
rtx stores; /* INSN list of stores seen. */ rtx_insn_list *stores; /* INSN list of stores seen. */
struct ls_expr * next; /* Next in the list. */ struct ls_expr * next; /* Next in the list. */
int invalid; /* Invalid for some reason. */ int invalid; /* Invalid for some reason. */
int index; /* If it maps to a bitmap index. */ int index; /* If it maps to a bitmap index. */
...@@ -3774,8 +3774,8 @@ ldst_entry (rtx x) ...@@ -3774,8 +3774,8 @@ ldst_entry (rtx x)
ptr->expr = NULL; ptr->expr = NULL;
ptr->pattern = x; ptr->pattern = x;
ptr->pattern_regs = NULL_RTX; ptr->pattern_regs = NULL_RTX;
ptr->loads = NULL_RTX; ptr->loads = NULL;
ptr->stores = NULL_RTX; ptr->stores = NULL;
ptr->reaching_reg = NULL_RTX; ptr->reaching_reg = NULL_RTX;
ptr->invalid = 0; ptr->invalid = 0;
ptr->index = 0; ptr->index = 0;
......
...@@ -318,7 +318,7 @@ bool adding_bb_to_current_region_p = true; ...@@ -318,7 +318,7 @@ bool adding_bb_to_current_region_p = true;
the base maximal time of functional unit reservations and getting a the base maximal time of functional unit reservations and getting a
result. This is the longest time an insn may be queued. */ result. This is the longest time an insn may be queued. */
static rtx *insn_queue; static rtx_insn_list **insn_queue;
static int q_ptr = 0; static int q_ptr = 0;
static int q_size = 0; static int q_size = 0;
#define NEXT_Q(X) (((X)+1) & max_insn_queue_index) #define NEXT_Q(X) (((X)+1) & max_insn_queue_index)
...@@ -1475,7 +1475,8 @@ dep_cost_1 (dep_t link, dw_t dw) ...@@ -1475,7 +1475,8 @@ dep_cost_1 (dep_t link, dw_t dw)
{ {
/* This variable is used for backward compatibility with the /* This variable is used for backward compatibility with the
targets. */ targets. */
rtx dep_cost_rtx_link = alloc_INSN_LIST (NULL_RTX, NULL_RTX); rtx_insn_list *dep_cost_rtx_link =
alloc_INSN_LIST (NULL_RTX, NULL);
/* Make it self-cycled, so that if some tries to walk over this /* Make it self-cycled, so that if some tries to walk over this
incomplete list he/she will be caught in an endless loop. */ incomplete list he/she will be caught in an endless loop. */
...@@ -2745,7 +2746,7 @@ HAIFA_INLINE static void ...@@ -2745,7 +2746,7 @@ HAIFA_INLINE static void
queue_insn (rtx_insn *insn, int n_cycles, const char *reason) queue_insn (rtx_insn *insn, int n_cycles, const char *reason)
{ {
int next_q = NEXT_Q_AFTER (q_ptr, n_cycles); int next_q = NEXT_Q_AFTER (q_ptr, n_cycles);
rtx link = alloc_INSN_LIST (insn, insn_queue[next_q]); rtx_insn_list *link = alloc_INSN_LIST (insn, insn_queue[next_q]);
int new_tick; int new_tick;
gcc_assert (n_cycles <= max_insn_queue_index); gcc_assert (n_cycles <= max_insn_queue_index);
...@@ -4112,7 +4113,7 @@ struct haifa_saved_data ...@@ -4112,7 +4113,7 @@ struct haifa_saved_data
/* We don't need to save q_ptr, as its value is arbitrary and we can set it /* We don't need to save q_ptr, as its value is arbitrary and we can set it
to 0 when restoring. */ to 0 when restoring. */
int q_size; int q_size;
rtx *insn_queue; rtx_insn_list **insn_queue;
/* Describe pattern replacements that occurred since this backtrack point /* Describe pattern replacements that occurred since this backtrack point
was queued. */ was queued. */
...@@ -4163,7 +4164,7 @@ save_backtrack_point (struct delay_pair *pair, ...@@ -4163,7 +4164,7 @@ save_backtrack_point (struct delay_pair *pair,
save->ready.vec = XNEWVEC (rtx_insn *, ready.veclen); save->ready.vec = XNEWVEC (rtx_insn *, ready.veclen);
memcpy (save->ready.vec, ready.vec, ready.veclen * sizeof (rtx)); memcpy (save->ready.vec, ready.vec, ready.veclen * sizeof (rtx));
save->insn_queue = XNEWVEC (rtx, max_insn_queue_index + 1); save->insn_queue = XNEWVEC (rtx_insn_list *, max_insn_queue_index + 1);
save->q_size = q_size; save->q_size = q_size;
for (i = 0; i <= max_insn_queue_index; i++) for (i = 0; i <= max_insn_queue_index; i++)
{ {
...@@ -4926,7 +4927,7 @@ static void ...@@ -4926,7 +4927,7 @@ static void
queue_to_ready (struct ready_list *ready) queue_to_ready (struct ready_list *ready)
{ {
rtx_insn *insn; rtx_insn *insn;
rtx link; rtx_insn_list *link;
rtx skip_insn; rtx skip_insn;
q_ptr = NEXT_Q (q_ptr); q_ptr = NEXT_Q (q_ptr);
...@@ -4940,9 +4941,9 @@ queue_to_ready (struct ready_list *ready) ...@@ -4940,9 +4941,9 @@ queue_to_ready (struct ready_list *ready)
/* Add all pending insns that can be scheduled without stalls to the /* Add all pending insns that can be scheduled without stalls to the
ready list. */ ready list. */
for (link = insn_queue[q_ptr]; link; link = XEXP (link, 1)) for (link = insn_queue[q_ptr]; link; link = link->next ())
{ {
insn = as_a <rtx_insn *> (XEXP (link, 0)); insn = link->insn ();
q_size -= 1; q_size -= 1;
if (sched_verbose >= 2) if (sched_verbose >= 2)
...@@ -4988,7 +4989,7 @@ queue_to_ready (struct ready_list *ready) ...@@ -4988,7 +4989,7 @@ queue_to_ready (struct ready_list *ready)
{ {
if ((link = insn_queue[NEXT_Q_AFTER (q_ptr, stalls)])) if ((link = insn_queue[NEXT_Q_AFTER (q_ptr, stalls)]))
{ {
for (; link; link = XEXP (link, 1)) for (; link; link = link->next ())
{ {
insn = as_a <rtx_insn *> (XEXP (link, 0)); insn = as_a <rtx_insn *> (XEXP (link, 0));
q_size -= 1; q_size -= 1;
...@@ -5082,9 +5083,9 @@ static int ...@@ -5082,9 +5083,9 @@ static int
early_queue_to_ready (state_t state, struct ready_list *ready) early_queue_to_ready (state_t state, struct ready_list *ready)
{ {
rtx_insn *insn; rtx_insn *insn;
rtx link; rtx_insn_list *link;
rtx next_link; rtx_insn_list *next_link;
rtx prev_link; rtx_insn_list *prev_link;
bool move_to_ready; bool move_to_ready;
int cost; int cost;
state_t temp_state = alloca (dfa_state_size); state_t temp_state = alloca (dfa_state_size);
...@@ -5118,8 +5119,8 @@ early_queue_to_ready (state_t state, struct ready_list *ready) ...@@ -5118,8 +5119,8 @@ early_queue_to_ready (state_t state, struct ready_list *ready)
prev_link = 0; prev_link = 0;
while (link) while (link)
{ {
next_link = XEXP (link, 1); next_link = link->next ();
insn = as_a <rtx_insn *> (XEXP (link, 0)); insn = link->insn ();
if (insn && sched_verbose > 6) if (insn && sched_verbose > 6)
print_rtl_single (sched_dump, insn); print_rtl_single (sched_dump, insn);
...@@ -6038,7 +6039,7 @@ schedule_block (basic_block *target_bb, state_t init_state) ...@@ -6038,7 +6039,7 @@ schedule_block (basic_block *target_bb, state_t init_state)
q_ptr = 0; q_ptr = 0;
q_size = 0; q_size = 0;
insn_queue = XALLOCAVEC (rtx, max_insn_queue_index + 1); insn_queue = XALLOCAVEC (rtx_insn_list *, max_insn_queue_index + 1);
memset (insn_queue, 0, (max_insn_queue_index + 1) * sizeof (rtx)); memset (insn_queue, 0, (max_insn_queue_index + 1) * sizeof (rtx));
/* Start just before the beginning of time. */ /* Start just before the beginning of time. */
...@@ -6503,11 +6504,11 @@ schedule_block (basic_block *target_bb, state_t init_state) ...@@ -6503,11 +6504,11 @@ schedule_block (basic_block *target_bb, state_t init_state)
} }
for (i = 0; i <= max_insn_queue_index; i++) for (i = 0; i <= max_insn_queue_index; i++)
{ {
rtx link; rtx_insn_list *link;
while ((link = insn_queue[i]) != NULL) while ((link = insn_queue[i]) != NULL)
{ {
rtx_insn *x = as_a <rtx_insn *> (XEXP (link, 0)); rtx_insn *x = link->insn ();
insn_queue[i] = XEXP (link, 1); insn_queue[i] = link->next ();
QUEUE_INDEX (x) = QUEUE_NOWHERE; QUEUE_INDEX (x) = QUEUE_NOWHERE;
free_INSN_LIST_node (link); free_INSN_LIST_node (link);
resolve_dependencies (x); resolve_dependencies (x);
...@@ -7424,7 +7425,7 @@ add_to_speculative_block (rtx_insn *insn) ...@@ -7424,7 +7425,7 @@ add_to_speculative_block (rtx_insn *insn)
ds_t ts; ds_t ts;
sd_iterator_def sd_it; sd_iterator_def sd_it;
dep_t dep; dep_t dep;
rtx twins = NULL; rtx_insn_list *twins = NULL;
rtx_vec_t priorities_roots; rtx_vec_t priorities_roots;
ts = TODO_SPEC (insn); ts = TODO_SPEC (insn);
...@@ -7535,20 +7536,21 @@ add_to_speculative_block (rtx_insn *insn) ...@@ -7535,20 +7536,21 @@ add_to_speculative_block (rtx_insn *insn)
because that would make TWINS appear in the INSN_BACK_DEPS (INSN). */ because that would make TWINS appear in the INSN_BACK_DEPS (INSN). */
while (twins) while (twins)
{ {
rtx twin; rtx_insn *twin;
rtx_insn_list *next_node;
twin = XEXP (twins, 0); twin = twins->insn ();
{ {
dep_def _new_dep, *new_dep = &_new_dep; dep_def _new_dep, *new_dep = &_new_dep;
init_dep (new_dep, insn, as_a <rtx_insn *> (twin), REG_DEP_OUTPUT); init_dep (new_dep, insn, twin, REG_DEP_OUTPUT);
sd_add_dep (new_dep, false); sd_add_dep (new_dep, false);
} }
twin = XEXP (twins, 1); next_node = twins->next ();
free_INSN_LIST_node (twins); free_INSN_LIST_node (twins);
twins = twin; twins = next_node;
} }
calc_priorities (priorities_roots); calc_priorities (priorities_roots);
...@@ -8066,9 +8068,9 @@ static void ...@@ -8066,9 +8068,9 @@ static void
fix_recovery_deps (basic_block rec) fix_recovery_deps (basic_block rec)
{ {
rtx_insn *note, *insn, *jump; rtx_insn *note, *insn, *jump;
rtx ready_list = 0; rtx_insn_list *ready_list = 0;
bitmap_head in_ready; bitmap_head in_ready;
rtx link; rtx_insn_list *link;
bitmap_initialize (&in_ready, 0); bitmap_initialize (&in_ready, 0);
...@@ -8111,8 +8113,8 @@ fix_recovery_deps (basic_block rec) ...@@ -8111,8 +8113,8 @@ fix_recovery_deps (basic_block rec)
bitmap_clear (&in_ready); bitmap_clear (&in_ready);
/* Try to add instructions to the ready or queue list. */ /* Try to add instructions to the ready or queue list. */
for (link = ready_list; link; link = XEXP (link, 1)) for (link = ready_list; link; link = link->next ())
try_ready (as_a <rtx_insn *> (XEXP (link, 0))); try_ready (link->insn ());
free_INSN_LIST_list (&ready_list); free_INSN_LIST_list (&ready_list);
/* Fixing jump's dependences. */ /* Fixing jump's dependences. */
......
...@@ -101,15 +101,15 @@ remove_list_elem (rtx elem, rtx *listp) ...@@ -101,15 +101,15 @@ remove_list_elem (rtx elem, rtx *listp)
/* This call is used in place of a gen_rtx_INSN_LIST. If there is a cached /* This call is used in place of a gen_rtx_INSN_LIST. If there is a cached
node available, we'll use it, otherwise a call to gen_rtx_INSN_LIST node available, we'll use it, otherwise a call to gen_rtx_INSN_LIST
is made. */ is made. */
rtx rtx_insn_list *
alloc_INSN_LIST (rtx val, rtx next) alloc_INSN_LIST (rtx val, rtx next)
{ {
rtx r; rtx_insn_list *r;
if (unused_insn_list) if (unused_insn_list)
{ {
r = unused_insn_list; r = as_a <rtx_insn_list *> (unused_insn_list);
unused_insn_list = XEXP (r, 1); unused_insn_list = r->next ();
XEXP (r, 0) = val; XEXP (r, 0) = val;
XEXP (r, 1) = next; XEXP (r, 1) = next;
PUT_REG_NOTE_KIND (r, VOIDmode); PUT_REG_NOTE_KIND (r, VOIDmode);
...@@ -155,39 +155,39 @@ free_EXPR_LIST_list (rtx *listp) ...@@ -155,39 +155,39 @@ free_EXPR_LIST_list (rtx *listp)
/* This function will free up an entire list of INSN_LIST nodes. */ /* This function will free up an entire list of INSN_LIST nodes. */
void void
free_INSN_LIST_list (rtx *listp) free_INSN_LIST_list (rtx_insn_list **listp)
{ {
if (*listp == 0) if (*listp == 0)
return; return;
free_list (listp, &unused_insn_list); free_list ((rtx *)listp, &unused_insn_list);
} }
/* Make a copy of the INSN_LIST list LINK and return it. */ /* Make a copy of the INSN_LIST list LINK and return it. */
rtx rtx_insn_list *
copy_INSN_LIST (rtx link) copy_INSN_LIST (rtx_insn_list *link)
{ {
rtx new_queue; rtx_insn_list *new_queue;
rtx *pqueue = &new_queue; rtx_insn_list **pqueue = &new_queue;
for (; link; link = XEXP (link, 1)) for (; link; link = link->next ())
{ {
rtx x = XEXP (link, 0); rtx_insn *x = link->insn ();
rtx newlink = alloc_INSN_LIST (x, NULL); rtx_insn_list *newlink = alloc_INSN_LIST (x, NULL);
*pqueue = newlink; *pqueue = newlink;
pqueue = &XEXP (newlink, 1); pqueue = (rtx_insn_list **)&XEXP (newlink, 1);
} }
*pqueue = NULL_RTX; *pqueue = NULL;
return new_queue; return new_queue;
} }
/* Duplicate the INSN_LIST elements of COPY and prepend them to OLD. */ /* Duplicate the INSN_LIST elements of COPY and prepend them to OLD. */
rtx rtx_insn_list *
concat_INSN_LIST (rtx copy, rtx old) concat_INSN_LIST (rtx_insn_list *copy, rtx_insn_list *old)
{ {
rtx new_rtx = old; rtx_insn_list *new_rtx = old;
for (; copy ; copy = XEXP (copy, 1)) for (; copy ; copy = copy->next ())
{ {
new_rtx = alloc_INSN_LIST (XEXP (copy, 0), new_rtx); new_rtx = alloc_INSN_LIST (copy->insn (), new_rtx);
PUT_REG_NOTE_KIND (new_rtx, REG_NOTE_KIND (copy)); PUT_REG_NOTE_KIND (new_rtx, REG_NOTE_KIND (copy));
} }
return new_rtx; return new_rtx;
...@@ -213,19 +213,19 @@ free_INSN_LIST_node (rtx ptr) ...@@ -213,19 +213,19 @@ free_INSN_LIST_node (rtx ptr)
/* Remove and free corresponding to ELEM node in the INSN_LIST pointed to /* Remove and free corresponding to ELEM node in the INSN_LIST pointed to
by LISTP. */ by LISTP. */
void void
remove_free_INSN_LIST_elem (rtx elem, rtx *listp) remove_free_INSN_LIST_elem (rtx_insn *elem, rtx_insn_list **listp)
{ {
free_INSN_LIST_node (remove_list_elem (elem, listp)); free_INSN_LIST_node (remove_list_elem (elem, (rtx *)listp));
} }
/* Remove and free the first node in the INSN_LIST pointed to by LISTP. */ /* Remove and free the first node in the INSN_LIST pointed to by LISTP. */
rtx rtx_insn *
remove_free_INSN_LIST_node (rtx *listp) remove_free_INSN_LIST_node (rtx_insn_list **listp)
{ {
rtx node = *listp; rtx_insn_list *node = *listp;
rtx elem = XEXP (node, 0); rtx_insn *elem = node->insn ();
remove_list_node (listp); remove_list_node ((rtx *)listp);
free_INSN_LIST_node (node); free_INSN_LIST_node (node);
return elem; return elem;
......
...@@ -2776,16 +2776,16 @@ extern void subreg_get_info (unsigned int, enum machine_mode, ...@@ -2776,16 +2776,16 @@ extern void subreg_get_info (unsigned int, enum machine_mode,
/* lists.c */ /* lists.c */
extern void free_EXPR_LIST_list (rtx *); extern void free_EXPR_LIST_list (rtx *);
extern void free_INSN_LIST_list (rtx *); extern void free_INSN_LIST_list (rtx_insn_list **);
extern void free_EXPR_LIST_node (rtx); extern void free_EXPR_LIST_node (rtx);
extern void free_INSN_LIST_node (rtx); extern void free_INSN_LIST_node (rtx);
extern rtx alloc_INSN_LIST (rtx, rtx); extern rtx_insn_list *alloc_INSN_LIST (rtx, rtx);
extern rtx copy_INSN_LIST (rtx); extern rtx_insn_list *copy_INSN_LIST (rtx_insn_list *);
extern rtx concat_INSN_LIST (rtx, rtx); extern rtx_insn_list *concat_INSN_LIST (rtx_insn_list *, rtx_insn_list *);
extern rtx alloc_EXPR_LIST (int, rtx, rtx); extern rtx alloc_EXPR_LIST (int, rtx, rtx);
extern void remove_free_INSN_LIST_elem (rtx, rtx *); extern void remove_free_INSN_LIST_elem (rtx_insn *, rtx_insn_list **);
extern rtx remove_list_elem (rtx, rtx *); extern rtx remove_list_elem (rtx, rtx *);
extern rtx remove_free_INSN_LIST_node (rtx *); extern rtx_insn *remove_free_INSN_LIST_node (rtx_insn_list **);
extern rtx remove_free_EXPR_LIST_node (rtx *); extern rtx remove_free_EXPR_LIST_node (rtx *);
......
...@@ -483,9 +483,11 @@ static bool mark_as_hard; ...@@ -483,9 +483,11 @@ static bool mark_as_hard;
static int deps_may_trap_p (const_rtx); static int deps_may_trap_p (const_rtx);
static void add_dependence_1 (rtx_insn *, rtx_insn *, enum reg_note); static void add_dependence_1 (rtx_insn *, rtx_insn *, enum reg_note);
static void add_dependence_list (rtx_insn *, rtx, int, enum reg_note, bool); static void add_dependence_list (rtx_insn *, rtx_insn_list *, int,
enum reg_note, bool);
static void add_dependence_list_and_free (struct deps_desc *, rtx_insn *, static void add_dependence_list_and_free (struct deps_desc *, rtx_insn *,
rtx *, int, enum reg_note, bool); rtx_insn_list **, int, enum reg_note,
bool);
static void delete_all_dependences (rtx); static void delete_all_dependences (rtx);
static void chain_to_prev_insn (rtx_insn *); static void chain_to_prev_insn (rtx_insn *);
...@@ -1561,14 +1563,14 @@ add_dependence (rtx_insn *con, rtx_insn *pro, enum reg_note dep_type) ...@@ -1561,14 +1563,14 @@ add_dependence (rtx_insn *con, rtx_insn *pro, enum reg_note dep_type)
true if DEP_NONREG should be set on newly created dependencies. */ true if DEP_NONREG should be set on newly created dependencies. */
static void static void
add_dependence_list (rtx_insn *insn, rtx list, int uncond, enum reg_note dep_type, add_dependence_list (rtx_insn *insn, rtx_insn_list *list, int uncond,
bool hard) enum reg_note dep_type, bool hard)
{ {
mark_as_hard = hard; mark_as_hard = hard;
for (; list; list = XEXP (list, 1)) for (; list; list = list->next ())
{ {
if (uncond || ! sched_insns_conditions_mutex_p (insn, XEXP (list, 0))) if (uncond || ! sched_insns_conditions_mutex_p (insn, list->insn ()))
add_dependence (insn, as_a <rtx_insn *> (XEXP (list, 0)), dep_type); add_dependence (insn, list->insn (), dep_type);
} }
mark_as_hard = false; mark_as_hard = false;
} }
...@@ -1578,7 +1580,8 @@ add_dependence_list (rtx_insn *insn, rtx list, int uncond, enum reg_note dep_typ ...@@ -1578,7 +1580,8 @@ add_dependence_list (rtx_insn *insn, rtx list, int uncond, enum reg_note dep_typ
newly created dependencies. */ newly created dependencies. */
static void static void
add_dependence_list_and_free (struct deps_desc *deps, rtx_insn *insn, rtx *listp, add_dependence_list_and_free (struct deps_desc *deps, rtx_insn *insn,
rtx_insn_list **listp,
int uncond, enum reg_note dep_type, bool hard) int uncond, enum reg_note dep_type, bool hard)
{ {
add_dependence_list (insn, *listp, uncond, dep_type, hard); add_dependence_list (insn, *listp, uncond, dep_type, hard);
...@@ -1596,20 +1599,20 @@ add_dependence_list_and_free (struct deps_desc *deps, rtx_insn *insn, rtx *listp ...@@ -1596,20 +1599,20 @@ add_dependence_list_and_free (struct deps_desc *deps, rtx_insn *insn, rtx *listp
occurrences removed. */ occurrences removed. */
static int static int
remove_from_dependence_list (rtx insn, rtx* listp) remove_from_dependence_list (rtx insn, rtx_insn_list **listp)
{ {
int removed = 0; int removed = 0;
while (*listp) while (*listp)
{ {
if (XEXP (*listp, 0) == insn) if ((*listp)->insn () == insn)
{ {
remove_free_INSN_LIST_node (listp); remove_free_INSN_LIST_node (listp);
removed++; removed++;
continue; continue;
} }
listp = &XEXP (*listp, 1); listp = (rtx_insn_list **)&XEXP (*listp, 1);
} }
return removed; return removed;
...@@ -1617,7 +1620,9 @@ remove_from_dependence_list (rtx insn, rtx* listp) ...@@ -1617,7 +1620,9 @@ remove_from_dependence_list (rtx insn, rtx* listp)
/* Same as above, but process two lists at once. */ /* Same as above, but process two lists at once. */
static int static int
remove_from_both_dependence_lists (rtx insn, rtx *listp, rtx *exprp) remove_from_both_dependence_lists (rtx insn,
rtx_insn_list **listp,
rtx *exprp)
{ {
int removed = 0; int removed = 0;
...@@ -1631,7 +1636,7 @@ remove_from_both_dependence_lists (rtx insn, rtx *listp, rtx *exprp) ...@@ -1631,7 +1636,7 @@ remove_from_both_dependence_lists (rtx insn, rtx *listp, rtx *exprp)
continue; continue;
} }
listp = &XEXP (*listp, 1); listp = (rtx_insn_list **)&XEXP (*listp, 1);
exprp = &XEXP (*exprp, 1); exprp = &XEXP (*exprp, 1);
} }
...@@ -1712,9 +1717,10 @@ static void ...@@ -1712,9 +1717,10 @@ static void
add_insn_mem_dependence (struct deps_desc *deps, bool read_p, add_insn_mem_dependence (struct deps_desc *deps, bool read_p,
rtx_insn *insn, rtx mem) rtx_insn *insn, rtx mem)
{ {
rtx *insn_list; rtx_insn_list **insn_list;
rtx_insn_list *insn_node;
rtx *mem_list; rtx *mem_list;
rtx link; rtx mem_node;
gcc_assert (!deps->readonly); gcc_assert (!deps->readonly);
if (read_p) if (read_p)
...@@ -1731,8 +1737,8 @@ add_insn_mem_dependence (struct deps_desc *deps, bool read_p, ...@@ -1731,8 +1737,8 @@ add_insn_mem_dependence (struct deps_desc *deps, bool read_p,
deps->pending_write_list_length++; deps->pending_write_list_length++;
} }
link = alloc_INSN_LIST (insn, *insn_list); insn_node = alloc_INSN_LIST (insn, *insn_list);
*insn_list = link; *insn_list = insn_node;
if (sched_deps_info->use_cselib) if (sched_deps_info->use_cselib)
{ {
...@@ -1740,8 +1746,8 @@ add_insn_mem_dependence (struct deps_desc *deps, bool read_p, ...@@ -1740,8 +1746,8 @@ add_insn_mem_dependence (struct deps_desc *deps, bool read_p,
XEXP (mem, 0) = cselib_subst_to_values_from_insn (XEXP (mem, 0), XEXP (mem, 0) = cselib_subst_to_values_from_insn (XEXP (mem, 0),
GET_MODE (mem), insn); GET_MODE (mem), insn);
} }
link = alloc_EXPR_LIST (VOIDmode, canon_rtx (mem), *mem_list); mem_node = alloc_EXPR_LIST (VOIDmode, canon_rtx (mem), *mem_list);
*mem_list = link; *mem_list = mem_node;
} }
/* Make a dependency between every memory reference on the pending lists /* Make a dependency between every memory reference on the pending lists
...@@ -3603,7 +3609,7 @@ deps_analyze_insn (struct deps_desc *deps, rtx_insn *insn) ...@@ -3603,7 +3609,7 @@ deps_analyze_insn (struct deps_desc *deps, rtx_insn *insn)
rtx t; rtx t;
sched_get_condition_with_rev (insn, NULL); sched_get_condition_with_rev (insn, NULL);
t = INSN_CACHED_COND (insn); t = INSN_CACHED_COND (insn);
INSN_COND_DEPS (insn) = NULL_RTX; INSN_COND_DEPS (insn) = NULL;
if (reload_completed if (reload_completed
&& (current_sched_info->flags & DO_PREDICATION) && (current_sched_info->flags & DO_PREDICATION)
&& COMPARISON_P (t) && COMPARISON_P (t)
...@@ -3612,18 +3618,18 @@ deps_analyze_insn (struct deps_desc *deps, rtx_insn *insn) ...@@ -3612,18 +3618,18 @@ deps_analyze_insn (struct deps_desc *deps, rtx_insn *insn)
{ {
unsigned int regno; unsigned int regno;
int nregs; int nregs;
rtx_insn_list *cond_deps = NULL;
t = XEXP (t, 0); t = XEXP (t, 0);
regno = REGNO (t); regno = REGNO (t);
nregs = hard_regno_nregs[regno][GET_MODE (t)]; nregs = hard_regno_nregs[regno][GET_MODE (t)];
t = NULL_RTX;
while (nregs-- > 0) while (nregs-- > 0)
{ {
struct deps_reg *reg_last = &deps->reg_last[regno + nregs]; struct deps_reg *reg_last = &deps->reg_last[regno + nregs];
t = concat_INSN_LIST (reg_last->sets, t); cond_deps = concat_INSN_LIST (reg_last->sets, cond_deps);
t = concat_INSN_LIST (reg_last->clobbers, t); cond_deps = concat_INSN_LIST (reg_last->clobbers, cond_deps);
t = concat_INSN_LIST (reg_last->implicit_sets, t); cond_deps = concat_INSN_LIST (reg_last->implicit_sets, cond_deps);
} }
INSN_COND_DEPS (insn) = t; INSN_COND_DEPS (insn) = cond_deps;
} }
} }
...@@ -3968,7 +3974,7 @@ free_deps (struct deps_desc *deps) ...@@ -3968,7 +3974,7 @@ free_deps (struct deps_desc *deps)
/* Remove INSN from dependence contexts DEPS. */ /* Remove INSN from dependence contexts DEPS. */
void void
remove_from_deps (struct deps_desc *deps, rtx insn) remove_from_deps (struct deps_desc *deps, rtx_insn *insn)
{ {
int removed; int removed;
unsigned i; unsigned i;
......
...@@ -449,11 +449,11 @@ enum post_call_group ...@@ -449,11 +449,11 @@ enum post_call_group
/* Insns which affect pseudo-registers. */ /* Insns which affect pseudo-registers. */
struct deps_reg struct deps_reg
{ {
rtx uses; rtx_insn_list *uses;
rtx sets; rtx_insn_list *sets;
rtx implicit_sets; rtx_insn_list *implicit_sets;
rtx control_uses; rtx_insn_list *control_uses;
rtx clobbers; rtx_insn_list *clobbers;
int uses_length; int uses_length;
int clobbers_length; int clobbers_length;
}; };
...@@ -471,19 +471,19 @@ struct deps_desc ...@@ -471,19 +471,19 @@ struct deps_desc
to a list more than once. */ to a list more than once. */
/* An INSN_LIST containing all insns with pending read operations. */ /* An INSN_LIST containing all insns with pending read operations. */
rtx pending_read_insns; rtx_insn_list *pending_read_insns;
/* An EXPR_LIST containing all MEM rtx's which are pending reads. */ /* An EXPR_LIST containing all MEM rtx's which are pending reads. */
rtx pending_read_mems; rtx pending_read_mems;
/* An INSN_LIST containing all insns with pending write operations. */ /* An INSN_LIST containing all insns with pending write operations. */
rtx pending_write_insns; rtx_insn_list *pending_write_insns;
/* An EXPR_LIST containing all MEM rtx's which are pending writes. */ /* An EXPR_LIST containing all MEM rtx's which are pending writes. */
rtx pending_write_mems; rtx pending_write_mems;
/* An INSN_LIST containing all jump insns. */ /* An INSN_LIST containing all jump insns. */
rtx pending_jump_insns; rtx_insn_list *pending_jump_insns;
/* We must prevent the above lists from ever growing too large since /* We must prevent the above lists from ever growing too large since
the number of dependencies produced is at least O(N*N), the number of dependencies produced is at least O(N*N),
...@@ -510,27 +510,27 @@ struct deps_desc ...@@ -510,27 +510,27 @@ struct deps_desc
alias analysis, this restriction can be relaxed. alias analysis, this restriction can be relaxed.
This may also be an INSN that writes memory if the pending lists grow This may also be an INSN that writes memory if the pending lists grow
too large. */ too large. */
rtx last_pending_memory_flush; rtx_insn_list *last_pending_memory_flush;
/* A list of the last function calls we have seen. We use a list to /* A list of the last function calls we have seen. We use a list to
represent last function calls from multiple predecessor blocks. represent last function calls from multiple predecessor blocks.
Used to prevent register lifetimes from expanding unnecessarily. */ Used to prevent register lifetimes from expanding unnecessarily. */
rtx last_function_call; rtx_insn_list *last_function_call;
/* A list of the last function calls that may not return normally /* A list of the last function calls that may not return normally
we have seen. We use a list to represent last function calls from we have seen. We use a list to represent last function calls from
multiple predecessor blocks. Used to prevent moving trapping insns multiple predecessor blocks. Used to prevent moving trapping insns
across such calls. */ across such calls. */
rtx last_function_call_may_noreturn; rtx_insn_list *last_function_call_may_noreturn;
/* A list of insns which use a pseudo register that does not already /* A list of insns which use a pseudo register that does not already
cross a call. We create dependencies between each of those insn cross a call. We create dependencies between each of those insn
and the next call insn, to ensure that they won't cross a call after and the next call insn, to ensure that they won't cross a call after
scheduling is done. */ scheduling is done. */
rtx sched_before_next_call; rtx_insn_list *sched_before_next_call;
/* Similarly, a list of insns which should not cross a branch. */ /* Similarly, a list of insns which should not cross a branch. */
rtx sched_before_next_jump; rtx_insn_list *sched_before_next_jump;
/* Used to keep post-call pseudo/hard reg movements together with /* Used to keep post-call pseudo/hard reg movements together with
the call. */ the call. */
...@@ -737,7 +737,7 @@ struct _haifa_deps_insn_data ...@@ -737,7 +737,7 @@ struct _haifa_deps_insn_data
/* For a conditional insn, a list of insns that could set the condition /* For a conditional insn, a list of insns that could set the condition
register. Used when generating control dependencies. */ register. Used when generating control dependencies. */
rtx cond_deps; rtx_insn_list *cond_deps;
/* True if the condition in 'cond' should be reversed to get the actual /* True if the condition in 'cond' should be reversed to get the actual
condition. */ condition. */
...@@ -1302,7 +1302,7 @@ extern void free_deps (struct deps_desc *); ...@@ -1302,7 +1302,7 @@ extern void free_deps (struct deps_desc *);
extern void init_deps_global (void); extern void init_deps_global (void);
extern void finish_deps_global (void); extern void finish_deps_global (void);
extern void deps_analyze_insn (struct deps_desc *, rtx_insn *); extern void deps_analyze_insn (struct deps_desc *, rtx_insn *);
extern void remove_from_deps (struct deps_desc *, rtx); extern void remove_from_deps (struct deps_desc *, rtx_insn *);
extern void init_insn_reg_pressure_info (rtx); extern void init_insn_reg_pressure_info (rtx);
extern dw_t get_dep_weak (ds_t, ds_t); extern dw_t get_dep_weak (ds_t, ds_t);
......
...@@ -240,7 +240,8 @@ static void add_branch_dependences (rtx_insn *, rtx_insn *); ...@@ -240,7 +240,8 @@ static void add_branch_dependences (rtx_insn *, rtx_insn *);
static void compute_block_dependences (int); static void compute_block_dependences (int);
static void schedule_region (int); static void schedule_region (int);
static void concat_insn_mem_list (rtx, rtx, rtx *, rtx *); static void concat_insn_mem_list (rtx_insn_list *, rtx,
rtx_insn_list **, rtx *);
static void propagate_deps (int, struct deps_desc *); static void propagate_deps (int, struct deps_desc *);
static void free_pending_lists (void); static void free_pending_lists (void);
...@@ -2584,17 +2585,18 @@ add_branch_dependences (rtx_insn *head, rtx_insn *tail) ...@@ -2584,17 +2585,18 @@ add_branch_dependences (rtx_insn *head, rtx_insn *tail)
static struct deps_desc *bb_deps; static struct deps_desc *bb_deps;
static void static void
concat_insn_mem_list (rtx copy_insns, rtx copy_mems, rtx *old_insns_p, concat_insn_mem_list (rtx_insn_list *copy_insns, rtx copy_mems,
rtx_insn_list **old_insns_p,
rtx *old_mems_p) rtx *old_mems_p)
{ {
rtx new_insns = *old_insns_p; rtx_insn_list *new_insns = *old_insns_p;
rtx new_mems = *old_mems_p; rtx new_mems = *old_mems_p;
while (copy_insns) while (copy_insns)
{ {
new_insns = alloc_INSN_LIST (XEXP (copy_insns, 0), new_insns); new_insns = alloc_INSN_LIST (copy_insns->insn (), new_insns);
new_mems = alloc_EXPR_LIST (VOIDmode, XEXP (copy_mems, 0), new_mems); new_mems = alloc_EXPR_LIST (VOIDmode, XEXP (copy_mems, 0), new_mems);
copy_insns = XEXP (copy_insns, 1); copy_insns = copy_insns->next ();
copy_mems = XEXP (copy_mems, 1); copy_mems = XEXP (copy_mems, 1);
} }
......
...@@ -72,9 +72,9 @@ struct st_expr ...@@ -72,9 +72,9 @@ struct st_expr
/* List of registers mentioned by the mem. */ /* List of registers mentioned by the mem. */
rtx pattern_regs; rtx pattern_regs;
/* INSN list of stores that are locally anticipatable. */ /* INSN list of stores that are locally anticipatable. */
rtx antic_stores; rtx_insn_list *antic_stores;
/* INSN list of stores that are locally available. */ /* INSN list of stores that are locally available. */
rtx avail_stores; rtx_insn_list *avail_stores;
/* Next in the list. */ /* Next in the list. */
struct st_expr * next; struct st_expr * next;
/* Store ID in the dataflow bitmaps. */ /* Store ID in the dataflow bitmaps. */
...@@ -156,8 +156,8 @@ st_expr_entry (rtx x) ...@@ -156,8 +156,8 @@ st_expr_entry (rtx x)
ptr->next = store_motion_mems; ptr->next = store_motion_mems;
ptr->pattern = x; ptr->pattern = x;
ptr->pattern_regs = NULL_RTX; ptr->pattern_regs = NULL_RTX;
ptr->antic_stores = NULL_RTX; ptr->antic_stores = NULL;
ptr->avail_stores = NULL_RTX; ptr->avail_stores = NULL;
ptr->reaching_reg = NULL_RTX; ptr->reaching_reg = NULL_RTX;
ptr->index = 0; ptr->index = 0;
ptr->hash_index = hash; ptr->hash_index = hash;
...@@ -540,7 +540,7 @@ static void ...@@ -540,7 +540,7 @@ static void
find_moveable_store (rtx_insn *insn, int *regs_set_before, int *regs_set_after) find_moveable_store (rtx_insn *insn, int *regs_set_before, int *regs_set_after)
{ {
struct st_expr * ptr; struct st_expr * ptr;
rtx dest, set, tmp; rtx dest, set;
int check_anticipatable, check_available; int check_anticipatable, check_available;
basic_block bb = BLOCK_FOR_INSN (insn); basic_block bb = BLOCK_FOR_INSN (insn);
...@@ -587,15 +587,16 @@ find_moveable_store (rtx_insn *insn, int *regs_set_before, int *regs_set_after) ...@@ -587,15 +587,16 @@ find_moveable_store (rtx_insn *insn, int *regs_set_before, int *regs_set_after)
check_anticipatable = 1; check_anticipatable = 1;
else else
{ {
tmp = XEXP (ptr->antic_stores, 0); rtx_insn *tmp = ptr->antic_stores->insn ();
if (tmp != NULL_RTX if (tmp != NULL_RTX
&& BLOCK_FOR_INSN (tmp) != bb) && BLOCK_FOR_INSN (tmp) != bb)
check_anticipatable = 1; check_anticipatable = 1;
} }
if (check_anticipatable) if (check_anticipatable)
{ {
rtx_insn *tmp;
if (store_killed_before (dest, ptr->pattern_regs, insn, bb, regs_set_before)) if (store_killed_before (dest, ptr->pattern_regs, insn, bb, regs_set_before))
tmp = NULL_RTX; tmp = NULL;
else else
tmp = insn; tmp = insn;
ptr->antic_stores = alloc_INSN_LIST (tmp, ptr->antic_stores); ptr->antic_stores = alloc_INSN_LIST (tmp, ptr->antic_stores);
...@@ -609,7 +610,7 @@ find_moveable_store (rtx_insn *insn, int *regs_set_before, int *regs_set_after) ...@@ -609,7 +610,7 @@ find_moveable_store (rtx_insn *insn, int *regs_set_before, int *regs_set_after)
check_available = 1; check_available = 1;
else else
{ {
tmp = XEXP (ptr->avail_stores, 0); rtx_insn *tmp = ptr->avail_stores->insn ();
if (BLOCK_FOR_INSN (tmp) != bb) if (BLOCK_FOR_INSN (tmp) != bb)
check_available = 1; check_available = 1;
} }
...@@ -619,6 +620,7 @@ find_moveable_store (rtx_insn *insn, int *regs_set_before, int *regs_set_after) ...@@ -619,6 +620,7 @@ find_moveable_store (rtx_insn *insn, int *regs_set_before, int *regs_set_after)
failed last time. */ failed last time. */
if (LAST_AVAIL_CHECK_FAILURE (ptr)) if (LAST_AVAIL_CHECK_FAILURE (ptr))
{ {
rtx_insn *tmp;
for (tmp = BB_END (bb); for (tmp = BB_END (bb);
tmp != insn && tmp != LAST_AVAIL_CHECK_FAILURE (ptr); tmp != insn && tmp != LAST_AVAIL_CHECK_FAILURE (ptr);
tmp = PREV_INSN (tmp)) tmp = PREV_INSN (tmp))
...@@ -646,7 +648,7 @@ compute_store_table (void) ...@@ -646,7 +648,7 @@ compute_store_table (void)
unsigned regno; unsigned regno;
#endif #endif
rtx_insn *insn; rtx_insn *insn;
rtx tmp; rtx_insn *tmp;
df_ref def; df_ref def;
int *last_set_in, *already_set; int *last_set_in, *already_set;
struct st_expr * ptr, **prev_next_ptr_ptr; struct st_expr * ptr, **prev_next_ptr_ptr;
...@@ -701,8 +703,8 @@ compute_store_table (void) ...@@ -701,8 +703,8 @@ compute_store_table (void)
{ {
LAST_AVAIL_CHECK_FAILURE (ptr) = NULL_RTX; LAST_AVAIL_CHECK_FAILURE (ptr) = NULL_RTX;
if (ptr->antic_stores if (ptr->antic_stores
&& (tmp = XEXP (ptr->antic_stores, 0)) == NULL_RTX) && (tmp = ptr->antic_stores->insn ()) == NULL_RTX)
ptr->antic_stores = XEXP (ptr->antic_stores, 1); ptr->antic_stores = ptr->antic_stores->next ();
} }
} }
......
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