Commit b405b274 by Nathan Froyd Committed by Nathan Froyd

combine.c: Include obstack.h.

	* combine.c: Include obstack.h.
	(struct insn_link): Define.
	(uid_log_links): Adjust type.
	(FOR_EACH_LOG_LINK): New macro.
	(insn_link_obstack): Declare.
	(alloc_insn_link): Define.
	(create_log_links): Call it.  Use FOR_EACH_LOG_LINK and adjust
	type of link variables.
	(find_single_use, insn_a_feeds_b, combine_instructions): Likewise.
	(try_combine, record_promoted_values, distribute_notes): Likewise.
	(distribute_links): Likewise.  Tweak prototype.
	(clear_log_links): Delete.
	(adjust_for_new_dest): Call alloc_insn_link.
	* Makefile.in (combine.o): Depend on $(OBSTACK_H).

From-SVN: r171993
parent 6409abe3
2011-04-05 Nathan Froyd <froydnj@codesourcery.com> 2011-04-05 Nathan Froyd <froydnj@codesourcery.com>
* combine.c: Include obstack.h.
(struct insn_link): Define.
(uid_log_links): Adjust type.
(FOR_EACH_LOG_LINK): New macro.
(insn_link_obstack): Declare.
(alloc_insn_link): Define.
(create_log_links): Call it. Use FOR_EACH_LOG_LINK and adjust
type of link variables.
(find_single_use, insn_a_feeds_b, combine_instructions): Likewise.
(try_combine, record_promoted_values, distribute_notes): Likewise.
(distribute_links): Likewise. Tweak prototype.
(clear_log_links): Delete.
(adjust_for_new_dest): Call alloc_insn_link.
* Makefile.in (combine.o): Depend on $(OBSTACK_H).
2011-04-05 Nathan Froyd <froydnj@codesourcery.com>
* 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. (canon_modify_mem_list, compute_transp): Tweak formatting.
(alloc_gcse_mem): Likewise. Adjust for modify_mem_list change. (alloc_gcse_mem): Likewise. Adjust for modify_mem_list change.
......
...@@ -3247,7 +3247,8 @@ combine.o : combine.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \ ...@@ -3247,7 +3247,8 @@ combine.o : combine.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
$(FLAGS_H) $(FUNCTION_H) insn-config.h $(INSN_ATTR_H) $(REGS_H) $(EXPR_H) \ $(FLAGS_H) $(FUNCTION_H) insn-config.h $(INSN_ATTR_H) $(REGS_H) $(EXPR_H) \
rtlhooks-def.h $(BASIC_BLOCK_H) $(RECOG_H) hard-reg-set.h \ rtlhooks-def.h $(BASIC_BLOCK_H) $(RECOG_H) hard-reg-set.h \
$(DIAGNOSTIC_CORE_H) $(TM_P_H) $(TREE_H) $(TARGET_H) output.h $(PARAMS_H) $(OPTABS_H) \ $(DIAGNOSTIC_CORE_H) $(TM_P_H) $(TREE_H) $(TARGET_H) output.h $(PARAMS_H) $(OPTABS_H) \
insn-codes.h $(TIMEVAR_H) $(TREE_PASS_H) $(DF_H) vecprim.h $(CGRAPH_H) insn-codes.h $(TIMEVAR_H) $(TREE_PASS_H) $(DF_H) vecprim.h $(CGRAPH_H) \
$(OBSTACK_H)
reginfo.o : reginfo.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \ reginfo.o : reginfo.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
hard-reg-set.h $(FLAGS_H) $(BASIC_BLOCK_H) addresses.h $(REGS_H) \ hard-reg-set.h $(FLAGS_H) $(BASIC_BLOCK_H) addresses.h $(REGS_H) \
insn-config.h $(RECOG_H) reload.h $(DIAGNOSTIC_CORE_H) \ insn-config.h $(RECOG_H) reload.h $(DIAGNOSTIC_CORE_H) \
......
...@@ -104,6 +104,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -104,6 +104,7 @@ along with GCC; see the file COPYING3. If not see
#include "tree-pass.h" #include "tree-pass.h"
#include "df.h" #include "df.h"
#include "cgraph.h" #include "cgraph.h"
#include "obstack.h"
/* Number of attempts to combine instructions in this function. */ /* Number of attempts to combine instructions in this function. */
...@@ -309,13 +310,38 @@ static int max_uid_known; ...@@ -309,13 +310,38 @@ static int max_uid_known;
static int *uid_insn_cost; static int *uid_insn_cost;
/* The following array records the LOG_LINKS for every insn in the /* The following array records the LOG_LINKS for every insn in the
instruction stream as an INSN_LIST rtx. */ instruction stream as struct insn_link pointers. */
static rtx *uid_log_links; struct insn_link {
rtx insn;
struct insn_link *next;
};
static struct insn_link **uid_log_links;
#define INSN_COST(INSN) (uid_insn_cost[INSN_UID (INSN)]) #define INSN_COST(INSN) (uid_insn_cost[INSN_UID (INSN)])
#define LOG_LINKS(INSN) (uid_log_links[INSN_UID (INSN)]) #define LOG_LINKS(INSN) (uid_log_links[INSN_UID (INSN)])
#define FOR_EACH_LOG_LINK(L, INSN) \
for ((L) = LOG_LINKS (INSN); (L); (L) = (L)->next)
/* Links for LOG_LINKS are allocated from this obstack. */
static struct obstack insn_link_obstack;
/* Allocate a link. */
static inline struct insn_link *
alloc_insn_link (rtx insn, struct insn_link *next)
{
struct insn_link *l
= (struct insn_link *) obstack_alloc (&insn_link_obstack,
sizeof (struct insn_link));
l->insn = insn;
l->next = next;
return l;
}
/* Incremented for each basic block. */ /* Incremented for each basic block. */
static int label_tick; static int label_tick;
...@@ -438,7 +464,7 @@ static int reg_dead_at_p (rtx, rtx); ...@@ -438,7 +464,7 @@ static int reg_dead_at_p (rtx, rtx);
static void move_deaths (rtx, rtx, int, rtx, rtx *); static void move_deaths (rtx, rtx, int, rtx, rtx *);
static int reg_bitfield_target_p (rtx, rtx); static int reg_bitfield_target_p (rtx, rtx);
static void distribute_notes (rtx, rtx, rtx, rtx, rtx, rtx, rtx); static void distribute_notes (rtx, rtx, rtx, rtx, rtx, rtx, rtx);
static void distribute_links (rtx); static void distribute_links (struct insn_link *);
static void mark_used_regs_combine (rtx); static void mark_used_regs_combine (rtx);
static void record_promoted_value (rtx, rtx); static void record_promoted_value (rtx, rtx);
static int unmentioned_reg_p_1 (rtx *, void *); static int unmentioned_reg_p_1 (rtx *, void *);
...@@ -609,7 +635,7 @@ find_single_use (rtx dest, rtx insn, rtx *ploc) ...@@ -609,7 +635,7 @@ find_single_use (rtx dest, rtx insn, rtx *ploc)
basic_block bb; basic_block bb;
rtx next; rtx next;
rtx *result; rtx *result;
rtx link; struct insn_link *link;
#ifdef HAVE_cc0 #ifdef HAVE_cc0
if (dest == cc0_rtx) if (dest == cc0_rtx)
...@@ -635,8 +661,8 @@ find_single_use (rtx dest, rtx insn, rtx *ploc) ...@@ -635,8 +661,8 @@ find_single_use (rtx dest, rtx insn, rtx *ploc)
next = NEXT_INSN (next)) next = NEXT_INSN (next))
if (INSN_P (next) && dead_or_set_p (next, dest)) if (INSN_P (next) && dead_or_set_p (next, dest))
{ {
for (link = LOG_LINKS (next); link; link = XEXP (link, 1)) FOR_EACH_LOG_LINK (link, next)
if (XEXP (link, 0) == insn) if (link->insn == insn)
break; break;
if (link) if (link)
...@@ -985,15 +1011,14 @@ create_log_links (void) ...@@ -985,15 +1011,14 @@ create_log_links (void)
|| asm_noperands (PATTERN (use_insn)) < 0) || asm_noperands (PATTERN (use_insn)) < 0)
{ {
/* Don't add duplicate links between instructions. */ /* Don't add duplicate links between instructions. */
rtx links; struct insn_link *links;
for (links = LOG_LINKS (use_insn); links; FOR_EACH_LOG_LINK (links, use_insn)
links = XEXP (links, 1)) if (insn == links->insn)
if (insn == XEXP (links, 0))
break; break;
if (!links) if (!links)
LOG_LINKS (use_insn) = LOG_LINKS (use_insn)
alloc_INSN_LIST (insn, LOG_LINKS (use_insn)); = alloc_insn_link (insn, LOG_LINKS (use_insn));
} }
} }
next_use[regno] = NULL_RTX; next_use[regno] = NULL_RTX;
...@@ -1017,18 +1042,6 @@ create_log_links (void) ...@@ -1017,18 +1042,6 @@ create_log_links (void)
free (next_use); free (next_use);
} }
/* Clear LOG_LINKS fields of insns. */
static void
clear_log_links (void)
{
rtx insn;
for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
if (INSN_P (insn))
free_INSN_LIST_list (&LOG_LINKS (insn));
}
/* Walk the LOG_LINKS of insn B to see if we find a reference to A. Return /* Walk the LOG_LINKS of insn B to see if we find a reference to A. Return
true if we found a LOG_LINK that proves that A feeds B. This only works true if we found a LOG_LINK that proves that A feeds B. This only works
if there are no instructions between A and B which could have a link if there are no instructions between A and B which could have a link
...@@ -1039,9 +1052,9 @@ clear_log_links (void) ...@@ -1039,9 +1052,9 @@ clear_log_links (void)
static bool static bool
insn_a_feeds_b (rtx a, rtx b) insn_a_feeds_b (rtx a, rtx b)
{ {
rtx links; struct insn_link *links;
for (links = LOG_LINKS (b); links; links = XEXP (links, 1)) FOR_EACH_LOG_LINK (links, b)
if (XEXP (links, 0) == a) if (links->insn == a)
return true; return true;
#ifdef HAVE_cc0 #ifdef HAVE_cc0
if (sets_cc0_p (a)) if (sets_cc0_p (a))
...@@ -1062,7 +1075,7 @@ combine_instructions (rtx f, unsigned int nregs) ...@@ -1062,7 +1075,7 @@ combine_instructions (rtx f, unsigned int nregs)
#ifdef HAVE_cc0 #ifdef HAVE_cc0
rtx prev; rtx prev;
#endif #endif
rtx links, nextlinks; struct insn_link *links, *nextlinks;
rtx first; rtx first;
basic_block last_bb; basic_block last_bb;
...@@ -1086,8 +1099,9 @@ combine_instructions (rtx f, unsigned int nregs) ...@@ -1086,8 +1099,9 @@ combine_instructions (rtx f, unsigned int nregs)
/* Allocate array for insn info. */ /* Allocate array for insn info. */
max_uid_known = get_max_uid (); max_uid_known = get_max_uid ();
uid_log_links = XCNEWVEC (rtx, max_uid_known + 1); uid_log_links = XCNEWVEC (struct insn_link *, max_uid_known + 1);
uid_insn_cost = XCNEWVEC (int, max_uid_known + 1); uid_insn_cost = XCNEWVEC (int, max_uid_known + 1);
gcc_obstack_init (&insn_link_obstack);
nonzero_bits_mode = mode_for_size (HOST_BITS_PER_WIDE_INT, MODE_INT, 0); nonzero_bits_mode = mode_for_size (HOST_BITS_PER_WIDE_INT, MODE_INT, 0);
...@@ -1188,26 +1202,24 @@ combine_instructions (rtx f, unsigned int nregs) ...@@ -1188,26 +1202,24 @@ combine_instructions (rtx f, unsigned int nregs)
/* Try this insn with each insn it links back to. */ /* Try this insn with each insn it links back to. */
for (links = LOG_LINKS (insn); links; links = XEXP (links, 1)) FOR_EACH_LOG_LINK (links, insn)
if ((next = try_combine (insn, XEXP (links, 0), NULL_RTX, if ((next = try_combine (insn, links->insn, NULL_RTX,
NULL_RTX, &new_direct_jump_p)) != 0) NULL_RTX, &new_direct_jump_p)) != 0)
goto retry; goto retry;
/* Try each sequence of three linked insns ending with this one. */ /* Try each sequence of three linked insns ending with this one. */
for (links = LOG_LINKS (insn); links; links = XEXP (links, 1)) FOR_EACH_LOG_LINK (links, insn)
{ {
rtx link = XEXP (links, 0); rtx link = links->insn;
/* If the linked insn has been replaced by a note, then there /* If the linked insn has been replaced by a note, then there
is no point in pursuing this chain any further. */ is no point in pursuing this chain any further. */
if (NOTE_P (link)) if (NOTE_P (link))
continue; continue;
for (nextlinks = LOG_LINKS (link); FOR_EACH_LOG_LINK (nextlinks, link)
nextlinks; if ((next = try_combine (insn, link, nextlinks->insn,
nextlinks = XEXP (nextlinks, 1))
if ((next = try_combine (insn, link, XEXP (nextlinks, 0),
NULL_RTX, NULL_RTX,
&new_direct_jump_p)) != 0) &new_direct_jump_p)) != 0)
goto retry; goto retry;
...@@ -1230,9 +1242,8 @@ combine_instructions (rtx f, unsigned int nregs) ...@@ -1230,9 +1242,8 @@ combine_instructions (rtx f, unsigned int nregs)
&new_direct_jump_p)) != 0) &new_direct_jump_p)) != 0)
goto retry; goto retry;
for (nextlinks = LOG_LINKS (prev); nextlinks; FOR_EACH_LOG_LINK (nextlinks, prev)
nextlinks = XEXP (nextlinks, 1)) if ((next = try_combine (insn, prev, nextlinks->insn,
if ((next = try_combine (insn, prev, XEXP (nextlinks, 0),
NULL_RTX, NULL_RTX,
&new_direct_jump_p)) != 0) &new_direct_jump_p)) != 0)
goto retry; goto retry;
...@@ -1250,9 +1261,8 @@ combine_instructions (rtx f, unsigned int nregs) ...@@ -1250,9 +1261,8 @@ combine_instructions (rtx f, unsigned int nregs)
&new_direct_jump_p)) != 0) &new_direct_jump_p)) != 0)
goto retry; goto retry;
for (nextlinks = LOG_LINKS (prev); nextlinks; FOR_EACH_LOG_LINK (nextlinks, prev)
nextlinks = XEXP (nextlinks, 1)) if ((next = try_combine (insn, prev, nextlinks->insn,
if ((next = try_combine (insn, prev, XEXP (nextlinks, 0),
NULL_RTX, NULL_RTX,
&new_direct_jump_p)) != 0) &new_direct_jump_p)) != 0)
goto retry; goto retry;
...@@ -1261,14 +1271,14 @@ combine_instructions (rtx f, unsigned int nregs) ...@@ -1261,14 +1271,14 @@ combine_instructions (rtx f, unsigned int nregs)
/* Finally, see if any of the insns that this insn links to /* Finally, see if any of the insns that this insn links to
explicitly references CC0. If so, try this insn, that insn, explicitly references CC0. If so, try this insn, that insn,
and its predecessor if it sets CC0. */ and its predecessor if it sets CC0. */
for (links = LOG_LINKS (insn); links; links = XEXP (links, 1)) FOR_EACH_LOG_LINK (links, insn)
if (NONJUMP_INSN_P (XEXP (links, 0)) if (NONJUMP_INSN_P (links->insn)
&& GET_CODE (PATTERN (XEXP (links, 0))) == SET && GET_CODE (PATTERN (links->insn)) == SET
&& reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (XEXP (links, 0)))) && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (links->insn)))
&& (prev = prev_nonnote_insn (XEXP (links, 0))) != 0 && (prev = prev_nonnote_insn (links->insn)) != 0
&& NONJUMP_INSN_P (prev) && NONJUMP_INSN_P (prev)
&& sets_cc0_p (PATTERN (prev)) && sets_cc0_p (PATTERN (prev))
&& (next = try_combine (insn, XEXP (links, 0), && (next = try_combine (insn, links->insn,
prev, NULL_RTX, prev, NULL_RTX,
&new_direct_jump_p)) != 0) &new_direct_jump_p)) != 0)
goto retry; goto retry;
...@@ -1276,73 +1286,70 @@ combine_instructions (rtx f, unsigned int nregs) ...@@ -1276,73 +1286,70 @@ combine_instructions (rtx f, unsigned int nregs)
/* Try combining an insn with two different insns whose results it /* Try combining an insn with two different insns whose results it
uses. */ uses. */
for (links = LOG_LINKS (insn); links; links = XEXP (links, 1)) FOR_EACH_LOG_LINK (links, insn)
for (nextlinks = XEXP (links, 1); nextlinks; for (nextlinks = links->next; nextlinks;
nextlinks = XEXP (nextlinks, 1)) nextlinks = nextlinks->next)
if ((next = try_combine (insn, XEXP (links, 0), if ((next = try_combine (insn, links->insn,
XEXP (nextlinks, 0), NULL_RTX, nextlinks->insn, NULL_RTX,
&new_direct_jump_p)) != 0) &new_direct_jump_p)) != 0)
goto retry; goto retry;
/* Try four-instruction combinations. */ /* Try four-instruction combinations. */
for (links = LOG_LINKS (insn); links; links = XEXP (links, 1)) FOR_EACH_LOG_LINK (links, insn)
{ {
rtx next1; struct insn_link *next1;
rtx link = XEXP (links, 0); rtx link = links->insn;
/* If the linked insn has been replaced by a note, then there /* If the linked insn has been replaced by a note, then there
is no point in pursuing this chain any further. */ is no point in pursuing this chain any further. */
if (NOTE_P (link)) if (NOTE_P (link))
continue; continue;
for (next1 = LOG_LINKS (link); next1; next1 = XEXP (next1, 1)) FOR_EACH_LOG_LINK (next1, link)
{ {
rtx link1 = XEXP (next1, 0); rtx link1 = next1->insn;
if (NOTE_P (link1)) if (NOTE_P (link1))
continue; continue;
/* I0 -> I1 -> I2 -> I3. */ /* I0 -> I1 -> I2 -> I3. */
for (nextlinks = LOG_LINKS (link1); nextlinks; FOR_EACH_LOG_LINK (nextlinks, link1)
nextlinks = XEXP (nextlinks, 1))
if ((next = try_combine (insn, link, link1, if ((next = try_combine (insn, link, link1,
XEXP (nextlinks, 0), nextlinks->insn,
&new_direct_jump_p)) != 0) &new_direct_jump_p)) != 0)
goto retry; goto retry;
/* I0, I1 -> I2, I2 -> I3. */ /* I0, I1 -> I2, I2 -> I3. */
for (nextlinks = XEXP (next1, 1); nextlinks; for (nextlinks = next1->next; nextlinks;
nextlinks = XEXP (nextlinks, 1)) nextlinks = nextlinks->next)
if ((next = try_combine (insn, link, link1, if ((next = try_combine (insn, link, link1,
XEXP (nextlinks, 0), nextlinks->insn,
&new_direct_jump_p)) != 0) &new_direct_jump_p)) != 0)
goto retry; goto retry;
} }
for (next1 = XEXP (links, 1); next1; next1 = XEXP (next1, 1)) for (next1 = links->next; next1; next1 = next1->next)
{ {
rtx link1 = XEXP (next1, 0); rtx link1 = next1->insn;
if (NOTE_P (link1)) if (NOTE_P (link1))
continue; continue;
/* I0 -> I2; I1, I2 -> I3. */ /* I0 -> I2; I1, I2 -> I3. */
for (nextlinks = LOG_LINKS (link); nextlinks; FOR_EACH_LOG_LINK (nextlinks, link)
nextlinks = XEXP (nextlinks, 1))
if ((next = try_combine (insn, link, link1, if ((next = try_combine (insn, link, link1,
XEXP (nextlinks, 0), nextlinks->insn,
&new_direct_jump_p)) != 0) &new_direct_jump_p)) != 0)
goto retry; goto retry;
/* I0 -> I1; I1, I2 -> I3. */ /* I0 -> I1; I1, I2 -> I3. */
for (nextlinks = LOG_LINKS (link1); nextlinks; FOR_EACH_LOG_LINK (nextlinks, link1)
nextlinks = XEXP (nextlinks, 1))
if ((next = try_combine (insn, link, link1, if ((next = try_combine (insn, link, link1,
XEXP (nextlinks, 0), nextlinks->insn,
&new_direct_jump_p)) != 0) &new_direct_jump_p)) != 0)
goto retry; goto retry;
} }
} }
/* Try this insn with each REG_EQUAL note it links back to. */ /* Try this insn with each REG_EQUAL note it links back to. */
for (links = LOG_LINKS (insn); links; links = XEXP (links, 1)) FOR_EACH_LOG_LINK (links, insn)
{ {
rtx set, note; rtx set, note;
rtx temp = XEXP (links, 0); rtx temp = links->insn;
if ((set = single_set (temp)) != 0 if ((set = single_set (temp)) != 0
&& (note = find_reg_equal_equiv_note (temp)) != 0 && (note = find_reg_equal_equiv_note (temp)) != 0
&& (note = XEXP (note, 0), GET_CODE (note)) != EXPR_LIST && (note = XEXP (note, 0), GET_CODE (note)) != EXPR_LIST
...@@ -1380,12 +1387,12 @@ combine_instructions (rtx f, unsigned int nregs) ...@@ -1380,12 +1387,12 @@ combine_instructions (rtx f, unsigned int nregs)
} }
default_rtl_profile (); default_rtl_profile ();
clear_log_links ();
clear_bb_flags (); clear_bb_flags ();
new_direct_jump_p |= purge_all_dead_edges (); new_direct_jump_p |= purge_all_dead_edges ();
delete_noop_moves (); delete_noop_moves ();
/* Clean up. */ /* Clean up. */
obstack_free (&insn_link_obstack, NULL);
free (uid_log_links); free (uid_log_links);
free (uid_insn_cost); free (uid_insn_cost);
VEC_free (reg_stat_type, heap, reg_stat); VEC_free (reg_stat_type, heap, reg_stat);
...@@ -1556,13 +1563,11 @@ set_nonzero_bits_and_sign_copies (rtx x, const_rtx set, void *data) ...@@ -1556,13 +1563,11 @@ set_nonzero_bits_and_sign_copies (rtx x, const_rtx set, void *data)
&& !REGNO_REG_SET_P (DF_LR_IN (BLOCK_FOR_INSN (insn)), && !REGNO_REG_SET_P (DF_LR_IN (BLOCK_FOR_INSN (insn)),
REGNO (x))) REGNO (x)))
{ {
rtx link; struct insn_link *link;
for (link = LOG_LINKS (insn); link; link = XEXP (link, 1)) FOR_EACH_LOG_LINK (link, insn)
{ if (dead_or_set_p (link->insn, x))
if (dead_or_set_p (XEXP (link, 0), x)) break;
break;
}
if (!link) if (!link)
{ {
rsp->nonzero_bits = GET_MODE_MASK (GET_MODE (x)); rsp->nonzero_bits = GET_MODE_MASK (GET_MODE (x));
...@@ -2248,7 +2253,7 @@ adjust_for_new_dest (rtx insn) ...@@ -2248,7 +2253,7 @@ adjust_for_new_dest (rtx insn)
/* The new insn will have a destination that was previously the destination /* The new insn will have a destination that was previously the destination
of an insn just above it. Call distribute_links to make a LOG_LINK from of an insn just above it. Call distribute_links to make a LOG_LINK from
the next use of that destination. */ the next use of that destination. */
distribute_links (gen_rtx_INSN_LIST (VOIDmode, insn, NULL_RTX)); distribute_links (alloc_insn_link (insn, NULL));
df_insn_rescan (insn); df_insn_rescan (insn);
} }
...@@ -2547,7 +2552,7 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p) ...@@ -2547,7 +2552,7 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p)
int maxreg; int maxreg;
rtx temp; rtx temp;
rtx link; struct insn_link *link;
rtx other_pat = 0; rtx other_pat = 0;
rtx new_other_notes; rtx new_other_notes;
int i; int i;
...@@ -3929,7 +3934,7 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p) ...@@ -3929,7 +3934,7 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p)
if (swap_i2i3) if (swap_i2i3)
{ {
rtx insn; rtx insn;
rtx link; struct insn_link *link;
rtx ni2dest; rtx ni2dest;
/* I3 now uses what used to be its destination and which is now /* I3 now uses what used to be its destination and which is now
...@@ -3959,10 +3964,9 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p) ...@@ -3959,10 +3964,9 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p)
{ {
if (INSN_P (insn) && reg_referenced_p (ni2dest, PATTERN (insn))) if (INSN_P (insn) && reg_referenced_p (ni2dest, PATTERN (insn)))
{ {
for (link = LOG_LINKS (insn); link; FOR_EACH_LOG_LINK (link, insn)
link = XEXP (link, 1)) if (link->insn == i3)
if (XEXP (link, 0) == i3) link->insn = i1;
XEXP (link, 0) = i1;
break; break;
} }
...@@ -3971,7 +3975,7 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p) ...@@ -3971,7 +3975,7 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p)
{ {
rtx i3notes, i2notes, i1notes = 0, i0notes = 0; rtx i3notes, i2notes, i1notes = 0, i0notes = 0;
rtx i3links, i2links, i1links = 0, i0links = 0; struct insn_link *i3links, *i2links, *i1links = 0, *i0links = 0;
rtx midnotes = 0; rtx midnotes = 0;
int from_luid; int from_luid;
/* Compute which registers we expect to eliminate. newi2pat may be setting /* Compute which registers we expect to eliminate. newi2pat may be setting
...@@ -4074,9 +4078,9 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p) ...@@ -4074,9 +4078,9 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p)
|| BB_HEAD (this_basic_block) != temp); || BB_HEAD (this_basic_block) != temp);
temp = NEXT_INSN (temp)) temp = NEXT_INSN (temp))
if (temp != i3 && INSN_P (temp)) if (temp != i3 && INSN_P (temp))
for (link = LOG_LINKS (temp); link; link = XEXP (link, 1)) FOR_EACH_LOG_LINK (link, temp)
if (XEXP (link, 0) == i2) if (link->insn == i2)
XEXP (link, 0) = i3; link->insn = i3;
if (i3notes) if (i3notes)
{ {
...@@ -4090,9 +4094,9 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p) ...@@ -4090,9 +4094,9 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p)
i2notes = 0; i2notes = 0;
} }
LOG_LINKS (i3) = 0; LOG_LINKS (i3) = NULL;
REG_NOTES (i3) = 0; REG_NOTES (i3) = 0;
LOG_LINKS (i2) = 0; LOG_LINKS (i2) = NULL;
REG_NOTES (i2) = 0; REG_NOTES (i2) = 0;
if (newi2pat) if (newi2pat)
...@@ -4111,7 +4115,7 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p) ...@@ -4111,7 +4115,7 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p)
if (i1) if (i1)
{ {
LOG_LINKS (i1) = 0; LOG_LINKS (i1) = NULL;
REG_NOTES (i1) = 0; REG_NOTES (i1) = 0;
if (MAY_HAVE_DEBUG_INSNS) if (MAY_HAVE_DEBUG_INSNS)
propagate_for_debug (i1, i3, i1dest, i1src); propagate_for_debug (i1, i3, i1dest, i1src);
...@@ -4120,7 +4124,7 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p) ...@@ -4120,7 +4124,7 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p)
if (i0) if (i0)
{ {
LOG_LINKS (i0) = 0; LOG_LINKS (i0) = NULL;
REG_NOTES (i0) = 0; REG_NOTES (i0) = 0;
if (MAY_HAVE_DEBUG_INSNS) if (MAY_HAVE_DEBUG_INSNS)
propagate_for_debug (i0, i3, i0dest, i0src); propagate_for_debug (i0, i3, i0dest, i0src);
...@@ -4231,7 +4235,8 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p) ...@@ -4231,7 +4235,8 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p)
if (REG_P (i2dest)) if (REG_P (i2dest))
{ {
rtx link, i2_insn = 0, i2_val = 0, set; struct insn_link *link;
rtx i2_insn = 0, i2_val = 0, set;
/* The insn that used to set this register doesn't exist, and /* The insn that used to set this register doesn't exist, and
this life of the register may not exist either. See if one of this life of the register may not exist either. See if one of
...@@ -4240,10 +4245,10 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p) ...@@ -4240,10 +4245,10 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p)
this and I2 set the register to a value that depended on its old this and I2 set the register to a value that depended on its old
contents, we will get confused. If this insn is used, thing contents, we will get confused. If this insn is used, thing
will be set correctly in combine_instructions. */ will be set correctly in combine_instructions. */
for (link = LOG_LINKS (i3); link; link = XEXP (link, 1)) FOR_EACH_LOG_LINK (link, i3)
if ((set = single_set (XEXP (link, 0))) != 0 if ((set = single_set (link->insn)) != 0
&& rtx_equal_p (i2dest, SET_DEST (set))) && rtx_equal_p (i2dest, SET_DEST (set)))
i2_insn = XEXP (link, 0), i2_val = SET_SRC (set); i2_insn = link->insn, i2_val = SET_SRC (set);
record_value_for_reg (i2dest, i2_insn, i2_val); record_value_for_reg (i2dest, i2_insn, i2_val);
...@@ -4257,12 +4262,13 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p) ...@@ -4257,12 +4262,13 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p)
if (i1 && REG_P (i1dest)) if (i1 && REG_P (i1dest))
{ {
rtx link, i1_insn = 0, i1_val = 0, set; struct insn_link *link;
rtx i1_insn = 0, i1_val = 0, set;
for (link = LOG_LINKS (i3); link; link = XEXP (link, 1)) FOR_EACH_LOG_LINK (link, i3)
if ((set = single_set (XEXP (link, 0))) != 0 if ((set = single_set (link->insn)) != 0
&& rtx_equal_p (i1dest, SET_DEST (set))) && rtx_equal_p (i1dest, SET_DEST (set)))
i1_insn = XEXP (link, 0), i1_val = SET_SRC (set); i1_insn = link->insn, i1_val = SET_SRC (set);
record_value_for_reg (i1dest, i1_insn, i1_val); record_value_for_reg (i1dest, i1_insn, i1_val);
...@@ -4272,12 +4278,13 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p) ...@@ -4272,12 +4278,13 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p)
if (i0 && REG_P (i0dest)) if (i0 && REG_P (i0dest))
{ {
rtx link, i0_insn = 0, i0_val = 0, set; struct insn_link *link;
rtx i0_insn = 0, i0_val = 0, set;
for (link = LOG_LINKS (i3); link; link = XEXP (link, 1)) FOR_EACH_LOG_LINK (link, i3)
if ((set = single_set (XEXP (link, 0))) != 0 if ((set = single_set (link->insn)) != 0
&& rtx_equal_p (i0dest, SET_DEST (set))) && rtx_equal_p (i0dest, SET_DEST (set)))
i0_insn = XEXP (link, 0), i0_val = SET_SRC (set); i0_insn = link->insn, i0_val = SET_SRC (set);
record_value_for_reg (i0dest, i0_insn, i0_val); record_value_for_reg (i0dest, i0_insn, i0_val);
...@@ -12349,7 +12356,8 @@ record_dead_and_set_regs (rtx insn) ...@@ -12349,7 +12356,8 @@ record_dead_and_set_regs (rtx insn)
static void static void
record_promoted_value (rtx insn, rtx subreg) record_promoted_value (rtx insn, rtx subreg)
{ {
rtx links, set; struct insn_link *links;
rtx set;
unsigned int regno = REGNO (SUBREG_REG (subreg)); unsigned int regno = REGNO (SUBREG_REG (subreg));
enum machine_mode mode = GET_MODE (subreg); enum machine_mode mode = GET_MODE (subreg);
...@@ -12360,14 +12368,14 @@ record_promoted_value (rtx insn, rtx subreg) ...@@ -12360,14 +12368,14 @@ record_promoted_value (rtx insn, rtx subreg)
{ {
reg_stat_type *rsp; reg_stat_type *rsp;
insn = XEXP (links, 0); insn = links->insn;
set = single_set (insn); set = single_set (insn);
if (! set || !REG_P (SET_DEST (set)) if (! set || !REG_P (SET_DEST (set))
|| REGNO (SET_DEST (set)) != regno || REGNO (SET_DEST (set)) != regno
|| GET_MODE (SET_DEST (set)) != GET_MODE (SUBREG_REG (subreg))) || GET_MODE (SET_DEST (set)) != GET_MODE (SUBREG_REG (subreg)))
{ {
links = XEXP (links, 1); links = links->next;
continue; continue;
} }
...@@ -13500,8 +13508,8 @@ distribute_notes (rtx notes, rtx from_insn, rtx i3, rtx i2, rtx elim_i2, ...@@ -13500,8 +13508,8 @@ distribute_notes (rtx notes, rtx from_insn, rtx i3, rtx i2, rtx elim_i2,
&& DF_INSN_LUID (from_insn) > DF_INSN_LUID (i2) && DF_INSN_LUID (from_insn) > DF_INSN_LUID (i2)
&& reg_referenced_p (XEXP (note, 0), PATTERN (i2))) && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
{ {
rtx links = LOG_LINKS (place); struct insn_link *links = LOG_LINKS (place);
LOG_LINKS (place) = 0; LOG_LINKS (place) = NULL;
distribute_links (links); distribute_links (links);
} }
break; break;
...@@ -13632,9 +13640,9 @@ distribute_notes (rtx notes, rtx from_insn, rtx i3, rtx i2, rtx elim_i2, ...@@ -13632,9 +13640,9 @@ distribute_notes (rtx notes, rtx from_insn, rtx i3, rtx i2, rtx elim_i2,
pointing at I3 when I3's destination is changed. */ pointing at I3 when I3's destination is changed. */
static void static void
distribute_links (rtx links) distribute_links (struct insn_link *links)
{ {
rtx link, next_link; struct insn_link *link, *next_link;
for (link = links; link; link = next_link) for (link = links; link; link = next_link)
{ {
...@@ -13642,7 +13650,7 @@ distribute_links (rtx links) ...@@ -13642,7 +13650,7 @@ distribute_links (rtx links)
rtx insn; rtx insn;
rtx set, reg; rtx set, reg;
next_link = XEXP (link, 1); next_link = link->next;
/* If the insn that this link points to is a NOTE or isn't a single /* If the insn that this link points to is a NOTE or isn't a single
set, ignore it. In the latter case, it isn't clear what we set, ignore it. In the latter case, it isn't clear what we
...@@ -13655,8 +13663,8 @@ distribute_links (rtx links) ...@@ -13655,8 +13663,8 @@ distribute_links (rtx links)
replace I3, I2, and I1 by I3 and I2. But in that case the replace I3, I2, and I1 by I3 and I2. But in that case the
destination of I2 also remains unchanged. */ destination of I2 also remains unchanged. */
if (NOTE_P (XEXP (link, 0)) if (NOTE_P (link->insn)
|| (set = single_set (XEXP (link, 0))) == 0) || (set = single_set (link->insn)) == 0)
continue; continue;
reg = SET_DEST (set); reg = SET_DEST (set);
...@@ -13673,7 +13681,7 @@ distribute_links (rtx links) ...@@ -13673,7 +13681,7 @@ distribute_links (rtx links)
I3 to I2. Also note that not much searching is typically done here I3 to I2. Also note that not much searching is typically done here
since most links don't point very far away. */ since most links don't point very far away. */
for (insn = NEXT_INSN (XEXP (link, 0)); for (insn = NEXT_INSN (link->insn);
(insn && (this_basic_block->next_bb == EXIT_BLOCK_PTR (insn && (this_basic_block->next_bb == EXIT_BLOCK_PTR
|| BB_HEAD (this_basic_block->next_bb) != insn)); || BB_HEAD (this_basic_block->next_bb) != insn));
insn = NEXT_INSN (insn)) insn = NEXT_INSN (insn))
...@@ -13699,15 +13707,15 @@ distribute_links (rtx links) ...@@ -13699,15 +13707,15 @@ distribute_links (rtx links)
if (place) if (place)
{ {
rtx link2; struct insn_link *link2;
for (link2 = LOG_LINKS (place); link2; link2 = XEXP (link2, 1)) FOR_EACH_LOG_LINK (link2, place)
if (XEXP (link2, 0) == XEXP (link, 0)) if (link2->insn == link->insn)
break; break;
if (link2 == 0) if (link2 == NULL)
{ {
XEXP (link, 1) = LOG_LINKS (place); link->next = LOG_LINKS (place);
LOG_LINKS (place) = link; LOG_LINKS (place) = link;
/* Set added_links_insn to the earliest insn we added a /* Set added_links_insn to the earliest insn we added a
......
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