Commit 5a4f6418 by Andrew MacLeod Committed by Andrew Macleod

lists.c (unused_insn_list, [...]): New file for maintaining various types of lists.


Wed Aug 25 13:41:47 EDT 1999  Andrew MacLeod  <amacleod@cygnus.com>

	* lists.c (unused_insn_list, unused_expr_list): New file for
	maintaining various types of lists. New statics for maintaining a
	cache of available INSN_LIST and EXPR_LIST nodes.
	(free_list): Static function for freeing a list of INSN/EXPR nodes.
	(alloc_INSN_LIST): Function to get a free INSN_LIST node.
	(alloc_EXPR_LIST): Function to get a free EXPR_LIST node.
	(init_EXPR_INSN_LIST_cache): Initialize the cache lists.
	(free_EXPR_LIST_list): Free an entire list of EXPR_LIST nodes.
	(free_INSN_LIST_list): Free an entire list of INSN_LIST nodes.
	(free_EXPR_LIST_node): Free an individual EXPR_LIST node.
	(free_INSN_LIST_node): Free an individual INSN_LIST node.
	* haifa-sched.c (unused_insn_list, unused_expr_list): Moved to flow.c
	(free_list, alloc_INSN_LIST, alloc_EXPR_LIST): Moved to flow.c
	(remove_dependence, free_pending_lists): Use new global routines.
	(flush_pending_lists, sched_analyze_insn): Use new global routines.
	(sched_analyze, compute_block_backward_dependences): Use new routines.
	(sched_analyze_1, sched_analyze_2): Use new routines.
	(schedule_insns): Use new global routines.
	* rtl.h (init_EXPR_INSN_LIST_cache, free_EXPR_LIST_list): Add function
	prototypes.
	(free_INSN_LIST_list, free_EXPR_LIST_node): Add prototypes.
	(free_INSN_LIST_node, alloc_INSN_LIST, alloc_EXPR_LIST): Add function
	prototypes.
	* toplev.c (rest_of_compilation): Initialize node cache.
	* Makefile.in (OBJS): Add lists.o to list of object files.
	(lists.o): Add dependancies.

