Commit 6d8ccdbb by Jeff Law

Bring over changes from latest gcc-2.8 pre-release.

Mirror sched.c change into haifa-sched.c

From-SVN: r17097
parent 7b8dd497
Mon Dec 15 00:04:48 1997 Jeffrey A Law (law@cygnus.com)
* haifa-sched.c (remove_dependencies): Set RTX_INTEGRATED_P on
dependency we delete. Properly update prev for multiple consecutive
deletions.
(priority): Skip deleted dependence.
Fri Dec 12 18:54:23 1997 Per Bothner <bothner@cygnus.com> Fri Dec 12 18:54:23 1997 Per Bothner <bothner@cygnus.com>
* expr.c (expand_builtin): Support BUILT_IN_FMOD - just call fmod. * expr.c (expand_builtin): Support BUILT_IN_FMOD - just call fmod.
......
Fri Dec 12 08:01:44 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> Sun Dec 14 06:49:05 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* Version 2.8.0 released.
* expr.c (expand_expr, case PLACEHOLDER_EXPR): Use placeholder_list
expression in preference to any other if correct type.
* i386.h (INITIAL_ELIMINATION_OFFSET): Correctly test for PIC
register used.
Sat Dec 13 06:11:32 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* frame.h (__register_frame_info_table): Fix typo in declaration.
Fri Dec 12 07:55:18 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* function.c (purge_addressof_1): For (mem (address (mem ...)),
when collapsing, preserve mode of outer MEM.
* frame.c (__register_frame_info): Renamed from __register_frame.
(__register_frame_info_table, __deregister_frame_info): Similarly.
* frame.h (__{,de}register_frame_info): Likewise.
(__register_frame_info_table): New declaration.
* crtstuff.c (__do_global_dtors{,_aux}): Rename __deregister_frame.
(frame_dummy, __do_global_ctors): Likewise for __register_frame.
* collect2.c (write_c_file_{stat,glob}): Rename __register_frame
to __register_frame_info and similarly for __deregister_frame and
__register_frame_table.
* sched.c (remove_dependencies): Set RTX_INTEGRATED_P on dependency
we delete. Properly update prev for multiple consecutive deletions.
(priority): Skip deleted dependence.
* integrate.c (initialize_for_inline): In DECL_RTL of a PARM_DECL, * integrate.c (initialize_for_inline): In DECL_RTL of a PARM_DECL,
look inside a (mem (addressof (mem ...))). look inside a (mem (addressof (mem ...))).
Fri Dec 12 05:49:58 1997 Paul Eggert <eggert@twinsun.com>
* collect2.c (write_c_file_glob):
Allocate initial frame object in static storage and pass its address.
Thu Dec 11 18:01:31 1997 Philippe De Muyter <phdm@macqel.be>
* acconfig.h (NEED_DECLARATION_GETENV): Define slot added.
Thu Dec 11 17:54:23 1997 Paul Eggert <eggert@twinsun.com>
* crtstuff.c (__do_global_ctors): Fix typo in last change.
Wed Dec 10 18:38:28 1997 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> Wed Dec 10 18:38:28 1997 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* libgcc2.c (__bb_exit_func): Fix test of return value of fopen. * libgcc2.c (__bb_exit_func): Fix test of return value of fopen.
......
...@@ -164,7 +164,7 @@ and includes all the necessary compilation tools and libraries. ...@@ -164,7 +164,7 @@ and includes all the necessary compilation tools and libraries.
`--nfp' currently has no effect, though perhaps there are `--nfp' currently has no effect, though perhaps there are
other systems where it could usefully make a difference. other systems where it could usefully make a difference.
`--enable-objcthreads=TYPE' `--enable-threads=TYPE'
Certain systems, notably Linux-based GNU systems, can't be Certain systems, notably Linux-based GNU systems, can't be
relied on to supply a threads facility for the Objective C relied on to supply a threads facility for the Objective C
runtime and so will default to single-threaded runtime. They runtime and so will default to single-threaded runtime. They
......
...@@ -693,8 +693,7 @@ My rate varies greatly between $25-$40/hour, depending on the circumstances. ...@@ -693,8 +693,7 @@ My rate varies greatly between $25-$40/hour, depending on the circumstances.
Rates for non-profit organizations are substantially lower, and possibly free. Rates for non-profit organizations are substantially lower, and possibly free.
Please note that I have no interest in working with any Micro$oft related Please note that I have no interest in working with any Micro$oft related
products. I will accept work that involves other non-free, non-Micro$oft products! I want the primary focus of my work to be contributing
software, but I would want the primary focus of the work to be contributing
to the free software community. to the free software community.
Updated: 1997-12-04 Updated: 1997-12-04
......
...@@ -18,4 +18,7 @@ ...@@ -18,4 +18,7 @@
/* Whether rindex must be declared even if <stdlib.h> is included. */ /* Whether rindex must be declared even if <stdlib.h> is included. */
#undef NEED_DECLARATION_RINDEX #undef NEED_DECLARATION_RINDEX
/* Whether getenv must be declared even if <stdlib.h> is included. */
#undef NEED_DECLARATION_GETENV
@TOP@ @TOP@
...@@ -1790,16 +1790,16 @@ write_c_file_stat (stream, name) ...@@ -1790,16 +1790,16 @@ write_c_file_stat (stream, name)
fprintf (stream, " struct object *next;\n"); fprintf (stream, " struct object *next;\n");
fprintf (stream, "};\n"); fprintf (stream, "};\n");
fprintf (stream, "extern void __register_frame_table (void *, struct object *);\n"); fprintf (stream, "extern void __register_frame_info_table (void *, struct object *);\n");
fprintf (stream, "extern void __deregister_frame (void *);\n"); fprintf (stream, "extern void __deregister_frame_info (void *);\n");
fprintf (stream, "static void reg_frame () {\n"); fprintf (stream, "static void reg_frame () {\n");
fprintf (stream, "\tstatic struct object ob;\n"); fprintf (stream, "\tstatic struct object ob;\n");
fprintf (stream, "\t__register_frame_table (frame_table, &ob);\n"); fprintf (stream, "\t__register_frame_info_table (frame_table, &ob);\n");
fprintf (stream, "\t}\n"); fprintf (stream, "\t}\n");
fprintf (stream, "static void dereg_frame () {\n"); fprintf (stream, "static void dereg_frame () {\n");
fprintf (stream, "\t__deregister_frame (frame_table);\n"); fprintf (stream, "\t__deregister_frame_info (frame_table);\n");
fprintf (stream, "\t}\n"); fprintf (stream, "\t}\n");
} }
...@@ -1876,16 +1876,16 @@ write_c_file_glob (stream, name) ...@@ -1876,16 +1876,16 @@ write_c_file_glob (stream, name)
fprintf (stream, " struct object *next;\n"); fprintf (stream, " struct object *next;\n");
fprintf (stream, "};\n"); fprintf (stream, "};\n");
fprintf (stream, "extern void __register_frame_table (void *, struct object *);\n"); fprintf (stream, "extern void __register_frame_info_table (void *, struct object *);\n");
fprintf (stream, "extern void __deregister_frame (void *);\n"); fprintf (stream, "extern void __deregister_frame_info (void *);\n");
fprintf (stream, "static void reg_frame () {\n"); fprintf (stream, "static void reg_frame () {\n");
fprintf (stream, "\tstatic struct object ob;\n"); fprintf (stream, "\tstatic struct object ob;\n");
fprintf (stream, "\t__register_frame_table (frame_table, &ob);\n"); fprintf (stream, "\t__register_frame_info_table (frame_table, &ob);\n");
fprintf (stream, "\t}\n"); fprintf (stream, "\t}\n");
fprintf (stream, "static void dereg_frame () {\n"); fprintf (stream, "static void dereg_frame () {\n");
fprintf (stream, "\t__deregister_frame (frame_table);\n"); fprintf (stream, "\t__deregister_frame_info (frame_table);\n");
fprintf (stream, "\t}\n"); fprintf (stream, "\t}\n");
} }
......
...@@ -20,6 +20,9 @@ ...@@ -20,6 +20,9 @@
/* Whether rindex must be declared even if <stdlib.h> is included. */ /* Whether rindex must be declared even if <stdlib.h> is included. */
#undef NEED_DECLARATION_RINDEX #undef NEED_DECLARATION_RINDEX
/* Whether getenv must be declared even if <stdlib.h> is included. */
#undef NEED_DECLARATION_GETENV
/* Define if you have the ANSI C header files. */ /* Define if you have the ANSI C header files. */
#undef STDC_HEADERS #undef STDC_HEADERS
......
...@@ -1524,8 +1524,9 @@ do { \ ...@@ -1524,8 +1524,9 @@ do { \
\ \
for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++) \ for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++) \
if ((regs_ever_live[regno] && ! call_used_regs[regno]) \ if ((regs_ever_live[regno] && ! call_used_regs[regno]) \
|| (current_function_uses_pic_offset_table \ || ((current_function_uses_pic_offset_table \
&& regno == PIC_OFFSET_TABLE_REGNUM)) \ || current_function_uses_const_pool) \
&& flag_pic && regno == PIC_OFFSET_TABLE_REGNUM)) \
offset += 4; \ offset += 4; \
\ \
(OFFSET) = offset + get_frame_size (); \ (OFFSET) = offset + get_frame_size (); \
......
...@@ -142,7 +142,7 @@ __do_global_dtors_aux () ...@@ -142,7 +142,7 @@ __do_global_dtors_aux ()
} }
#ifdef EH_FRAME_SECTION_ASM_OP #ifdef EH_FRAME_SECTION_ASM_OP
__deregister_frame (__EH_FRAME_BEGIN__); __deregister_frame_info (__EH_FRAME_BEGIN__);
#endif #endif
completed = 1; completed = 1;
} }
...@@ -162,15 +162,15 @@ fini_dummy () ...@@ -162,15 +162,15 @@ fini_dummy ()
} }
#ifdef EH_FRAME_SECTION_ASM_OP #ifdef EH_FRAME_SECTION_ASM_OP
/* Stick a call to __register_frame into the .init section. For some reason /* Stick a call to __register_frame_info into the .init section. For some
calls with no arguments work more reliably in .init, so stick the call reason calls with no arguments work more reliably in .init, so stick the
in another function. */ call in another function. */
static void static void
frame_dummy () frame_dummy ()
{ {
static struct object object; static struct object object;
__register_frame (__EH_FRAME_BEGIN__, &object); __register_frame_info (__EH_FRAME_BEGIN__, &object);
} }
static void static void
...@@ -254,7 +254,7 @@ __do_global_dtors () ...@@ -254,7 +254,7 @@ __do_global_dtors ()
(*p) (); (*p) ();
#ifdef EH_FRAME_SECTION_ASM_OP #ifdef EH_FRAME_SECTION_ASM_OP
__deregister_frame (__EH_FRAME_BEGIN__); __deregister_frame_info (__EH_FRAME_BEGIN__);
#endif #endif
} }
#endif #endif
...@@ -395,7 +395,7 @@ __do_global_ctors () ...@@ -395,7 +395,7 @@ __do_global_ctors ()
func_ptr *p; func_ptr *p;
#ifdef EH_FRAME_SECTION_ASM_OP #ifdef EH_FRAME_SECTION_ASM_OP
static struct object object; static struct object object;
__register_frame (__EH_FRAME_BEGIN__, &object); __register_frame_info (__EH_FRAME_BEGIN__, &object);
#endif #endif
for (p = __CTOR_END__ - 1; *p != (func_ptr) -1; p--) for (p = __CTOR_END__ - 1; *p != (func_ptr) -1; p--)
(*p) (); (*p) ();
......
...@@ -97,9 +97,9 @@ Boston, MA 02111-1307, USA. */ ...@@ -97,9 +97,9 @@ Boston, MA 02111-1307, USA. */
On targets that support crtstuff.c, the unwind information On targets that support crtstuff.c, the unwind information
is stored in a section named .eh_frame and the information for the is stored in a section named .eh_frame and the information for the
entire shared object or program is registered with a call to entire shared object or program is registered with a call to
__register_frame. On other targets, the information for each __register_frame_info. On other targets, the information for each
translation unit is registered from the file generated by collect2. translation unit is registered from the file generated by collect2.
__register_frame is defined in frame.c, and is responsible for __register_frame_info is defined in frame.c, and is responsible for
recording all of the unwind regions into one list (which is kept in a recording all of the unwind regions into one list (which is kept in a
static variable named unwind_table_list). static variable named unwind_table_list).
......
...@@ -5293,7 +5293,7 @@ expand_expr (exp, target, tmode, modifier) ...@@ -5293,7 +5293,7 @@ expand_expr (exp, target, tmode, modifier)
tree placeholder_expr; tree placeholder_expr;
/* If there is an object on the head of the placeholder list, /* If there is an object on the head of the placeholder list,
see if some object in it's references is of type TYPE. For see if some object in its references is of type TYPE. For
further information, see tree.def. */ further information, see tree.def. */
for (placeholder_expr = placeholder_list; for (placeholder_expr = placeholder_list;
placeholder_expr != 0; placeholder_expr != 0;
...@@ -5310,9 +5310,9 @@ expand_expr (exp, target, tmode, modifier) ...@@ -5310,9 +5310,9 @@ expand_expr (exp, target, tmode, modifier)
== need_type)) == need_type))
object = TREE_PURPOSE (placeholder_expr); object = TREE_PURPOSE (placeholder_expr);
/* Find the innermost reference that is of the type we want. */ /* Find the outermost reference that is of the type we want. */
for (elt = TREE_PURPOSE (placeholder_expr); for (elt = TREE_PURPOSE (placeholder_expr);
elt != 0 elt != 0 && object == 0
&& (TREE_CODE_CLASS (TREE_CODE (elt)) == 'r' && (TREE_CODE_CLASS (TREE_CODE (elt)) == 'r'
|| TREE_CODE_CLASS (TREE_CODE (elt)) == '1' || TREE_CODE_CLASS (TREE_CODE (elt)) == '1'
|| TREE_CODE_CLASS (TREE_CODE (elt)) == '2' || TREE_CODE_CLASS (TREE_CODE (elt)) == '2'
...@@ -5323,10 +5323,7 @@ expand_expr (exp, target, tmode, modifier) ...@@ -5323,10 +5323,7 @@ expand_expr (exp, target, tmode, modifier)
if (TREE_CODE_CLASS (TREE_CODE (elt)) == 'r' if (TREE_CODE_CLASS (TREE_CODE (elt)) == 'r'
&& (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (elt, 0))) && (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (elt, 0)))
== need_type)) == need_type))
{ object = TREE_OPERAND (elt, 0);
object = TREE_OPERAND (elt, 0);
break;
}
if (object != 0) if (object != 0)
{ {
......
...@@ -512,7 +512,7 @@ execute_cfa_insn (void *p, struct frame_state_internal *state, ...@@ -512,7 +512,7 @@ execute_cfa_insn (void *p, struct frame_state_internal *state,
/* Called from crtbegin.o to register the unwind info for an object. */ /* Called from crtbegin.o to register the unwind info for an object. */
void void
__register_frame (void *begin, struct object *ob) __register_frame_info (void *begin, struct object *ob)
{ {
ob->fde_begin = begin; ob->fde_begin = begin;
...@@ -533,7 +533,7 @@ __register_frame (void *begin, struct object *ob) ...@@ -533,7 +533,7 @@ __register_frame (void *begin, struct object *ob)
collect2. */ collect2. */
void void
__register_frame_table (void *begin, struct object *ob) __register_frame_info_table (void *begin, struct object *ob)
{ {
ob->fde_begin = begin; ob->fde_begin = begin;
ob->fde_array = begin; ob->fde_array = begin;
...@@ -552,7 +552,7 @@ __register_frame_table (void *begin, struct object *ob) ...@@ -552,7 +552,7 @@ __register_frame_table (void *begin, struct object *ob)
/* Called from crtend.o to deregister the unwind info for an object. */ /* Called from crtend.o to deregister the unwind info for an object. */
void void
__deregister_frame (void *begin) __deregister_frame_info (void *begin)
{ {
struct object **p; struct object **p;
......
...@@ -37,11 +37,16 @@ struct object { ...@@ -37,11 +37,16 @@ struct object {
/* Called either from crtbegin.o or a static constructor to register the /* Called either from crtbegin.o or a static constructor to register the
unwind info for an object or translation unit, respectively. */ unwind info for an object or translation unit, respectively. */
extern void __register_frame (void *, struct object *); extern void __register_frame_info (void *, struct object *);
/* Similar, but BEGIN is actually a pointer to a table of unwind entries
for different translation units. Called from the file generated by
collect2. */
extern void __register_frame_info_table (void *, struct object *);
/* Called from crtend.o to deregister the unwind info for an object. */ /* Called from crtend.o to deregister the unwind info for an object. */
extern void __deregister_frame (void *); extern void __deregister_frame_info (void *);
/* Called from __throw to find the registers to restore for a given /* Called from __throw to find the registers to restore for a given
PC_TARGET. The caller should allocate a local variable of `struct PC_TARGET. The caller should allocate a local variable of `struct
......
...@@ -2739,8 +2739,8 @@ purge_addressof_1 (loc, insn, force) ...@@ -2739,8 +2739,8 @@ purge_addressof_1 (loc, insn, force)
else if (code == MEM && GET_CODE (XEXP (x, 0)) == ADDRESSOF && ! force) else if (code == MEM && GET_CODE (XEXP (x, 0)) == ADDRESSOF && ! force)
{ {
rtx sub = XEXP (XEXP (x, 0), 0); rtx sub = XEXP (XEXP (x, 0), 0);
if (GET_CODE (sub) != REG) if (GET_CODE (sub) == MEM)
sub = copy_rtx (sub); sub = gen_rtx (MEM, GET_MODE (x), copy_rtx (XEXP (sub, 0)));
if (GET_CODE (sub) == REG && GET_MODE (x) != GET_MODE (sub)) if (GET_CODE (sub) == REG && GET_MODE (x) != GET_MODE (sub))
{ {
if (! BYTES_BIG_ENDIAN && ! WORDS_BIG_ENDIAN) if (! BYTES_BIG_ENDIAN && ! WORDS_BIG_ENDIAN)
......
...@@ -884,17 +884,19 @@ remove_dependence (insn, elem) ...@@ -884,17 +884,19 @@ remove_dependence (insn, elem)
rtx prev, link; rtx prev, link;
int found = 0; int found = 0;
for (prev = 0, link = LOG_LINKS (insn); link; for (prev = 0, link = LOG_LINKS (insn); link; link = XEXP (link, 1))
prev = link, link = XEXP (link, 1))
{ {
if (XEXP (link, 0) == elem) if (XEXP (link, 0) == elem)
{ {
RTX_INTEGRATED_P (link) = 1;
if (prev) if (prev)
XEXP (prev, 1) = XEXP (link, 1); XEXP (prev, 1) = XEXP (link, 1);
else else
LOG_LINKS (insn) = XEXP (link, 1); LOG_LINKS (insn) = XEXP (link, 1);
found = 1; found = 1;
} }
else
prev = link;
} }
if (!found) if (!found)
...@@ -3210,6 +3212,9 @@ priority (insn) ...@@ -3210,6 +3212,9 @@ priority (insn)
rtx next; rtx next;
int next_priority; int next_priority;
if (RTX_INTEGRATED_P (link))
continue;
next = XEXP (link, 0); next = XEXP (link, 0);
/* critical path is meaningful in block boundaries only */ /* critical path is meaningful in block boundaries only */
......
...@@ -191,7 +191,7 @@ will print out whether the Haifa scheduler is enabled when it is run. ...@@ -191,7 +191,7 @@ will print out whether the Haifa scheduler is enabled when it is run.
@cindex Objective C threads @cindex Objective C threads
@cindex threads, Objective C @cindex threads, Objective C
@item --enable-objcthreads=@var{type} @item --enable-threads=@var{type}
Certain systems, notably Linux-based GNU systems, can't be relied on to Certain systems, notably Linux-based GNU systems, can't be relied on to
supply a threads facility for the Objective C runtime and so will supply a threads facility for the Objective C runtime and so will
default to single-threaded runtime. They may, however, have a library default to single-threaded runtime. They may, however, have a library
......
...@@ -236,7 +236,7 @@ extern int _spawnvp (); ...@@ -236,7 +236,7 @@ extern int _spawnvp ();
/* This is a kludge to get around the Microsoft C spawn functions' propensity /* This is a kludge to get around the Microsoft C spawn functions' propensity
to remove the outermost set of double quotes from all arguments. */ to remove the outermost set of double quotes from all arguments. */
const char * const * char * const *
fix_argv (argvec) fix_argv (argvec)
char **argvec; char **argvec;
{ {
...@@ -267,7 +267,7 @@ fix_argv (argvec) ...@@ -267,7 +267,7 @@ fix_argv (argvec)
argvec[i] = temp; argvec[i] = temp;
} }
return (const char * const *) argvec; return (char * const *) argvec;
} }
#endif /* ! defined (__CYGWIN32__) */ #endif /* ! defined (__CYGWIN32__) */
...@@ -278,7 +278,8 @@ pexecute (program, argv, this_pname, temp_base, errmsg_fmt, errmsg_arg, flags) ...@@ -278,7 +278,8 @@ pexecute (program, argv, this_pname, temp_base, errmsg_fmt, errmsg_arg, flags)
char * const *argv; char * const *argv;
const char *this_pname; const char *this_pname;
const char *temp_base; const char *temp_base;
char **errmsg_fmt, **errmsg_arg; char **errmsg_fmt;
const char **errmsg_arg;
int flags; int flags;
{ {
int pid; int pid;
...@@ -286,7 +287,7 @@ pexecute (program, argv, this_pname, temp_base, errmsg_fmt, errmsg_arg, flags) ...@@ -286,7 +287,7 @@ pexecute (program, argv, this_pname, temp_base, errmsg_fmt, errmsg_arg, flags)
if ((flags & PEXECUTE_ONE) != PEXECUTE_ONE) if ((flags & PEXECUTE_ONE) != PEXECUTE_ONE)
abort (); abort ();
pid = (flags & PEXECUTE_SEARCH ? _spawnvp : _spawnv) pid = (flags & PEXECUTE_SEARCH ? _spawnvp : _spawnv)
(_P_NOWAIT, program, fix_argv(argv)); (_P_NOWAIT, program, fix_argv (argv));
if (pid == -1) if (pid == -1)
{ {
*errmsg_fmt = install_error_msg; *errmsg_fmt = install_error_msg;
......
...@@ -431,17 +431,19 @@ remove_dependence (insn, elem) ...@@ -431,17 +431,19 @@ remove_dependence (insn, elem)
rtx prev, link; rtx prev, link;
int found = 0; int found = 0;
for (prev = 0, link = LOG_LINKS (insn); link; for (prev = 0, link = LOG_LINKS (insn); link; link = XEXP (link, 1))
prev = link, link = XEXP (link, 1))
{ {
if (XEXP (link, 0) == elem) if (XEXP (link, 0) == elem)
{ {
RTX_INTEGRATED_P (link) = 1;
if (prev) if (prev)
XEXP (prev, 1) = XEXP (link, 1); XEXP (prev, 1) = XEXP (link, 1);
else else
LOG_LINKS (insn) = XEXP (link, 1); LOG_LINKS (insn) = XEXP (link, 1);
found = 1; found = 1;
} }
else
prev = link;
} }
if (! found) if (! found)
...@@ -919,6 +921,11 @@ priority (insn) ...@@ -919,6 +921,11 @@ priority (insn)
{ {
rtx x = XEXP (prev, 0); rtx x = XEXP (prev, 0);
/* If this was a duplicate of a dependence we already deleted,
ignore it. */
if (RTX_INTEGRATED_P (prev))
continue;
/* A dependence pointing to a note or deleted insn is always /* A dependence pointing to a note or deleted insn is always
obsolete, because sched_analyze_insn will have created any obsolete, because sched_analyze_insn will have created any
necessary new dependences which replace it. Notes and deleted necessary new dependences which replace it. Notes and deleted
......
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