final.c: Convert prototypes to ISO C90.
* final.c: Convert prototypes to ISO C90. * flow.c: Likewise. * flags.h: Likewise. From-SVN: r68760
This commit is contained in:
parent
4c20b2e76b
commit
6cf9ac2858
@ -1,3 +1,11 @@
|
||||
2003-07-01 Andreas Jaeger <aj@suse.de>
|
||||
|
||||
* final.c: Convert prototypes to ISO C90.
|
||||
* flow.c: Likewise.
|
||||
* flags.h: Likewise.
|
||||
* gcov-io.c: Likewise.
|
||||
* gcov-io.h: Likewise.
|
||||
|
||||
2003-06-30 Bruno Haible <bruno@clisp.org>
|
||||
|
||||
PR middle-end/6578
|
||||
@ -45,14 +53,14 @@
|
||||
* config/rs6000/spe.h (__ev_set_spefscr_frmc): Set the flag.
|
||||
|
||||
2003-06-30 Bob Wilson <bob.wilson@acm.org>
|
||||
|
||||
|
||||
* config/xtensa/lib1funcs.asm: Use "xtensa-config.h" from
|
||||
top-level include directory.
|
||||
* config/xtensa/lib2funcs.S: Likewise.
|
||||
* config/xtensa/xtensa.h: Likewise.
|
||||
* config/xtensa/xtensa-config.h: Remove.
|
||||
* doc/install.texi: Update location of "xtensa-config.h" header.
|
||||
|
||||
|
||||
2003-06-30 Ulrich Weigand <uweigand@de.ibm.com>
|
||||
|
||||
* config/s390/s390.c (s390_extra_constraint): New function.
|
||||
@ -82,18 +90,18 @@
|
||||
"*tstsi", "*tstsi_cconly", "*tsthiCCT", "*tsthiCCT_cconly",
|
||||
"*tsthi", "*tsthi_cconly", "*tstqiCCT", "*tstqiCCT_cconly",
|
||||
"*tstqi", "*tstqi_cconly", "*cmpsi_ccs_sign", "*cmpsi_ccs",
|
||||
"*cmpsi_ccu", "*cmphi_ccu", "*cmpqi_ccu", "*cli",
|
||||
"*cmpsi_ccu", "*cmphi_ccu", "*cmpqi_ccu", "*cli",
|
||||
"movti", "*movdi_64", "*movdi_31", "*movsi", "movhi", "movqi_64",
|
||||
"movqi", "*movstrictqi", "*movstricthi", "movstrictsi",
|
||||
"*movdf_64", "*movdf_31", "*movsf",
|
||||
"*movdf_64", "*movdf_31", "*movsf",
|
||||
"*load_multiple_si", "*store_multiple_di",
|
||||
"*sethighqisi", "*sethighhisi", "*sethighqidi_31", "*extendhisi2",
|
||||
"*la_64", "*la_31", "*la_31_and", "force_la_31",
|
||||
"*sethighqisi", "*sethighhisi", "*sethighqidi_31", "*extendhisi2",
|
||||
"*la_64", "*la_31", "*la_31_and", "force_la_31",
|
||||
"*addsi3_carry1_cc", *addsi3_carry1_cconly",
|
||||
"*addsi3_carry2_cc", *addsi3_carry2_cconly",
|
||||
"*addsi3_cc", "*addsi3_cconly", "*addsi3_cconly2",
|
||||
"*addsi3_sign", "*addsi3_sub", "addsi3",
|
||||
"*subsi3_borrow_cc", "*subsi3_borrow_cconly", "*subsi3_cc",
|
||||
"*addsi3_sign", "*addsi3_sub", "addsi3",
|
||||
"*subsi3_borrow_cc", "*subsi3_borrow_cconly", "*subsi3_cc",
|
||||
"*subsi3_cconly", "*subsi3_sign", "*subsi3_sub", "subsi3",
|
||||
"mulsi3"
|
||||
"*andsi3_cc", "*andsi3_cconly", "andsi3",
|
||||
@ -106,7 +114,7 @@
|
||||
|
||||
("*cmpdf_ccs", "*cmpdf_ccs_ibm", "*cmpsf_ccs", "*cmpsf_ccs_ibm",
|
||||
"*load_multiple_di", "*store_multiple_di",
|
||||
"*sethighqidi_64", "*zero_extendhisi2_31",
|
||||
"*sethighqidi_64", "*zero_extendhisi2_31",
|
||||
"truncdfsf2_ibm", "extendsfdf2_ieee", "extendsfdf2_ibm",
|
||||
"adddf3", "*adddf3", "*adddf3_ibm",
|
||||
"addsf3", "*addsf3", "*addsf3_ibm",
|
||||
@ -117,11 +125,11 @@
|
||||
"mulsf3", "*mulsf3", "*mulsf3_ibm",
|
||||
"divdf3", "*divdf3", "*divdf3_ibm",
|
||||
"divsf3", "div*sf3", "*divsf3_ibm",
|
||||
"sqrtdf2", "sqrtsf2",
|
||||
"sqrtdf2", "sqrtsf2",
|
||||
"*cjump_long", "*icjump_long", "indirect_jump", "casesi_jump",
|
||||
"*doloop_si_long", "*doloop_di_long", "bas_64", "bas_31",
|
||||
"bas_r_64", "bas_r_31", "bas_tls_31", "bas_tls_64"): Adapt memory
|
||||
and address constraints for instructions that do not accept long
|
||||
"bas_r_64", "bas_r_31", "bas_tls_31", "bas_tls_64"): Adapt memory
|
||||
and address constraints for instructions that do not accept long
|
||||
displacements.
|
||||
|
||||
2003-06-30 Hartmut Penner <hpenner@de.ibm.com>
|
||||
@ -180,14 +188,14 @@ Mon Jun 30 23:47:33 CEST 2003 Jan Hubicka <jh@suse.cz>
|
||||
architecture to assembler.
|
||||
(LINK_SPEC): Merge 31-bit and 64-bit variants.
|
||||
(LINK_ARCH31_SPEC, LINK_ARCH64_SPEC, EXTRA_SPECS): Remove.
|
||||
* config/s390/s390.c (override_options): New default rules for
|
||||
* config/s390/s390.c (override_options): New default rules for
|
||||
architecture mode and cpu architecture selection.
|
||||
* doc/invoke.texi (-mesa, -mzarch, -march, -mtune): Document
|
||||
new default rules.
|
||||
|
||||
|
||||
* config/s390/s390.h (enum processor_type): Add PROCESSOR_2084_Z990.
|
||||
* config/s390/s390.md (attr "cpu"): Add "z990" processor type.
|
||||
* config/s390/s390.c (override_options): Add "z990" to
|
||||
* config/s390/s390.c (override_options): Add "z990" to
|
||||
processor_alias_table.
|
||||
* doc/invoke.texi (-march): Document "z990" processor type.
|
||||
|
||||
@ -195,7 +203,7 @@ Mon Jun 30 23:47:33 CEST 2003 Jan Hubicka <jh@suse.cz>
|
||||
* config/s390/s390.h (s390_tune_flags, s390_arch_flags): Declare.
|
||||
(enum processor_flags, TARGET_CPU_IEEE_FLOAT, TARGET_CPU_ZARCH,
|
||||
TARGET_CPU_LONG_DISPLACEMENT, TARGET_LONG_DISPLACEMENT): New.
|
||||
* config/s390/s390.c (override_options): Replace enum pta_flags by
|
||||
* config/s390/s390.c (override_options): Replace enum pta_flags by
|
||||
enum processor_flags. Fill in s390_tune_flags and s390_arch_flags.
|
||||
|
||||
* config/s390/s390.c (s390_cpu): Rename to ...
|
||||
@ -263,7 +271,7 @@ Mon Jun 30 15:36:29 CEST 2003 Jan Hubicka <jh@suse.cz>
|
||||
* config/rs6000/rs6000.c (rs6000_split_altivec_in_gprs): New function.
|
||||
(altivec_in_gprs_p): New function.
|
||||
|
||||
* config/rs6000/rs6000-protos (rs6000_split_altivec_in_gprs): New
|
||||
* config/rs6000/rs6000-protos (rs6000_split_altivec_in_gprs): New
|
||||
prototype.
|
||||
(altivec_in_gprs_p): New prototype.
|
||||
|
||||
@ -370,7 +378,7 @@ Sun Jun 29 23:06:32 CEST 2003 Jan Hubicka <jh@suse.cz>
|
||||
2003-06-29 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
|
||||
|
||||
* loop.c (count_one_set): Fix detection of registers set in more
|
||||
than one basic block.
|
||||
than one basic block.
|
||||
|
||||
2003-06-29 Andreas Jaeger <aj@suse.de>
|
||||
|
||||
|
195
gcc/final.c
195
gcc/final.c
@ -1,6 +1,6 @@
|
||||
/* Convert RTL to assembler code and output it, for GNU compiler.
|
||||
Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997,
|
||||
1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
|
||||
1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
@ -205,35 +205,34 @@ rtx current_insn_predicate;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_ATTR_length
|
||||
static int asm_insn_count PARAMS ((rtx));
|
||||
static int asm_insn_count (rtx);
|
||||
#endif
|
||||
static void profile_function PARAMS ((FILE *));
|
||||
static void profile_after_prologue PARAMS ((FILE *));
|
||||
static bool notice_source_line PARAMS ((rtx));
|
||||
static rtx walk_alter_subreg PARAMS ((rtx *));
|
||||
static void output_asm_name PARAMS ((void));
|
||||
static void output_alternate_entry_point PARAMS ((FILE *, rtx));
|
||||
static tree get_mem_expr_from_op PARAMS ((rtx, int *));
|
||||
static void output_asm_operand_names PARAMS ((rtx *, int *, int));
|
||||
static void output_operand PARAMS ((rtx, int));
|
||||
static void profile_function (FILE *);
|
||||
static void profile_after_prologue (FILE *);
|
||||
static bool notice_source_line (rtx);
|
||||
static rtx walk_alter_subreg (rtx *);
|
||||
static void output_asm_name (void);
|
||||
static void output_alternate_entry_point (FILE *, rtx);
|
||||
static tree get_mem_expr_from_op (rtx, int *);
|
||||
static void output_asm_operand_names (rtx *, int *, int);
|
||||
static void output_operand (rtx, int);
|
||||
#ifdef LEAF_REGISTERS
|
||||
static void leaf_renumber_regs PARAMS ((rtx));
|
||||
static void leaf_renumber_regs (rtx);
|
||||
#endif
|
||||
#ifdef HAVE_cc0
|
||||
static int alter_cond PARAMS ((rtx));
|
||||
static int alter_cond (rtx);
|
||||
#endif
|
||||
#ifndef ADDR_VEC_ALIGN
|
||||
static int final_addr_vec_align PARAMS ((rtx));
|
||||
static int final_addr_vec_align (rtx);
|
||||
#endif
|
||||
#ifdef HAVE_ATTR_length
|
||||
static int align_fuzz PARAMS ((rtx, rtx, int, unsigned));
|
||||
static int align_fuzz (rtx, rtx, int, unsigned);
|
||||
#endif
|
||||
|
||||
/* Initialize data in final at the beginning of a compilation. */
|
||||
|
||||
void
|
||||
init_final (filename)
|
||||
const char *filename ATTRIBUTE_UNUSED;
|
||||
init_final (const char *filename ATTRIBUTE_UNUSED)
|
||||
{
|
||||
app_on = 0;
|
||||
final_sequence = 0;
|
||||
@ -248,16 +247,14 @@ init_final (filename)
|
||||
If not overridden for epilogue code, then the function body itself
|
||||
contains return instructions wherever needed. */
|
||||
void
|
||||
default_function_pro_epilogue (file, size)
|
||||
FILE *file ATTRIBUTE_UNUSED;
|
||||
HOST_WIDE_INT size ATTRIBUTE_UNUSED;
|
||||
default_function_pro_epilogue (FILE *file ATTRIBUTE_UNUSED,
|
||||
HOST_WIDE_INT size ATTRIBUTE_UNUSED)
|
||||
{
|
||||
}
|
||||
|
||||
/* Default target hook that outputs nothing to a stream. */
|
||||
void
|
||||
no_asm_to_stream (file)
|
||||
FILE *file ATTRIBUTE_UNUSED;
|
||||
no_asm_to_stream (FILE *file ATTRIBUTE_UNUSED)
|
||||
{
|
||||
}
|
||||
|
||||
@ -265,7 +262,7 @@ no_asm_to_stream (file)
|
||||
Used before the output from an `asm' statement. */
|
||||
|
||||
void
|
||||
app_enable ()
|
||||
app_enable (void)
|
||||
{
|
||||
if (! app_on)
|
||||
{
|
||||
@ -278,7 +275,7 @@ app_enable ()
|
||||
Called from varasm.c before most kinds of output. */
|
||||
|
||||
void
|
||||
app_disable ()
|
||||
app_disable (void)
|
||||
{
|
||||
if (app_on)
|
||||
{
|
||||
@ -293,7 +290,7 @@ app_disable ()
|
||||
|
||||
#ifdef DELAY_SLOTS
|
||||
int
|
||||
dbr_sequence_length ()
|
||||
dbr_sequence_length (void)
|
||||
{
|
||||
if (final_sequence != 0)
|
||||
return XVECLEN (final_sequence, 0) - 1;
|
||||
@ -346,7 +343,7 @@ static struct label_alignment *label_align;
|
||||
/* Indicate that branch shortening hasn't yet been done. */
|
||||
|
||||
void
|
||||
init_insn_lengths ()
|
||||
init_insn_lengths (void)
|
||||
{
|
||||
if (uid_shuid)
|
||||
{
|
||||
@ -373,8 +370,7 @@ init_insn_lengths ()
|
||||
get its actual length. Otherwise, get its maximum length. */
|
||||
|
||||
int
|
||||
get_attr_length (insn)
|
||||
rtx insn ATTRIBUTE_UNUSED;
|
||||
get_attr_length (rtx insn ATTRIBUTE_UNUSED)
|
||||
{
|
||||
#ifdef HAVE_ATTR_length
|
||||
rtx body;
|
||||
@ -508,8 +504,7 @@ get_attr_length (insn)
|
||||
|
||||
#ifndef ADDR_VEC_ALIGN
|
||||
static int
|
||||
final_addr_vec_align (addr_vec)
|
||||
rtx addr_vec;
|
||||
final_addr_vec_align (rtx addr_vec)
|
||||
{
|
||||
int align = GET_MODE_SIZE (GET_MODE (PATTERN (addr_vec)));
|
||||
|
||||
@ -539,8 +534,7 @@ static int min_labelno, max_labelno;
|
||||
/* For the benefit of port specific code do this also as a function. */
|
||||
|
||||
int
|
||||
label_to_alignment (label)
|
||||
rtx label;
|
||||
label_to_alignment (rtx label)
|
||||
{
|
||||
return LABEL_TO_ALIGNMENT (label);
|
||||
}
|
||||
@ -575,10 +569,7 @@ label_to_alignment (label)
|
||||
The return value is undefined for any other value of GROWTH. */
|
||||
|
||||
static int
|
||||
align_fuzz (start, end, known_align_log, growth)
|
||||
rtx start, end;
|
||||
int known_align_log;
|
||||
unsigned growth;
|
||||
align_fuzz (rtx start, rtx end, int known_align_log, unsigned int growth)
|
||||
{
|
||||
int uid = INSN_UID (start);
|
||||
rtx align_label;
|
||||
@ -617,8 +608,7 @@ align_fuzz (start, end, known_align_log, growth)
|
||||
to exclude the branch size. */
|
||||
|
||||
int
|
||||
insn_current_reference_address (branch)
|
||||
rtx branch;
|
||||
insn_current_reference_address (rtx branch)
|
||||
{
|
||||
rtx dest, seq;
|
||||
int seq_uid;
|
||||
@ -655,7 +645,7 @@ insn_current_reference_address (branch)
|
||||
#endif /* HAVE_ATTR_length */
|
||||
|
||||
void
|
||||
compute_alignments ()
|
||||
compute_alignments (void)
|
||||
{
|
||||
int log, max_skip, max_log;
|
||||
basic_block bb;
|
||||
@ -755,8 +745,7 @@ compute_alignments ()
|
||||
slots. */
|
||||
|
||||
void
|
||||
shorten_branches (first)
|
||||
rtx first ATTRIBUTE_UNUSED;
|
||||
shorten_branches (rtx first ATTRIBUTE_UNUSED)
|
||||
{
|
||||
rtx insn;
|
||||
int max_uid;
|
||||
@ -1311,8 +1300,7 @@ shorten_branches (first)
|
||||
This is used to compute its length. */
|
||||
|
||||
static int
|
||||
asm_insn_count (body)
|
||||
rtx body;
|
||||
asm_insn_count (rtx body)
|
||||
{
|
||||
const char *template;
|
||||
int count = 1;
|
||||
@ -1341,10 +1329,8 @@ asm_insn_count (body)
|
||||
test and compare insns. */
|
||||
|
||||
void
|
||||
final_start_function (first, file, optimize)
|
||||
rtx first ATTRIBUTE_UNUSED;
|
||||
FILE *file;
|
||||
int optimize ATTRIBUTE_UNUSED;
|
||||
final_start_function (rtx first ATTRIBUTE_UNUSED, FILE *file,
|
||||
int optimize ATTRIBUTE_UNUSED)
|
||||
{
|
||||
block_depth = 0;
|
||||
|
||||
@ -1416,8 +1402,7 @@ final_start_function (first, file, optimize)
|
||||
}
|
||||
|
||||
static void
|
||||
profile_after_prologue (file)
|
||||
FILE *file ATTRIBUTE_UNUSED;
|
||||
profile_after_prologue (FILE *file ATTRIBUTE_UNUSED)
|
||||
{
|
||||
#ifndef PROFILE_BEFORE_PROLOGUE
|
||||
if (current_function_profile)
|
||||
@ -1426,8 +1411,7 @@ profile_after_prologue (file)
|
||||
}
|
||||
|
||||
static void
|
||||
profile_function (file)
|
||||
FILE *file ATTRIBUTE_UNUSED;
|
||||
profile_function (FILE *file ATTRIBUTE_UNUSED)
|
||||
{
|
||||
#ifndef NO_PROFILE_COUNTERS
|
||||
# define NO_PROFILE_COUNTERS 0
|
||||
@ -1508,7 +1492,7 @@ profile_function (file)
|
||||
even though not all of them are needed. */
|
||||
|
||||
void
|
||||
final_end_function ()
|
||||
final_end_function (void)
|
||||
{
|
||||
app_disable ();
|
||||
|
||||
@ -1540,11 +1524,7 @@ final_end_function ()
|
||||
Prescanning is done only on certain machines. */
|
||||
|
||||
void
|
||||
final (first, file, optimize, prescan)
|
||||
rtx first;
|
||||
FILE *file;
|
||||
int optimize;
|
||||
int prescan;
|
||||
final (rtx first, FILE *file, int optimize, int prescan)
|
||||
{
|
||||
rtx insn;
|
||||
int max_line = 0;
|
||||
@ -1636,9 +1616,7 @@ final (first, file, optimize, prescan)
|
||||
}
|
||||
|
||||
const char *
|
||||
get_insn_template (code, insn)
|
||||
int code;
|
||||
rtx insn;
|
||||
get_insn_template (int code, rtx insn)
|
||||
{
|
||||
const void *output = insn_data[code].output;
|
||||
switch (insn_data[code].output_format)
|
||||
@ -1663,9 +1641,7 @@ get_insn_template (code, insn)
|
||||
|
||||
The case fall-through in this function is intentional. */
|
||||
static void
|
||||
output_alternate_entry_point (file, insn)
|
||||
FILE *file;
|
||||
rtx insn;
|
||||
output_alternate_entry_point (FILE *file, rtx insn)
|
||||
{
|
||||
const char *name = LABEL_NAME (insn);
|
||||
|
||||
@ -1699,12 +1675,8 @@ output_alternate_entry_point (file, insn)
|
||||
used for within delayed branch sequence output). */
|
||||
|
||||
rtx
|
||||
final_scan_insn (insn, file, optimize, prescan, nopeepholes)
|
||||
rtx insn;
|
||||
FILE *file;
|
||||
int optimize ATTRIBUTE_UNUSED;
|
||||
int prescan;
|
||||
int nopeepholes ATTRIBUTE_UNUSED;
|
||||
final_scan_insn (rtx insn, FILE *file, int optimize ATTRIBUTE_UNUSED,
|
||||
int prescan, int nopeepholes ATTRIBUTE_UNUSED)
|
||||
{
|
||||
#ifdef HAVE_cc0
|
||||
rtx set;
|
||||
@ -2527,8 +2499,7 @@ final_scan_insn (insn, file, optimize, prescan, nopeepholes)
|
||||
based on the NOTE-insn INSN, assumed to be a line number. */
|
||||
|
||||
static bool
|
||||
notice_source_line (insn)
|
||||
rtx insn;
|
||||
notice_source_line (rtx insn)
|
||||
{
|
||||
const char *filename = insn_file (insn);
|
||||
int linenum = insn_line (insn);
|
||||
@ -2548,8 +2519,7 @@ notice_source_line (insn)
|
||||
directly to the desired hard register. */
|
||||
|
||||
void
|
||||
cleanup_subreg_operands (insn)
|
||||
rtx insn;
|
||||
cleanup_subreg_operands (rtx insn)
|
||||
{
|
||||
int i;
|
||||
extract_insn_cached (insn);
|
||||
@ -2583,8 +2553,7 @@ cleanup_subreg_operands (insn)
|
||||
based on the thing it is a subreg of. */
|
||||
|
||||
rtx
|
||||
alter_subreg (xp)
|
||||
rtx *xp;
|
||||
alter_subreg (rtx *xp)
|
||||
{
|
||||
rtx x = *xp;
|
||||
rtx y = SUBREG_REG (x);
|
||||
@ -2616,8 +2585,7 @@ alter_subreg (xp)
|
||||
/* Do alter_subreg on all the SUBREGs contained in X. */
|
||||
|
||||
static rtx
|
||||
walk_alter_subreg (xp)
|
||||
rtx *xp;
|
||||
walk_alter_subreg (rtx *xp)
|
||||
{
|
||||
rtx x = *xp;
|
||||
switch (GET_CODE (x))
|
||||
@ -2654,8 +2622,7 @@ walk_alter_subreg (xp)
|
||||
2 means that COND has been altered. */
|
||||
|
||||
static int
|
||||
alter_cond (cond)
|
||||
rtx cond;
|
||||
alter_cond (rtx cond)
|
||||
{
|
||||
int value = 0;
|
||||
|
||||
@ -2814,7 +2781,7 @@ output_operand_lossage (const char *msgid, ...)
|
||||
char *new_message;
|
||||
const char *pfx_str;
|
||||
va_list ap;
|
||||
|
||||
|
||||
va_start (ap, msgid);
|
||||
|
||||
pfx_str = this_is_asm_operands ? _("invalid `asm': ") : "output_operand: ";
|
||||
@ -2837,7 +2804,7 @@ output_operand_lossage (const char *msgid, ...)
|
||||
alternative used. */
|
||||
|
||||
static void
|
||||
output_asm_name ()
|
||||
output_asm_name (void)
|
||||
{
|
||||
if (debug_insn)
|
||||
{
|
||||
@ -2862,9 +2829,7 @@ output_asm_name ()
|
||||
corresponds to the address of the object and 0 if to the object. */
|
||||
|
||||
static tree
|
||||
get_mem_expr_from_op (op, paddressp)
|
||||
rtx op;
|
||||
int *paddressp;
|
||||
get_mem_expr_from_op (rtx op, int *paddressp)
|
||||
{
|
||||
tree expr;
|
||||
int inner_addressp;
|
||||
@ -2905,10 +2870,7 @@ get_mem_expr_from_op (op, paddressp)
|
||||
is the number of operands to write. */
|
||||
|
||||
static void
|
||||
output_asm_operand_names (operands, oporder, nops)
|
||||
rtx *operands;
|
||||
int *oporder;
|
||||
int nops;
|
||||
output_asm_operand_names (rtx *operands, int *oporder, int nops)
|
||||
{
|
||||
int wrote = 0;
|
||||
int i;
|
||||
@ -2952,9 +2914,7 @@ output_asm_operand_names (operands, oporder, nops)
|
||||
of the operand, with no other punctuation. */
|
||||
|
||||
void
|
||||
output_asm_insn (template, operands)
|
||||
const char *template;
|
||||
rtx *operands;
|
||||
output_asm_insn (const char *template, rtx *operands)
|
||||
{
|
||||
const char *p;
|
||||
int c;
|
||||
@ -3160,8 +3120,7 @@ output_asm_insn (template, operands)
|
||||
/* Output a LABEL_REF, or a bare CODE_LABEL, as an assembler symbol. */
|
||||
|
||||
void
|
||||
output_asm_label (x)
|
||||
rtx x;
|
||||
output_asm_label (rtx x)
|
||||
{
|
||||
char buf[256];
|
||||
|
||||
@ -3188,9 +3147,7 @@ output_asm_label (x)
|
||||
by PRINT_OPERAND. */
|
||||
|
||||
static void
|
||||
output_operand (x, code)
|
||||
rtx x;
|
||||
int code ATTRIBUTE_UNUSED;
|
||||
output_operand (rtx x, int code ATTRIBUTE_UNUSED)
|
||||
{
|
||||
if (x && GET_CODE (x) == SUBREG)
|
||||
x = alter_subreg (&x);
|
||||
@ -3209,8 +3166,7 @@ output_operand (x, code)
|
||||
The macro PRINT_OPERAND_ADDRESS exists just to control this function. */
|
||||
|
||||
void
|
||||
output_address (x)
|
||||
rtx x;
|
||||
output_address (rtx x)
|
||||
{
|
||||
walk_alter_subreg (&x);
|
||||
PRINT_OPERAND_ADDRESS (asm_out_file, x);
|
||||
@ -3221,9 +3177,7 @@ output_address (x)
|
||||
that may appear in these expressions. */
|
||||
|
||||
void
|
||||
output_addr_const (file, x)
|
||||
FILE *file;
|
||||
rtx x;
|
||||
output_addr_const (FILE *file, rtx x)
|
||||
{
|
||||
char buf[256];
|
||||
|
||||
@ -3355,7 +3309,7 @@ asm_fprintf (FILE *file, const char *p, ...)
|
||||
char buf[10];
|
||||
char *q, c;
|
||||
va_list argptr;
|
||||
|
||||
|
||||
va_start (argptr, p);
|
||||
|
||||
buf[0] = '%';
|
||||
@ -3447,7 +3401,7 @@ asm_fprintf (FILE *file, const char *p, ...)
|
||||
*q = 0;
|
||||
fprintf (file, buf, va_arg (argptr, long));
|
||||
}
|
||||
|
||||
|
||||
break;
|
||||
|
||||
case 's':
|
||||
@ -3515,9 +3469,7 @@ asm_fprintf (FILE *file, const char *p, ...)
|
||||
and in *SECOND the other. */
|
||||
|
||||
void
|
||||
split_double (value, first, second)
|
||||
rtx value;
|
||||
rtx *first, *second;
|
||||
split_double (rtx value, rtx *first, rtx *second)
|
||||
{
|
||||
if (GET_CODE (value) == CONST_INT)
|
||||
{
|
||||
@ -3656,7 +3608,7 @@ split_double (value, first, second)
|
||||
/* Return nonzero if this function has no function calls. */
|
||||
|
||||
int
|
||||
leaf_function_p ()
|
||||
leaf_function_p (void)
|
||||
{
|
||||
rtx insn;
|
||||
rtx link;
|
||||
@ -3699,8 +3651,7 @@ leaf_function_p ()
|
||||
output templates to customary add branch prediction hints.
|
||||
*/
|
||||
int
|
||||
final_forward_branch_p (insn)
|
||||
rtx insn;
|
||||
final_forward_branch_p (rtx insn)
|
||||
{
|
||||
int insn_id, label_id;
|
||||
if (!uid_shuid)
|
||||
@ -3728,7 +3679,7 @@ final_forward_branch_p (insn)
|
||||
safely renumbered. */
|
||||
|
||||
int
|
||||
only_leaf_regs_used ()
|
||||
only_leaf_regs_used (void)
|
||||
{
|
||||
int i;
|
||||
const char *const permitted_reg_in_leaf_functions = LEAF_REGISTERS;
|
||||
@ -3751,8 +3702,7 @@ only_leaf_regs_used ()
|
||||
available in leaf functions. */
|
||||
|
||||
static void
|
||||
leaf_renumber_regs (first)
|
||||
rtx first;
|
||||
leaf_renumber_regs (rtx first)
|
||||
{
|
||||
rtx insn;
|
||||
|
||||
@ -3773,8 +3723,7 @@ leaf_renumber_regs (first)
|
||||
available in leaf functions. */
|
||||
|
||||
void
|
||||
leaf_renumber_regs_insn (in_rtx)
|
||||
rtx in_rtx;
|
||||
leaf_renumber_regs_insn (rtx in_rtx)
|
||||
{
|
||||
int i, j;
|
||||
const char *format_ptr;
|
||||
@ -3872,15 +3821,15 @@ static int symbol_queue_size = 0;
|
||||
the nesting depth goes to 0 is this routine called. */
|
||||
|
||||
void
|
||||
debug_flush_symbol_queue ()
|
||||
debug_flush_symbol_queue (void)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
||||
/* Make sure that additionally queued items are not flushed
|
||||
prematurely. */
|
||||
|
||||
|
||||
++debug_nesting;
|
||||
|
||||
|
||||
for (i = 0; i < symbol_queue_index; ++i)
|
||||
{
|
||||
/* If we pushed queued symbols then such symbols are must be
|
||||
@ -3902,17 +3851,17 @@ debug_flush_symbol_queue ()
|
||||
}
|
||||
|
||||
symbol_queue_index = 0;
|
||||
--debug_nesting;
|
||||
--debug_nesting;
|
||||
}
|
||||
|
||||
/* Queue a type symbol needed as part of the definition of a decl
|
||||
symbol. These symbols are generated when debug_flush_symbol_queue()
|
||||
is called. */
|
||||
|
||||
void
|
||||
void
|
||||
debug_queue_symbol (tree decl)
|
||||
{
|
||||
if (symbol_queue_index >= symbol_queue_size)
|
||||
if (symbol_queue_index >= symbol_queue_size)
|
||||
{
|
||||
symbol_queue_size += 10;
|
||||
symbol_queue = (tree *) xrealloc (symbol_queue,
|
||||
@ -3920,11 +3869,11 @@ debug_queue_symbol (tree decl)
|
||||
}
|
||||
|
||||
symbol_queue[symbol_queue_index++] = decl;
|
||||
}
|
||||
}
|
||||
|
||||
/* Free symbol queue. */
|
||||
void
|
||||
debug_free_queue ()
|
||||
debug_free_queue (void)
|
||||
{
|
||||
if (symbol_queue)
|
||||
{
|
||||
|
@ -99,7 +99,7 @@ extern bool warnings_are_errors;
|
||||
set_Wunused() to update the -Wunused-* flags that correspond to the
|
||||
-Wunused option. */
|
||||
|
||||
extern void set_Wunused PARAMS ((int setting));
|
||||
extern void set_Wunused (int setting);
|
||||
|
||||
extern bool warn_unused_function;
|
||||
extern bool warn_unused_label;
|
||||
|
327
gcc/flow.c
327
gcc/flow.c
@ -206,7 +206,7 @@ rtx regs_may_share;
|
||||
|
||||
/* Callback that determines if it's ok for a function to have no
|
||||
noreturn attribute. */
|
||||
int (*lang_missing_noreturn_ok_p) PARAMS ((tree));
|
||||
int (*lang_missing_noreturn_ok_p) (tree);
|
||||
|
||||
/* Set of registers that may be eliminable. These are handled specially
|
||||
in updating regs_ever_live. */
|
||||
@ -286,64 +286,52 @@ static int ndead;
|
||||
#define MAX_MEM_SET_LIST_LEN 100
|
||||
|
||||
/* Forward declarations */
|
||||
static int verify_wide_reg_1 PARAMS ((rtx *, void *));
|
||||
static void verify_wide_reg PARAMS ((int, basic_block));
|
||||
static void verify_local_live_at_start PARAMS ((regset, basic_block));
|
||||
static void notice_stack_pointer_modification_1 PARAMS ((rtx, rtx, void *));
|
||||
static void notice_stack_pointer_modification PARAMS ((rtx));
|
||||
static void mark_reg PARAMS ((rtx, void *));
|
||||
static void mark_regs_live_at_end PARAMS ((regset));
|
||||
static int set_phi_alternative_reg PARAMS ((rtx, int, int, void *));
|
||||
static void calculate_global_regs_live PARAMS ((sbitmap, sbitmap, int));
|
||||
static void propagate_block_delete_insn PARAMS ((rtx));
|
||||
static rtx propagate_block_delete_libcall PARAMS ((rtx, rtx));
|
||||
static int insn_dead_p PARAMS ((struct propagate_block_info *,
|
||||
rtx, int, rtx));
|
||||
static int libcall_dead_p PARAMS ((struct propagate_block_info *,
|
||||
rtx, rtx));
|
||||
static void mark_set_regs PARAMS ((struct propagate_block_info *,
|
||||
rtx, rtx));
|
||||
static void mark_set_1 PARAMS ((struct propagate_block_info *,
|
||||
enum rtx_code, rtx, rtx,
|
||||
rtx, int));
|
||||
static int find_regno_partial PARAMS ((rtx *, void *));
|
||||
static int verify_wide_reg_1 (rtx *, void *);
|
||||
static void verify_wide_reg (int, basic_block);
|
||||
static void verify_local_live_at_start (regset, basic_block);
|
||||
static void notice_stack_pointer_modification_1 (rtx, rtx, void *);
|
||||
static void notice_stack_pointer_modification (rtx);
|
||||
static void mark_reg (rtx, void *);
|
||||
static void mark_regs_live_at_end (regset);
|
||||
static int set_phi_alternative_reg (rtx, int, int, void *);
|
||||
static void calculate_global_regs_live (sbitmap, sbitmap, int);
|
||||
static void propagate_block_delete_insn (rtx);
|
||||
static rtx propagate_block_delete_libcall (rtx, rtx);
|
||||
static int insn_dead_p (struct propagate_block_info *, rtx, int, rtx);
|
||||
static int libcall_dead_p (struct propagate_block_info *, rtx, rtx);
|
||||
static void mark_set_regs (struct propagate_block_info *, rtx, rtx);
|
||||
static void mark_set_1 (struct propagate_block_info *, enum rtx_code, rtx,
|
||||
rtx, rtx, int);
|
||||
static int find_regno_partial (rtx *, void *);
|
||||
|
||||
#ifdef HAVE_conditional_execution
|
||||
static int mark_regno_cond_dead PARAMS ((struct propagate_block_info *,
|
||||
int, rtx));
|
||||
static void free_reg_cond_life_info PARAMS ((splay_tree_value));
|
||||
static int flush_reg_cond_reg_1 PARAMS ((splay_tree_node, void *));
|
||||
static void flush_reg_cond_reg PARAMS ((struct propagate_block_info *,
|
||||
int));
|
||||
static rtx elim_reg_cond PARAMS ((rtx, unsigned int));
|
||||
static rtx ior_reg_cond PARAMS ((rtx, rtx, int));
|
||||
static rtx not_reg_cond PARAMS ((rtx));
|
||||
static rtx and_reg_cond PARAMS ((rtx, rtx, int));
|
||||
static int mark_regno_cond_dead (struct propagate_block_info *, int, rtx);
|
||||
static void free_reg_cond_life_info (splay_tree_value);
|
||||
static int flush_reg_cond_reg_1 (splay_tree_node, void *);
|
||||
static void flush_reg_cond_reg (struct propagate_block_info *, int);
|
||||
static rtx elim_reg_cond (rtx, unsigned int);
|
||||
static rtx ior_reg_cond (rtx, rtx, int);
|
||||
static rtx not_reg_cond (rtx);
|
||||
static rtx and_reg_cond (rtx, rtx, int);
|
||||
#endif
|
||||
#ifdef AUTO_INC_DEC
|
||||
static void attempt_auto_inc PARAMS ((struct propagate_block_info *,
|
||||
rtx, rtx, rtx, rtx, rtx));
|
||||
static void find_auto_inc PARAMS ((struct propagate_block_info *,
|
||||
rtx, rtx));
|
||||
static int try_pre_increment_1 PARAMS ((struct propagate_block_info *,
|
||||
rtx));
|
||||
static int try_pre_increment PARAMS ((rtx, rtx, HOST_WIDE_INT));
|
||||
static void attempt_auto_inc (struct propagate_block_info *, rtx, rtx, rtx,
|
||||
rtx, rtx);
|
||||
static void find_auto_inc (struct propagate_block_info *, rtx, rtx);
|
||||
static int try_pre_increment_1 (struct propagate_block_info *, rtx);
|
||||
static int try_pre_increment (rtx, rtx, HOST_WIDE_INT);
|
||||
#endif
|
||||
static void mark_used_reg PARAMS ((struct propagate_block_info *,
|
||||
rtx, rtx, rtx));
|
||||
static void mark_used_regs PARAMS ((struct propagate_block_info *,
|
||||
rtx, rtx, rtx));
|
||||
void debug_flow_info PARAMS ((void));
|
||||
static void add_to_mem_set_list PARAMS ((struct propagate_block_info *,
|
||||
rtx));
|
||||
static int invalidate_mems_from_autoinc PARAMS ((rtx *, void *));
|
||||
static void invalidate_mems_from_set PARAMS ((struct propagate_block_info *,
|
||||
rtx));
|
||||
static void clear_log_links PARAMS ((sbitmap));
|
||||
static void mark_used_reg (struct propagate_block_info *, rtx, rtx, rtx);
|
||||
static void mark_used_regs (struct propagate_block_info *, rtx, rtx, rtx);
|
||||
void debug_flow_info (void);
|
||||
static void add_to_mem_set_list (struct propagate_block_info *, rtx);
|
||||
static int invalidate_mems_from_autoinc (rtx *, void *);
|
||||
static void invalidate_mems_from_set (struct propagate_block_info *, rtx);
|
||||
static void clear_log_links (sbitmap);
|
||||
|
||||
|
||||
void
|
||||
check_function_return_warnings ()
|
||||
check_function_return_warnings (void)
|
||||
{
|
||||
if (warn_missing_noreturn
|
||||
&& !TREE_THIS_VOLATILE (cfun->decl)
|
||||
@ -387,8 +375,7 @@ check_function_return_warnings ()
|
||||
note associated with the BLOCK. */
|
||||
|
||||
rtx
|
||||
first_insn_after_basic_block_note (block)
|
||||
basic_block block;
|
||||
first_insn_after_basic_block_note (basic_block block)
|
||||
{
|
||||
rtx insn;
|
||||
|
||||
@ -410,10 +397,7 @@ first_insn_after_basic_block_note (block)
|
||||
to be used in accumulating flow info. */
|
||||
|
||||
void
|
||||
life_analysis (f, file, flags)
|
||||
rtx f;
|
||||
FILE *file;
|
||||
int flags;
|
||||
life_analysis (rtx f, FILE *file, int flags)
|
||||
{
|
||||
#ifdef ELIMINABLE_REGS
|
||||
int i;
|
||||
@ -502,9 +486,7 @@ life_analysis (f, file, flags)
|
||||
word_mode. */
|
||||
|
||||
static int
|
||||
verify_wide_reg_1 (px, pregno)
|
||||
rtx *px;
|
||||
void *pregno;
|
||||
verify_wide_reg_1 (rtx *px, void *pregno)
|
||||
{
|
||||
rtx x = *px;
|
||||
unsigned int regno = *(int *) pregno;
|
||||
@ -522,9 +504,7 @@ verify_wide_reg_1 (px, pregno)
|
||||
of BB looking for register REGNO. */
|
||||
|
||||
static void
|
||||
verify_wide_reg (regno, bb)
|
||||
int regno;
|
||||
basic_block bb;
|
||||
verify_wide_reg (int regno, basic_block bb)
|
||||
{
|
||||
rtx head = bb->head, end = bb->end;
|
||||
|
||||
@ -555,9 +535,7 @@ verify_wide_reg (regno, bb)
|
||||
changes in live_at_start during a local update. */
|
||||
|
||||
static void
|
||||
verify_local_live_at_start (new_live_at_start, bb)
|
||||
regset new_live_at_start;
|
||||
basic_block bb;
|
||||
verify_local_live_at_start (regset new_live_at_start, basic_block bb)
|
||||
{
|
||||
if (reload_completed)
|
||||
{
|
||||
@ -622,10 +600,7 @@ verify_local_live_at_start (new_live_at_start, bb)
|
||||
unless the caller resets it to zero. */
|
||||
|
||||
int
|
||||
update_life_info (blocks, extent, prop_flags)
|
||||
sbitmap blocks;
|
||||
enum update_life_extent extent;
|
||||
int prop_flags;
|
||||
update_life_info (sbitmap blocks, enum update_life_extent extent, int prop_flags)
|
||||
{
|
||||
regset tmp;
|
||||
regset_head tmp_head;
|
||||
@ -689,7 +664,7 @@ update_life_info (blocks, extent, prop_flags)
|
||||
Further improvement may be possible. */
|
||||
cleanup_cfg (CLEANUP_EXPENSIVE);
|
||||
|
||||
/* Zap the life information from the last round. If we don't
|
||||
/* Zap the life information from the last round. If we don't
|
||||
do this, we can wind up with registers that no longer appear
|
||||
in the code being marked live at entry, which twiggs bogus
|
||||
warnings from regno_uninitialized. */
|
||||
@ -775,9 +750,7 @@ update_life_info (blocks, extent, prop_flags)
|
||||
/* Update life information in all blocks where BB_DIRTY is set. */
|
||||
|
||||
int
|
||||
update_life_info_in_dirty_blocks (extent, prop_flags)
|
||||
enum update_life_extent extent;
|
||||
int prop_flags;
|
||||
update_life_info_in_dirty_blocks (enum update_life_extent extent, int prop_flags)
|
||||
{
|
||||
sbitmap update_life_blocks = sbitmap_alloc (last_basic_block);
|
||||
int n = 0;
|
||||
@ -817,8 +790,7 @@ update_life_info_in_dirty_blocks (extent, prop_flags)
|
||||
KEEP_HEAD_END_P is nonzero if basic_block_info is not to be freed. */
|
||||
|
||||
void
|
||||
free_basic_block_vars (keep_head_end_p)
|
||||
int keep_head_end_p;
|
||||
free_basic_block_vars (int keep_head_end_p)
|
||||
{
|
||||
if (! keep_head_end_p)
|
||||
{
|
||||
@ -840,8 +812,7 @@ free_basic_block_vars (keep_head_end_p)
|
||||
/* Delete any insns that copy a register to itself. */
|
||||
|
||||
int
|
||||
delete_noop_moves (f)
|
||||
rtx f ATTRIBUTE_UNUSED;
|
||||
delete_noop_moves (rtx f ATTRIBUTE_UNUSED)
|
||||
{
|
||||
rtx insn, next;
|
||||
basic_block bb;
|
||||
@ -886,7 +857,7 @@ delete_noop_moves (f)
|
||||
insns computing the destination, so we delay deleting and garbagecollect
|
||||
them once life information is computed. */
|
||||
void
|
||||
delete_dead_jumptables ()
|
||||
delete_dead_jumptables (void)
|
||||
{
|
||||
rtx insn, next;
|
||||
for (insn = get_insns (); insn; insn = next)
|
||||
@ -911,10 +882,8 @@ delete_dead_jumptables ()
|
||||
Only useful before prologues have been emitted. */
|
||||
|
||||
static void
|
||||
notice_stack_pointer_modification_1 (x, pat, data)
|
||||
rtx x;
|
||||
rtx pat ATTRIBUTE_UNUSED;
|
||||
void *data ATTRIBUTE_UNUSED;
|
||||
notice_stack_pointer_modification_1 (rtx x, rtx pat ATTRIBUTE_UNUSED,
|
||||
void *data ATTRIBUTE_UNUSED)
|
||||
{
|
||||
if (x == stack_pointer_rtx
|
||||
/* The stack pointer is only modified indirectly as the result
|
||||
@ -927,8 +896,7 @@ notice_stack_pointer_modification_1 (x, pat, data)
|
||||
}
|
||||
|
||||
static void
|
||||
notice_stack_pointer_modification (f)
|
||||
rtx f;
|
||||
notice_stack_pointer_modification (rtx f)
|
||||
{
|
||||
rtx insn;
|
||||
|
||||
@ -955,9 +923,7 @@ notice_stack_pointer_modification (f)
|
||||
of their component registers set as well. */
|
||||
|
||||
static void
|
||||
mark_reg (reg, xset)
|
||||
rtx reg;
|
||||
void *xset;
|
||||
mark_reg (rtx reg, void *xset)
|
||||
{
|
||||
regset set = (regset) xset;
|
||||
int regno = REGNO (reg);
|
||||
@ -978,8 +944,7 @@ mark_reg (reg, xset)
|
||||
at the end of the last basic block. */
|
||||
|
||||
static void
|
||||
mark_regs_live_at_end (set)
|
||||
regset set;
|
||||
mark_regs_live_at_end (regset set)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
@ -1073,11 +1038,9 @@ mark_regs_live_at_end (set)
|
||||
INSN, in the regset. */
|
||||
|
||||
static int
|
||||
set_phi_alternative_reg (insn, dest_regno, src_regno, data)
|
||||
rtx insn ATTRIBUTE_UNUSED;
|
||||
int dest_regno ATTRIBUTE_UNUSED;
|
||||
int src_regno;
|
||||
void *data;
|
||||
set_phi_alternative_reg (rtx insn ATTRIBUTE_UNUSED,
|
||||
int dest_regno ATTRIBUTE_UNUSED, int src_regno,
|
||||
void *data)
|
||||
{
|
||||
regset live = (regset) data;
|
||||
SET_REGNO_REG_SET (live, src_regno);
|
||||
@ -1091,9 +1054,7 @@ set_phi_alternative_reg (insn, dest_regno, src_regno, data)
|
||||
BLOCKS_OUT is set for every block that was changed. */
|
||||
|
||||
static void
|
||||
calculate_global_regs_live (blocks_in, blocks_out, flags)
|
||||
sbitmap blocks_in, blocks_out;
|
||||
int flags;
|
||||
calculate_global_regs_live (sbitmap blocks_in, sbitmap blocks_out, int flags)
|
||||
{
|
||||
basic_block *queue, *qhead, *qtail, *qend, bb;
|
||||
regset tmp, new_live_at_end, invalidated_by_call;
|
||||
@ -1405,9 +1366,7 @@ typedef struct {
|
||||
part of an expression which only uses part of the register. Return
|
||||
it in the structure passed in. */
|
||||
static int
|
||||
find_regno_partial (ptr, data)
|
||||
rtx *ptr;
|
||||
void *data;
|
||||
find_regno_partial (rtx *ptr, void *data)
|
||||
{
|
||||
find_regno_partial_param *param = (find_regno_partial_param *)data;
|
||||
unsigned reg = param->regno_to_find;
|
||||
@ -1452,7 +1411,7 @@ find_regno_partial (ptr, data)
|
||||
bits we don't want. */
|
||||
|
||||
int
|
||||
initialize_uninitialized_subregs ()
|
||||
initialize_uninitialized_subregs (void)
|
||||
{
|
||||
rtx insn;
|
||||
edge e;
|
||||
@ -1507,7 +1466,7 @@ initialize_uninitialized_subregs ()
|
||||
of life analysis. Not static since used also for stupid life analysis. */
|
||||
|
||||
void
|
||||
allocate_bb_life_data ()
|
||||
allocate_bb_life_data (void)
|
||||
{
|
||||
basic_block bb;
|
||||
|
||||
@ -1521,7 +1480,7 @@ allocate_bb_life_data ()
|
||||
}
|
||||
|
||||
void
|
||||
allocate_reg_life_data ()
|
||||
allocate_reg_life_data (void)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -1548,8 +1507,7 @@ allocate_reg_life_data ()
|
||||
/* Delete dead instructions for propagate_block. */
|
||||
|
||||
static void
|
||||
propagate_block_delete_insn (insn)
|
||||
rtx insn;
|
||||
propagate_block_delete_insn (rtx insn)
|
||||
{
|
||||
rtx inote = find_reg_note (insn, REG_LABEL, NULL_RTX);
|
||||
|
||||
@ -1598,8 +1556,7 @@ propagate_block_delete_insn (insn)
|
||||
before the libcall. */
|
||||
|
||||
static rtx
|
||||
propagate_block_delete_libcall ( insn, note)
|
||||
rtx insn, note;
|
||||
propagate_block_delete_libcall (rtx insn, rtx note)
|
||||
{
|
||||
rtx first = XEXP (note, 0);
|
||||
rtx before = PREV_INSN (first);
|
||||
@ -1612,9 +1569,7 @@ propagate_block_delete_libcall ( insn, note)
|
||||
/* Update the life-status of regs for one insn. Return the previous insn. */
|
||||
|
||||
rtx
|
||||
propagate_one_insn (pbi, insn)
|
||||
struct propagate_block_info *pbi;
|
||||
rtx insn;
|
||||
propagate_one_insn (struct propagate_block_info *pbi, rtx insn)
|
||||
{
|
||||
rtx prev = PREV_INSN (insn);
|
||||
int flags = pbi->flags;
|
||||
@ -1672,16 +1627,16 @@ propagate_one_insn (pbi, insn)
|
||||
as a whole is not dead, then we want to remove INSN, but
|
||||
not the whole libcall sequence.
|
||||
|
||||
However, we need to also remove the dangling REG_LIBCALL
|
||||
However, we need to also remove the dangling REG_LIBCALL
|
||||
note so that we do not have mis-matched LIBCALL/RETVAL
|
||||
notes. In theory we could find a new location for the
|
||||
REG_RETVAL note, but it hardly seems worth the effort.
|
||||
REG_RETVAL note, but it hardly seems worth the effort.
|
||||
|
||||
NOTE at this point will be the RETVAL note if it exists. */
|
||||
if (note)
|
||||
{
|
||||
rtx libcall_note;
|
||||
|
||||
|
||||
libcall_note
|
||||
= find_reg_note (XEXP (note, 0), REG_LIBCALL, NULL_RTX);
|
||||
remove_note (XEXP (note, 0), libcall_note);
|
||||
@ -1880,10 +1835,8 @@ propagate_one_insn (pbi, insn)
|
||||
the user can use the regsets provided here. */
|
||||
|
||||
struct propagate_block_info *
|
||||
init_propagate_block_info (bb, live, local_set, cond_local_set, flags)
|
||||
basic_block bb;
|
||||
regset live, local_set, cond_local_set;
|
||||
int flags;
|
||||
init_propagate_block_info (basic_block bb, regset live, regset local_set,
|
||||
regset cond_local_set, int flags)
|
||||
{
|
||||
struct propagate_block_info *pbi = xmalloc (sizeof (*pbi));
|
||||
|
||||
@ -2042,8 +1995,7 @@ init_propagate_block_info (bb, live, local_set, cond_local_set, flags)
|
||||
/* Release a propagate_block_info struct. */
|
||||
|
||||
void
|
||||
free_propagate_block_info (pbi)
|
||||
struct propagate_block_info *pbi;
|
||||
free_propagate_block_info (struct propagate_block_info *pbi)
|
||||
{
|
||||
free_EXPR_LIST_list (&pbi->mem_set_list);
|
||||
|
||||
@ -2079,12 +2031,8 @@ free_propagate_block_info (pbi)
|
||||
Return nonzero if an INSN is deleted (i.e. by dead code removal). */
|
||||
|
||||
int
|
||||
propagate_block (bb, live, local_set, cond_local_set, flags)
|
||||
basic_block bb;
|
||||
regset live;
|
||||
regset local_set;
|
||||
regset cond_local_set;
|
||||
int flags;
|
||||
propagate_block (basic_block bb, regset live, regset local_set,
|
||||
regset cond_local_set, int flags)
|
||||
{
|
||||
struct propagate_block_info *pbi;
|
||||
rtx insn, prev;
|
||||
@ -2136,11 +2084,8 @@ propagate_block (bb, live, local_set, cond_local_set, flags)
|
||||
pertaining to the insn. */
|
||||
|
||||
static int
|
||||
insn_dead_p (pbi, x, call_ok, notes)
|
||||
struct propagate_block_info *pbi;
|
||||
rtx x;
|
||||
int call_ok;
|
||||
rtx notes ATTRIBUTE_UNUSED;
|
||||
insn_dead_p (struct propagate_block_info *pbi, rtx x, int call_ok,
|
||||
rtx notes ATTRIBUTE_UNUSED)
|
||||
{
|
||||
enum rtx_code code = GET_CODE (x);
|
||||
|
||||
@ -2333,10 +2278,7 @@ insn_dead_p (pbi, x, call_ok, notes)
|
||||
NOTE is the REG_RETVAL note of the insn. */
|
||||
|
||||
static int
|
||||
libcall_dead_p (pbi, note, insn)
|
||||
struct propagate_block_info *pbi;
|
||||
rtx note;
|
||||
rtx insn;
|
||||
libcall_dead_p (struct propagate_block_info *pbi, rtx note, rtx insn)
|
||||
{
|
||||
rtx x = single_set (insn);
|
||||
|
||||
@ -2390,8 +2332,7 @@ libcall_dead_p (pbi, note, insn)
|
||||
fixed hard registers. */
|
||||
|
||||
int
|
||||
regno_uninitialized (regno)
|
||||
unsigned int regno;
|
||||
regno_uninitialized (unsigned int regno)
|
||||
{
|
||||
if (n_basic_blocks == 0
|
||||
|| (regno < FIRST_PSEUDO_REGISTER
|
||||
@ -2408,8 +2349,7 @@ regno_uninitialized (regno)
|
||||
Such regs may be clobbered by `longjmp'. */
|
||||
|
||||
int
|
||||
regno_clobbered_at_setjmp (regno)
|
||||
int regno;
|
||||
regno_clobbered_at_setjmp (int regno)
|
||||
{
|
||||
if (n_basic_blocks == 0)
|
||||
return 0;
|
||||
@ -2422,9 +2362,7 @@ regno_clobbered_at_setjmp (regno)
|
||||
/* Add MEM to PBI->MEM_SET_LIST. MEM should be canonical. Respect the
|
||||
maximal list size; look for overlaps in mode and select the largest. */
|
||||
static void
|
||||
add_to_mem_set_list (pbi, mem)
|
||||
struct propagate_block_info *pbi;
|
||||
rtx mem;
|
||||
add_to_mem_set_list (struct propagate_block_info *pbi, rtx mem)
|
||||
{
|
||||
rtx i;
|
||||
|
||||
@ -2471,9 +2409,7 @@ add_to_mem_set_list (pbi, mem)
|
||||
to an address change. */
|
||||
|
||||
static int
|
||||
invalidate_mems_from_autoinc (px, data)
|
||||
rtx *px;
|
||||
void *data;
|
||||
invalidate_mems_from_autoinc (rtx *px, void *data)
|
||||
{
|
||||
rtx x = *px;
|
||||
struct propagate_block_info *pbi = data;
|
||||
@ -2490,9 +2426,7 @@ invalidate_mems_from_autoinc (px, data)
|
||||
/* EXP is a REG. Remove any dependent entries from pbi->mem_set_list. */
|
||||
|
||||
static void
|
||||
invalidate_mems_from_set (pbi, exp)
|
||||
struct propagate_block_info *pbi;
|
||||
rtx exp;
|
||||
invalidate_mems_from_set (struct propagate_block_info *pbi, rtx exp)
|
||||
{
|
||||
rtx temp = pbi->mem_set_list;
|
||||
rtx prev = NULL_RTX;
|
||||
@ -2525,9 +2459,7 @@ invalidate_mems_from_set (pbi, exp)
|
||||
FLAGS is the set of operations to perform. */
|
||||
|
||||
static void
|
||||
mark_set_regs (pbi, x, insn)
|
||||
struct propagate_block_info *pbi;
|
||||
rtx x, insn;
|
||||
mark_set_regs (struct propagate_block_info *pbi, rtx x, rtx insn)
|
||||
{
|
||||
rtx cond = NULL_RTX;
|
||||
rtx link;
|
||||
@ -2598,11 +2530,7 @@ mark_set_regs (pbi, x, insn)
|
||||
will be the condition. */
|
||||
|
||||
static void
|
||||
mark_set_1 (pbi, code, reg, cond, insn, flags)
|
||||
struct propagate_block_info *pbi;
|
||||
enum rtx_code code;
|
||||
rtx reg, cond, insn;
|
||||
int flags;
|
||||
mark_set_1 (struct propagate_block_info *pbi, enum rtx_code code, rtx reg, rtx cond, rtx insn, int flags)
|
||||
{
|
||||
int regno_first = -1, regno_last = -1;
|
||||
unsigned long not_dead = 0;
|
||||
@ -2906,10 +2834,7 @@ mark_set_1 (pbi, code, reg, cond, insn, flags)
|
||||
Return true if the register is now unconditionally dead. */
|
||||
|
||||
static int
|
||||
mark_regno_cond_dead (pbi, regno, cond)
|
||||
struct propagate_block_info *pbi;
|
||||
int regno;
|
||||
rtx cond;
|
||||
mark_regno_cond_dead (struct propagate_block_info *pbi, int regno, rtx cond)
|
||||
{
|
||||
/* If this is a store to a predicate register, the value of the
|
||||
predicate is changing, we don't know that the predicate as seen
|
||||
@ -2992,8 +2917,7 @@ mark_regno_cond_dead (pbi, regno, cond)
|
||||
/* Called from splay_tree_delete for pbi->reg_cond_life. */
|
||||
|
||||
static void
|
||||
free_reg_cond_life_info (value)
|
||||
splay_tree_value value;
|
||||
free_reg_cond_life_info (splay_tree_value value)
|
||||
{
|
||||
struct reg_cond_life_info *rcli = (struct reg_cond_life_info *) value;
|
||||
free (rcli);
|
||||
@ -3002,9 +2926,7 @@ free_reg_cond_life_info (value)
|
||||
/* Helper function for flush_reg_cond_reg. */
|
||||
|
||||
static int
|
||||
flush_reg_cond_reg_1 (node, data)
|
||||
splay_tree_node node;
|
||||
void *data;
|
||||
flush_reg_cond_reg_1 (splay_tree_node node, void *data)
|
||||
{
|
||||
struct reg_cond_life_info *rcli;
|
||||
int *xdata = (int *) data;
|
||||
@ -3036,9 +2958,7 @@ flush_reg_cond_reg_1 (node, data)
|
||||
/* Flush all (sub) expressions referring to REGNO from REG_COND_LIVE. */
|
||||
|
||||
static void
|
||||
flush_reg_cond_reg (pbi, regno)
|
||||
struct propagate_block_info *pbi;
|
||||
int regno;
|
||||
flush_reg_cond_reg (struct propagate_block_info *pbi, int regno)
|
||||
{
|
||||
int pair[2];
|
||||
|
||||
@ -3061,9 +2981,7 @@ flush_reg_cond_reg (pbi, regno)
|
||||
ADD. */
|
||||
|
||||
static rtx
|
||||
ior_reg_cond (old, x, add)
|
||||
rtx old, x;
|
||||
int add;
|
||||
ior_reg_cond (rtx old, rtx x, int add)
|
||||
{
|
||||
rtx op0, op1;
|
||||
|
||||
@ -3151,8 +3069,7 @@ ior_reg_cond (old, x, add)
|
||||
}
|
||||
|
||||
static rtx
|
||||
not_reg_cond (x)
|
||||
rtx x;
|
||||
not_reg_cond (rtx x)
|
||||
{
|
||||
enum rtx_code x_code;
|
||||
|
||||
@ -3176,9 +3093,7 @@ not_reg_cond (x)
|
||||
}
|
||||
|
||||
static rtx
|
||||
and_reg_cond (old, x, add)
|
||||
rtx old, x;
|
||||
int add;
|
||||
and_reg_cond (rtx old, rtx x, int add)
|
||||
{
|
||||
rtx op0, op1;
|
||||
|
||||
@ -3271,9 +3186,7 @@ and_reg_cond (old, x, add)
|
||||
is used when the value of REGNO changes. */
|
||||
|
||||
static rtx
|
||||
elim_reg_cond (x, regno)
|
||||
rtx x;
|
||||
unsigned int regno;
|
||||
elim_reg_cond (rtx x, unsigned int regno)
|
||||
{
|
||||
rtx op0, op1;
|
||||
|
||||
@ -3337,9 +3250,8 @@ elim_reg_cond (x, regno)
|
||||
else. */
|
||||
|
||||
static void
|
||||
attempt_auto_inc (pbi, inc, insn, mem, incr, incr_reg)
|
||||
struct propagate_block_info *pbi;
|
||||
rtx inc, insn, mem, incr, incr_reg;
|
||||
attempt_auto_inc (struct propagate_block_info *pbi, rtx inc, rtx insn,
|
||||
rtx mem, rtx incr, rtx incr_reg)
|
||||
{
|
||||
int regno = REGNO (incr_reg);
|
||||
rtx set = single_set (incr);
|
||||
@ -3481,10 +3393,7 @@ attempt_auto_inc (pbi, inc, insn, mem, incr, incr_reg)
|
||||
reference. */
|
||||
|
||||
static void
|
||||
find_auto_inc (pbi, x, insn)
|
||||
struct propagate_block_info *pbi;
|
||||
rtx x;
|
||||
rtx insn;
|
||||
find_auto_inc (struct propagate_block_info *pbi, rtx x, rtx insn)
|
||||
{
|
||||
rtx addr = XEXP (x, 0);
|
||||
HOST_WIDE_INT offset = 0;
|
||||
@ -3573,11 +3482,8 @@ find_auto_inc (pbi, x, insn)
|
||||
#endif /* AUTO_INC_DEC */
|
||||
|
||||
static void
|
||||
mark_used_reg (pbi, reg, cond, insn)
|
||||
struct propagate_block_info *pbi;
|
||||
rtx reg;
|
||||
rtx cond ATTRIBUTE_UNUSED;
|
||||
rtx insn;
|
||||
mark_used_reg (struct propagate_block_info *pbi, rtx reg,
|
||||
rtx cond ATTRIBUTE_UNUSED, rtx insn)
|
||||
{
|
||||
unsigned int regno_first, regno_last, i;
|
||||
int some_was_live, some_was_dead, some_not_set;
|
||||
@ -3765,9 +3671,7 @@ mark_used_reg (pbi, reg, cond, insn)
|
||||
is not called. */
|
||||
|
||||
static void
|
||||
mark_used_regs (pbi, x, cond, insn)
|
||||
struct propagate_block_info *pbi;
|
||||
rtx x, cond, insn;
|
||||
mark_used_regs (struct propagate_block_info *pbi, rtx x, rtx cond, rtx insn)
|
||||
{
|
||||
RTX_CODE code;
|
||||
int regno;
|
||||
@ -4046,9 +3950,7 @@ mark_used_regs (pbi, x, cond, insn)
|
||||
#ifdef AUTO_INC_DEC
|
||||
|
||||
static int
|
||||
try_pre_increment_1 (pbi, insn)
|
||||
struct propagate_block_info *pbi;
|
||||
rtx insn;
|
||||
try_pre_increment_1 (struct propagate_block_info *pbi, rtx insn)
|
||||
{
|
||||
/* Find the next use of this reg. If in same basic block,
|
||||
make it do pre-increment or pre-decrement if appropriate. */
|
||||
@ -4094,9 +3996,7 @@ try_pre_increment_1 (pbi, insn)
|
||||
This checks all about the validity of the result of modifying INSN. */
|
||||
|
||||
static int
|
||||
try_pre_increment (insn, reg, amount)
|
||||
rtx insn, reg;
|
||||
HOST_WIDE_INT amount;
|
||||
try_pre_increment (rtx insn, rtx reg, HOST_WIDE_INT amount)
|
||||
{
|
||||
rtx use;
|
||||
|
||||
@ -4174,10 +4074,7 @@ try_pre_increment (insn, reg, amount)
|
||||
return (rtx) 1. */
|
||||
|
||||
rtx
|
||||
find_use_as_address (x, reg, plusconst)
|
||||
rtx x;
|
||||
rtx reg;
|
||||
HOST_WIDE_INT plusconst;
|
||||
find_use_as_address (rtx x, rtx reg, HOST_WIDE_INT plusconst)
|
||||
{
|
||||
enum rtx_code code = GET_CODE (x);
|
||||
const char * const fmt = GET_RTX_FORMAT (code);
|
||||
@ -4236,9 +4133,7 @@ find_use_as_address (x, reg, plusconst)
|
||||
This is part of making a debugging dump. */
|
||||
|
||||
void
|
||||
dump_regset (r, outf)
|
||||
regset r;
|
||||
FILE *outf;
|
||||
dump_regset (regset r, FILE *outf)
|
||||
{
|
||||
int i;
|
||||
if (r == NULL)
|
||||
@ -4261,8 +4156,7 @@ dump_regset (r, outf)
|
||||
debugger. */
|
||||
|
||||
void
|
||||
debug_regset (r)
|
||||
regset r;
|
||||
debug_regset (regset r)
|
||||
{
|
||||
dump_regset (r, stderr);
|
||||
putc ('\n', stderr);
|
||||
@ -4288,9 +4182,7 @@ debug_regset (r)
|
||||
possibly other information which is used by the register allocators. */
|
||||
|
||||
void
|
||||
recompute_reg_usage (f, loop_step)
|
||||
rtx f ATTRIBUTE_UNUSED;
|
||||
int loop_step ATTRIBUTE_UNUSED;
|
||||
recompute_reg_usage (rtx f ATTRIBUTE_UNUSED, int loop_step ATTRIBUTE_UNUSED)
|
||||
{
|
||||
allocate_reg_life_data ();
|
||||
update_life_info (NULL, UPDATE_LIFE_LOCAL, PROP_REG_INFO);
|
||||
@ -4301,9 +4193,7 @@ recompute_reg_usage (f, loop_step)
|
||||
of the number of registers that died. */
|
||||
|
||||
int
|
||||
count_or_remove_death_notes (blocks, kill)
|
||||
sbitmap blocks;
|
||||
int kill;
|
||||
count_or_remove_death_notes (sbitmap blocks, int kill)
|
||||
{
|
||||
int count = 0;
|
||||
basic_block bb;
|
||||
@ -4369,8 +4259,7 @@ count_or_remove_death_notes (blocks, kill)
|
||||
if blocks is NULL. */
|
||||
|
||||
static void
|
||||
clear_log_links (blocks)
|
||||
sbitmap blocks;
|
||||
clear_log_links (sbitmap blocks)
|
||||
{
|
||||
rtx insn;
|
||||
int i;
|
||||
@ -4399,9 +4288,7 @@ clear_log_links (blocks)
|
||||
with moving single words, but probably isn't worth the trouble. */
|
||||
|
||||
void
|
||||
reg_set_to_hard_reg_set (to, from)
|
||||
HARD_REG_SET *to;
|
||||
bitmap from;
|
||||
reg_set_to_hard_reg_set (HARD_REG_SET *to, bitmap from)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user