From-SVN: r28864
parent b54480a7
Wed Aug 25 13:41:47 EDT 1999 Andrew MacLeod <amacleod@cygnus.com>
* lists.c (unused_insn_list, unused_expr_list): New file for
maintaining various types of lists. New statics for maintaining a
cache of available INSN_LIST and EXPR_LIST nodes.
(free_list): Static function for freeing a list of INSN/EXPR nodes.
(alloc_INSN_LIST): Function to get a free INSN_LIST node.
(alloc_EXPR_LIST): Function to get a free EXPR_LIST node.
(init_EXPR_INSN_LIST_cache): Initialize the cache lists.
(free_EXPR_LIST_list): Free an entire list of EXPR_LIST nodes.
(free_INSN_LIST_list): Free an entire list of INSN_LIST nodes.
(free_EXPR_LIST_node): Free an individual EXPR_LIST node.
(free_INSN_LIST_node): Free an individual INSN_LIST node.
* haifa-sched.c (unused_insn_list, unused_expr_list): Moved to flow.c
(free_list, alloc_INSN_LIST, alloc_EXPR_LIST): Moved to flow.c
(remove_dependence, free_pending_lists): Use new global routines.
(flush_pending_lists, sched_analyze_insn): Use new global routines.
(sched_analyze, compute_block_backward_dependences): Use new routines.
(sched_analyze_1, sched_analyze_2): Use new routines.
(schedule_insns): Use new global routines.
* rtl.h (init_EXPR_INSN_LIST_cache, free_EXPR_LIST_list): Add function
prototypes.
(free_INSN_LIST_list, free_EXPR_LIST_node): Add prototypes.
(free_INSN_LIST_node, alloc_INSN_LIST, alloc_EXPR_LIST): Add function
prototypes.
* toplev.c (rest_of_compilation): Initialize node cache.
* Makefile.in (OBJS): Add lists.o to list of object files.
(lists.o): Add dependancies.
Wed Aug 25 17:31:56 1999 Nick Clifton <nickc@cygnus.com> Wed Aug 25 17:31:56 1999 Nick Clifton <nickc@cygnus.com>
* config/v850/v850.md: Fix compile time warning messages. * config/v850/v850.md: Fix compile time warning messages.
......
...@@ -667,7 +667,7 @@ OBJS = toplev.o version.o tree.o print-tree.o stor-layout.o fold-const.o \ ...@@ -667,7 +667,7 @@ OBJS = toplev.o version.o tree.o print-tree.o stor-layout.o fold-const.o \
insn-peep.o reorg.o haifa-sched.o final.o recog.o reg-stack.o \ insn-peep.o reorg.o haifa-sched.o final.o recog.o reg-stack.o \
insn-opinit.o insn-recog.o insn-extract.o insn-output.o insn-emit.o lcm.o \ insn-opinit.o insn-recog.o insn-extract.o insn-output.o insn-emit.o lcm.o \
profile.o insn-attrtab.o $(out_object_file) getpwd.o $(EXTRA_OBJS) convert.o \ profile.o insn-attrtab.o $(out_object_file) getpwd.o $(EXTRA_OBJS) convert.o \
mbchar.o dyn-string.o splay-tree.o graph.o sbitmap.o resource.o hash.o mbchar.o dyn-string.o splay-tree.o graph.o sbitmap.o resource.o hash.o lists.o
# GEN files are listed separately, so they can be built before doing parallel # GEN files are listed separately, so they can be built before doing parallel
# makes for cc1 or cc1plus. Otherwise sequent parallel make attempts to load # makes for cc1 or cc1plus. Otherwise sequent parallel make attempts to load
...@@ -1581,6 +1581,7 @@ reg-stack.o : reg-stack.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) recog.h \ ...@@ -1581,6 +1581,7 @@ reg-stack.o : reg-stack.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) recog.h \
$(REGS_H) hard-reg-set.h flags.h insn-config.h insn-flags.h toplev.h \ $(REGS_H) hard-reg-set.h flags.h insn-config.h insn-flags.h toplev.h \
function.h function.h
dyn-string.o: dyn-string.c dyn-string.h $(CONFIG_H) system.h dyn-string.o: dyn-string.c dyn-string.h $(CONFIG_H) system.h
lists.o: lists.c $(CONFIG_H) system.h toplev.h $(RTL_H)
$(out_object_file): $(out_file) $(CONFIG_H) $(TREE_H) \ $(out_object_file): $(out_file) $(CONFIG_H) $(TREE_H) \
$(RTL_H) $(REGS_H) hard-reg-set.h real.h insn-config.h conditions.h \ $(RTL_H) $(REGS_H) hard-reg-set.h real.h insn-config.h conditions.h \
......
...@@ -766,82 +766,6 @@ static void schedule_region PROTO ((int)); ...@@ -766,82 +766,6 @@ static void schedule_region PROTO ((int));
#define SIZE_FOR_MODE(X) (GET_MODE_SIZE (GET_MODE (X))) #define SIZE_FOR_MODE(X) (GET_MODE_SIZE (GET_MODE (X)))
/* Helper functions for instruction scheduling. */
/* An INSN_LIST containing all INSN_LISTs allocated but currently unused. */
static rtx unused_insn_list;
/* An EXPR_LIST containing all EXPR_LISTs allocated but currently unused. */
static rtx unused_expr_list;
static void free_list PROTO ((rtx *, rtx *));
static rtx alloc_INSN_LIST PROTO ((rtx, rtx));
static rtx alloc_EXPR_LIST PROTO ((int, rtx, rtx));
static void
free_list (listp, unused_listp)
rtx *listp, *unused_listp;
{
register rtx link, prev_link;
if (*listp == 0)
return;
prev_link = *listp;
link = XEXP (prev_link, 1);
while (link)
{
prev_link = link;
link = XEXP (link, 1);
}
XEXP (prev_link, 1) = *unused_listp;
*unused_listp = *listp;
*listp = 0;
}
static rtx
alloc_INSN_LIST (val, next)
rtx val, next;
{
rtx r;
if (unused_insn_list)
{
r = unused_insn_list;
unused_insn_list = XEXP (r, 1);
XEXP (r, 0) = val;
XEXP (r, 1) = next;
PUT_REG_NOTE_KIND (r, VOIDmode);
}
else
r = gen_rtx_INSN_LIST (VOIDmode, val, next);
return r;
}
static rtx
alloc_EXPR_LIST (kind, val, next)
int kind;
rtx val, next;
{
rtx r;
if (unused_expr_list)
{
r = unused_expr_list;
unused_expr_list = XEXP (r, 1);
XEXP (r, 0) = val;
XEXP (r, 1) = next;
PUT_REG_NOTE_KIND (r, kind);
}
else
r = gen_rtx_EXPR_LIST (kind, val, next);
return r;
}
/* Add ELEM wrapped in an INSN_LIST with reg note kind DEP_TYPE to the /* Add ELEM wrapped in an INSN_LIST with reg note kind DEP_TYPE to the
LOG_LINKS of INSN, if not already there. DEP_TYPE indicates the type LOG_LINKS of INSN, if not already there. DEP_TYPE indicates the type
of dependence that this link represents. */ of dependence that this link represents. */
...@@ -949,9 +873,7 @@ remove_dependence (insn, elem) ...@@ -949,9 +873,7 @@ remove_dependence (insn, elem)
XEXP (prev, 1) = next; XEXP (prev, 1) = next;
else else
LOG_LINKS (insn) = next; LOG_LINKS (insn) = next;
free_INSN_LIST_node (link);
XEXP (link, 1) = unused_insn_list;
unused_insn_list = link;
found = 1; found = 1;
} }
...@@ -3226,10 +3148,10 @@ free_pending_lists () ...@@ -3226,10 +3148,10 @@ free_pending_lists ()
{ {
if (current_nr_blocks <= 1) if (current_nr_blocks <= 1)
{ {
free_list (&pending_read_insns, &unused_insn_list); free_INSN_LIST_list (&pending_read_insns);
free_list (&pending_write_insns, &unused_insn_list); free_INSN_LIST_list (&pending_write_insns);
free_list (&pending_read_mems, &unused_expr_list); free_EXPR_LIST_list (&pending_read_mems);
free_list (&pending_write_mems, &unused_expr_list); free_EXPR_LIST_list (&pending_write_mems);
} }
else else
{ {
...@@ -3238,10 +3160,10 @@ free_pending_lists () ...@@ -3238,10 +3160,10 @@ free_pending_lists ()
for (bb = 0; bb < current_nr_blocks; bb++) for (bb = 0; bb < current_nr_blocks; bb++)
{ {
free_list (&bb_pending_read_insns[bb], &unused_insn_list); free_INSN_LIST_list (&bb_pending_read_insns[bb]);
free_list (&bb_pending_write_insns[bb], &unused_insn_list); free_INSN_LIST_list (&bb_pending_write_insns[bb]);
free_list (&bb_pending_read_mems[bb], &unused_expr_list); free_EXPR_LIST_list (&bb_pending_read_mems[bb]);
free_list (&bb_pending_write_mems[bb], &unused_expr_list); free_EXPR_LIST_list (&bb_pending_write_mems[bb]);
} }
} }
} }
...@@ -3284,13 +3206,11 @@ flush_pending_lists (insn, only_write) ...@@ -3284,13 +3206,11 @@ flush_pending_lists (insn, only_write)
link = pending_read_insns; link = pending_read_insns;
pending_read_insns = XEXP (pending_read_insns, 1); pending_read_insns = XEXP (pending_read_insns, 1);
XEXP (link, 1) = unused_insn_list; free_INSN_LIST_node (link);
unused_insn_list = link;
link = pending_read_mems; link = pending_read_mems;
pending_read_mems = XEXP (pending_read_mems, 1); pending_read_mems = XEXP (pending_read_mems, 1);
XEXP (link, 1) = unused_expr_list; free_EXPR_LIST_node (link);
unused_expr_list = link;
} }
while (pending_write_insns) while (pending_write_insns)
{ {
...@@ -3298,13 +3218,11 @@ flush_pending_lists (insn, only_write) ...@@ -3298,13 +3218,11 @@ flush_pending_lists (insn, only_write)
link = pending_write_insns; link = pending_write_insns;
pending_write_insns = XEXP (pending_write_insns, 1); pending_write_insns = XEXP (pending_write_insns, 1);
XEXP (link, 1) = unused_insn_list; free_INSN_LIST_node (link);
unused_insn_list = link;
link = pending_write_mems; link = pending_write_mems;
pending_write_mems = XEXP (pending_write_mems, 1); pending_write_mems = XEXP (pending_write_mems, 1);
XEXP (link, 1) = unused_expr_list; free_EXPR_LIST_node (link);
unused_expr_list = link;
} }
pending_lists_length = 0; pending_lists_length = 0;
...@@ -3312,7 +3230,7 @@ flush_pending_lists (insn, only_write) ...@@ -3312,7 +3230,7 @@ flush_pending_lists (insn, only_write)
for (u = last_pending_memory_flush; u; u = XEXP (u, 1)) for (u = last_pending_memory_flush; u; u = XEXP (u, 1))
add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI); add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
free_list (&last_pending_memory_flush, &unused_insn_list); free_INSN_LIST_list (&last_pending_memory_flush);
last_pending_memory_flush = alloc_INSN_LIST (insn, NULL_RTX); last_pending_memory_flush = alloc_INSN_LIST (insn, NULL_RTX);
} }
...@@ -3379,7 +3297,7 @@ sched_analyze_1 (x, insn) ...@@ -3379,7 +3297,7 @@ sched_analyze_1 (x, insn)
but sets must be ordered with respect to a pending clobber. */ but sets must be ordered with respect to a pending clobber. */
if (code == SET) if (code == SET)
{ {
free_list (&reg_last_uses[regno + i], &unused_insn_list); free_INSN_LIST_list (&reg_last_uses[regno + i]);
for (u = reg_last_clobbers[regno + i]; u; u = XEXP (u, 1)) for (u = reg_last_clobbers[regno + i]; u; u = XEXP (u, 1))
add_dependence (insn, XEXP (u, 0), REG_DEP_OUTPUT); add_dependence (insn, XEXP (u, 0), REG_DEP_OUTPUT);
SET_REGNO_REG_SET (reg_pending_sets, regno + i); SET_REGNO_REG_SET (reg_pending_sets, regno + i);
...@@ -3406,7 +3324,7 @@ sched_analyze_1 (x, insn) ...@@ -3406,7 +3324,7 @@ sched_analyze_1 (x, insn)
if (code == SET) if (code == SET)
{ {
free_list (&reg_last_uses[regno], &unused_insn_list); free_INSN_LIST_list (&reg_last_uses[regno]);
for (u = reg_last_clobbers[regno]; u; u = XEXP (u, 1)) for (u = reg_last_clobbers[regno]; u; u = XEXP (u, 1))
add_dependence (insn, XEXP (u, 0), REG_DEP_OUTPUT); add_dependence (insn, XEXP (u, 0), REG_DEP_OUTPUT);
SET_REGNO_REG_SET (reg_pending_sets, regno); SET_REGNO_REG_SET (reg_pending_sets, regno);
...@@ -3672,7 +3590,7 @@ sched_analyze_2 (x, insn) ...@@ -3672,7 +3590,7 @@ sched_analyze_2 (x, insn)
{ {
for (u = reg_last_uses[i]; u; u = XEXP (u, 1)) for (u = reg_last_uses[i]; u; u = XEXP (u, 1))
add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI); add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
free_list (&reg_last_uses[i], &unused_insn_list); free_INSN_LIST_list (&reg_last_uses[i]);
for (u = reg_last_sets[i]; u; u = XEXP (u, 1)) for (u = reg_last_sets[i]; u; u = XEXP (u, 1))
add_dependence (insn, XEXP (u, 0), 0); add_dependence (insn, XEXP (u, 0), 0);
...@@ -3805,7 +3723,7 @@ sched_analyze_insn (x, insn, loop_notes) ...@@ -3805,7 +3723,7 @@ sched_analyze_insn (x, insn, loop_notes)
rtx u; rtx u;
for (u = reg_last_uses[i]; u; u = XEXP (u, 1)) for (u = reg_last_uses[i]; u; u = XEXP (u, 1))
add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI); add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
free_list (&reg_last_uses[i], &unused_insn_list); free_INSN_LIST_list (&reg_last_uses[i]);
for (u = reg_last_sets[i]; u; u = XEXP (u, 1)) for (u = reg_last_sets[i]; u; u = XEXP (u, 1))
add_dependence (insn, XEXP (u, 0), 0); add_dependence (insn, XEXP (u, 0), 0);
...@@ -3825,9 +3743,8 @@ sched_analyze_insn (x, insn, loop_notes) ...@@ -3825,9 +3743,8 @@ sched_analyze_insn (x, insn, loop_notes)
subsequent sets will be output dependant on it. */ subsequent sets will be output dependant on it. */
EXECUTE_IF_SET_IN_REG_SET (reg_pending_sets, 0, i, EXECUTE_IF_SET_IN_REG_SET (reg_pending_sets, 0, i,
{ {
free_list (&reg_last_sets[i], &unused_insn_list); free_INSN_LIST_list (&reg_last_sets[i]);
free_list (&reg_last_clobbers[i], free_INSN_LIST_list (&reg_last_clobbers[i]);
&unused_insn_list);
reg_last_sets[i] reg_last_sets[i]
= alloc_INSN_LIST (insn, NULL_RTX); = alloc_INSN_LIST (insn, NULL_RTX);
}); });
...@@ -3843,7 +3760,7 @@ sched_analyze_insn (x, insn, loop_notes) ...@@ -3843,7 +3760,7 @@ sched_analyze_insn (x, insn, loop_notes)
{ {
for (i = 0; i < maxreg; i++) for (i = 0; i < maxreg; i++)
{ {
free_list (&reg_last_sets[i], &unused_insn_list); free_INSN_LIST_list (&reg_last_sets[i]);
reg_last_sets[i] = alloc_INSN_LIST (insn, NULL_RTX); reg_last_sets[i] = alloc_INSN_LIST (insn, NULL_RTX);
} }
...@@ -3937,7 +3854,7 @@ sched_analyze (head, tail) ...@@ -3937,7 +3854,7 @@ sched_analyze (head, tail)
{ {
for (u = reg_last_uses[i]; u; u = XEXP (u, 1)) for (u = reg_last_uses[i]; u; u = XEXP (u, 1))
add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI); add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
free_list (&reg_last_uses[i], &unused_insn_list); free_INSN_LIST_list (&reg_last_uses[i]);
for (u = reg_last_sets[i]; u; u = XEXP (u, 1)) for (u = reg_last_sets[i]; u; u = XEXP (u, 1))
add_dependence (insn, XEXP (u, 0), 0); add_dependence (insn, XEXP (u, 0), 0);
...@@ -3995,7 +3912,7 @@ sched_analyze (head, tail) ...@@ -3995,7 +3912,7 @@ sched_analyze (head, tail)
function call) on all hard register clobberage. */ function call) on all hard register clobberage. */
/* last_function_call is now a list of insns */ /* last_function_call is now a list of insns */
free_list(&last_function_call, &unused_insn_list); free_INSN_LIST_list(&last_function_call);
last_function_call = alloc_INSN_LIST (insn, NULL_RTX); last_function_call = alloc_INSN_LIST (insn, NULL_RTX);
} }
...@@ -7455,18 +7372,18 @@ compute_block_backward_dependences (bb) ...@@ -7455,18 +7372,18 @@ compute_block_backward_dependences (bb)
/* Free up the INSN_LISTs /* Free up the INSN_LISTs
Note this loop is executed max_reg * nr_regions times. It's first Note this loop is executed max_reg * nr_regions times. It's first
implementation accounted for over 90% of the calls to free_list. implementation accounted for over 90% of the calls to free_INSN_LIST_list.
The list was empty for the vast majority of those calls. On the PA, The list was empty for the vast majority of those calls. On the PA, not
not calling free_list in those cases improves -O2 compile times by calling free_INSN_LIST_list in those cases improves -O2 compile times by
3-5% on average. */ 3-5% on average. */
for (b = 0; b < max_reg; ++b) for (b = 0; b < max_reg; ++b)
{ {
if (reg_last_clobbers[b]) if (reg_last_clobbers[b])
free_list (&reg_last_clobbers[b], &unused_insn_list); free_INSN_LIST_list (&reg_last_clobbers[b]);
if (reg_last_sets[b]) if (reg_last_sets[b])
free_list (&reg_last_sets[b], &unused_insn_list); free_INSN_LIST_list (&reg_last_sets[b]);
if (reg_last_uses[b]) if (reg_last_uses[b])
free_list (&reg_last_uses[b], &unused_insn_list); free_INSN_LIST_list (&reg_last_uses[b]);
} }
/* Assert that we won't need bb_reg_last_* for this block anymore. */ /* Assert that we won't need bb_reg_last_* for this block anymore. */
...@@ -7823,18 +7740,6 @@ schedule_insns (dump_file) ...@@ -7823,18 +7740,6 @@ schedule_insns (dump_file)
nr_inter = 0; nr_inter = 0;
nr_spec = 0; nr_spec = 0;
/* Initialize the unused_*_lists. We can't use the ones left over from
the previous function, because gcc has freed that memory. We can use
the ones left over from the first sched pass in the second pass however,
so only clear them on the first sched pass. The first pass is before
reload if flag_schedule_insns is set, otherwise it is afterwards. */
if (reload_completed == 0 || !flag_schedule_insns)
{
unused_insn_list = 0;
unused_expr_list = 0;
}
/* initialize issue_rate */ /* initialize issue_rate */
issue_rate = ISSUE_RATE; issue_rate = ISSUE_RATE;
......
/* List management for the GNU C-Compiler expander.
Copyright (C) 1987, 88, 92-97, 1998, 1999 Free Software Foundation, Inc.
This file is part of GNU CC.
GNU CC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU CC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "config.h"
#include "system.h"
#include "toplev.h"
#include "rtl.h"
/* Functions for maintaining cache-able lists of EXPR_LIST and INSN_LISTs. */
/* An INSN_LIST containing all INSN_LISTs allocated but currently unused. */
static rtx unused_insn_list;
/* An EXPR_LIST containing all EXPR_LISTs allocated but currently unused. */
static rtx unused_expr_list;
/* This function will free an entire list of either EXPR_LIST or INSN_LIST
nodes. This is to be used only only lists that consist exclusively of
nodes of one type only. This is only called by free_EXPR_LIST_list
and free_INSN_LIST_list. */
static void
free_list (listp, unused_listp)
rtx *listp, *unused_listp;
{
register rtx link, prev_link;
prev_link = *listp;
link = XEXP (prev_link, 1);
while (link)
{
prev_link = link;
link = XEXP (link, 1);
}
XEXP (prev_link, 1) = *unused_listp;
*unused_listp = *listp;
*listp = 0;
}
/* 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
is made. */
rtx
alloc_INSN_LIST (val, next)
rtx val, next;
{
rtx r;
if (unused_insn_list)
{
r = unused_insn_list;
unused_insn_list = XEXP (r, 1);
XEXP (r, 0) = val;
XEXP (r, 1) = next;
PUT_REG_NOTE_KIND (r, VOIDmode);
}
else
r = gen_rtx_INSN_LIST (VOIDmode, val, next);
return r;
}
/* This call is used in place of a gen_rtx_EXPR_LIST. If there is a cached
node available, we'll use it, otherwise a call to gen_rtx_EXPR_LIST
is made. */
rtx
alloc_EXPR_LIST (kind, val, next)
int kind;
rtx val, next;
{
rtx r;
if (unused_expr_list)
{
r = unused_expr_list;
unused_expr_list = XEXP (r, 1);
XEXP (r, 0) = val;
XEXP (r, 1) = next;
PUT_REG_NOTE_KIND (r, kind);
}
else
r = gen_rtx_EXPR_LIST (kind, val, next);
return r;
}
/* This function will initialize the EXPR_LIST and INSN_LIST caches. */
void
init_EXPR_INSN_LIST_cache ()
{
unused_expr_list = NULL;
unused_insn_list = NULL;
}
/* This function will free up an entire list of EXPR_LIST nodes. */
void
free_EXPR_LIST_list (listp)
rtx *listp;
{
if (*listp == 0)
return;
free_list (listp, &unused_expr_list);
}
/* This function will free up an entire list of INSN_LIST nodes. */
void
free_INSN_LIST_list (listp)
rtx *listp;
{
if (*listp == 0)
return;
free_list (listp, &unused_insn_list);
}
/* This function will free up an individual EXPR_LIST node. */
void
free_EXPR_LIST_node (ptr)
rtx ptr;
{
XEXP (ptr, 1) = unused_expr_list;
unused_expr_list = ptr;
}
/* This function will free up an individual INSN_LIST node. */
void
free_INSN_LIST_node (ptr)
rtx ptr;
{
XEXP (ptr, 1) = unused_insn_list;
unused_insn_list = ptr;
}
...@@ -1022,6 +1022,13 @@ extern void remove_node_from_expr_list PROTO((rtx, rtx *)); ...@@ -1022,6 +1022,13 @@ extern void remove_node_from_expr_list PROTO((rtx, rtx *));
/* flow.c */ /* flow.c */
extern rtx find_use_as_address PROTO((rtx, rtx, HOST_WIDE_INT)); extern rtx find_use_as_address PROTO((rtx, rtx, HOST_WIDE_INT));
void init_EXPR_INSN_LIST_cache PROTO((void));
void free_EXPR_LIST_list PROTO((rtx *));
void free_INSN_LIST_list PROTO((rtx *));
void free_EXPR_LIST_node PROTO((rtx));
void free_INSN_LIST_node PROTO((rtx));
rtx alloc_INSN_LIST PROTO((rtx, rtx));
rtx alloc_EXPR_LIST PROTO((int, rtx, rtx));
/* regclass.c */ /* regclass.c */
......
...@@ -3821,6 +3821,8 @@ rest_of_compilation (decl) ...@@ -3821,6 +3821,8 @@ rest_of_compilation (decl)
unshare_all_rtl (insns); unshare_all_rtl (insns);
init_EXPR_INSN_LIST_cache ();
#ifdef SETJMP_VIA_SAVE_AREA #ifdef SETJMP_VIA_SAVE_AREA
/* This must be performed before virutal register instantiation. */ /* This must be performed before virutal register instantiation. */
if (current_function_calls_alloca) if (current_function_calls_alloca)
......
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