From 7b5efe21a0624c7340186c58df5ab3b722eafa91 Mon Sep 17 00:00:00 2001
From: Jeffrey A Law <law@cygnus.com>
Date: Tue, 24 Aug 1999 03:28:57 +0000
Subject: [PATCH] configure.in: Remove code to select/de-select the haifa
 scheduler.

        * configure.in: Remove code to select/de-select the haifa
        scheduler.  Every scheduled port gets haifa now.
        * configure: Rebuilt.
        * flags.h, genattrtab.c, rtl.h, toplev.c: Remove HAIFA ifdefs.
        * sched.c Deleted.
        * Makefile.in: Corresponding changes.

From-SVN: r28809
---
 gcc/ChangeLog    |    9 +
 gcc/Makefile.in  |    9 +-
 gcc/configure    |  444 +++--
 gcc/configure.in |   34 -
 gcc/flags.h      |    2 -
 gcc/genattrtab.c |   18 -
 gcc/rtl.h        |    2 -
 gcc/sched.c      | 4480 ----------------------------------------------
 gcc/toplev.c     |    8 +-
 9 files changed, 214 insertions(+), 4792 deletions(-)
 delete mode 100644 gcc/sched.c

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7d0ed0b8b7e8..0b58e4d81232 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+Mon Aug 23 21:23:24 1999  Jeffrey A Law  (law@cygnus.com)
+
+	* configure.in: Remove code to select/de-select the haifa
+	scheduler.  Every scheduled port gets haifa now.
+	* configure: Rebuilt.
+	* flags.h, genattrtab.c, rtl.h, toplev.c: Remove HAIFA ifdefs.
+	* sched.c Deleted.
+	* Makefile.in: Corresponding changes.
+
 Mon Aug 23 16:04:13 1999  Bernd Schmidt  <bernds@cygnus.co.uk>
 
 	* optabs.c (prepare_cmp_insn): Turn COMPARISON arg into a pointer.
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index baee1a65d811..a5cc9decdd14 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -533,7 +533,7 @@ all: all.indirect
 all.indirect: $(ALL)
 
 # IN_GCC tells various files that system.h, toplev.c, etc are available.
-INTERNAL_CFLAGS = $(CROSS) -DIN_GCC $(SCHED_CFLAGS) @extra_c_flags@
+INTERNAL_CFLAGS = $(CROSS) -DIN_GCC @extra_c_flags@
 
 # This is the variable actually used when we compile.
 # If you change this line, you probably also need to change the definition
@@ -657,9 +657,6 @@ C_AND_OBJC_OBJS = c-lex.o c-pragma.o c-decl.o c-typeck.o c-convert.o \
 # Language-specific object files for C.
 C_OBJS = c-parse.o c-lang.o $(C_AND_OBJC_OBJS)
 
-SCHED_PREFIX = @sched_prefix@
-SCHED_CFLAGS = @sched_cflags@
-
 # Language-independent object files.
 OBJS = toplev.o version.o tree.o print-tree.o stor-layout.o fold-const.o \
  function.o stmt.o except.o expr.o calls.o expmed.o explow.o optabs.o real.o \
@@ -667,7 +664,7 @@ OBJS = toplev.o version.o tree.o print-tree.o stor-layout.o fold-const.o \
  dbxout.o sdbout.o dwarfout.o dwarf2out.o xcoffout.o bitmap.o alias.o gcse.o \
  integrate.o jump.o cse.o loop.o unroll.o flow.o stupid.o combine.o varray.o \
  regclass.o regmove.o local-alloc.o global.o reload.o reload1.o caller-save.o \
- insn-peep.o reorg.o $(SCHED_PREFIX)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 \
  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
@@ -1569,7 +1566,7 @@ alias.o : alias.c $(CONFIG_H) system.h $(RTL_H) flags.h hard-reg-set.h \
 regmove.o : regmove.c $(CONFIG_H) system.h $(RTL_H) insn-config.h \
    $(RECOG_H) output.h reload.h $(REGS_H) hard-reg-set.h flags.h function.h \
    $(EXPR_H) insn-flags.h $(BASIC_BLOCK_H) toplev.h
-$(SCHED_PREFIX)sched.o : $(SCHED_PREFIX)sched.c $(CONFIG_H) system.h $(RTL_H) \
+haifa-sched.o : haifa-sched.c $(CONFIG_H) system.h $(RTL_H) \
    $(BASIC_BLOCK_H) $(REGS_H) hard-reg-set.h flags.h insn-config.h function.h \
    insn-attr.h toplev.h recog.h
 final.o : final.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h intl.h \
diff --git a/gcc/configure b/gcc/configure
index efd79fcc1b70..694b5b93818c 100755
--- a/gcc/configure
+++ b/gcc/configure
@@ -47,10 +47,6 @@ ac_help="$ac_help
   --disable-fast-fixincludes
                          Disable the new fast fixincludes.
                          Run the old fixincludes script unconditionally"
-ac_help="$ac_help
-  --enable-haifa          use the experimental scheduler.
-  --disable-haifa         don't use the experimental scheduler for the
-                          targets which normally enable it."
 ac_help="$ac_help
   --enable-threads        enable thread usage for target GCC.
   --enable-threads=LIB    use LIB thread package for target GCC."
@@ -601,7 +597,7 @@ copy=cp
 # - two terminals occur directly after each other
 # - the path contains an element with a dot in it
 echo $ac_n "checking LIBRARY_PATH variable""... $ac_c" 1>&6
-echo "configure:605: checking LIBRARY_PATH variable" >&5
+echo "configure:601: checking LIBRARY_PATH variable" >&5
 case ${LIBRARY_PATH} in
   [:\;]* | *[:\;] | *[:\;][:\;]* |  *[:\;]. | .[:\;]*| . | *[:\;].[:\;]* )
     library_path_setting="contains current directory"
@@ -626,7 +622,7 @@ fi
 # - two terminals occur directly after each other
 # - the path contains an element with a dot in it
 echo $ac_n "checking GCC_EXEC_PREFIX variable""... $ac_c" 1>&6
-echo "configure:630: checking GCC_EXEC_PREFIX variable" >&5
+echo "configure:626: checking GCC_EXEC_PREFIX variable" >&5
 case ${GCC_EXEC_PREFIX} in
   [:\;]* | *[:\;] | *[:\;][:\;]* |  *[:\;]. | .[:\;]*| . | *[:\;].[:\;]* )
     gcc_exec_prefix_setting="contains current directory"
@@ -844,14 +840,6 @@ fi
 fi
 
 
-# Enable Haifa scheduler.
-# Check whether --enable-haifa or --disable-haifa was given.
-if test "${enable_haifa+set}" = set; then
-  enableval="$enable_haifa"
-  :
-fi
-
-
 # Enable threads
 # Pass with no value to take the default
 # Pass with a value to specify a thread package
@@ -957,7 +945,7 @@ else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
 fi
 
 echo $ac_n "checking host system type""... $ac_c" 1>&6
-echo "configure:961: checking host system type" >&5
+echo "configure:949: checking host system type" >&5
 
 host_alias=$host
 case "$host_alias" in
@@ -978,7 +966,7 @@ host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
 echo "$ac_t""$host" 1>&6
 
 echo $ac_n "checking target system type""... $ac_c" 1>&6
-echo "configure:982: checking target system type" >&5
+echo "configure:970: checking target system type" >&5
 
 target_alias=$target
 case "$target_alias" in
@@ -996,7 +984,7 @@ target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
 echo "$ac_t""$target" 1>&6
 
 echo $ac_n "checking build system type""... $ac_c" 1>&6
-echo "configure:1000: checking build system type" >&5
+echo "configure:988: checking build system type" >&5
 
 build_alias=$build
 case "$build_alias" in
@@ -1023,7 +1011,7 @@ test "$host_alias" != "$target_alias" &&
 # Extract the first word of "gcc", so it can be a program name with args.
 set dummy gcc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1027: checking for $ac_word" >&5
+echo "configure:1015: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1053,7 +1041,7 @@ if test -z "$CC"; then
   # Extract the first word of "cc", so it can be a program name with args.
 set dummy cc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1057: checking for $ac_word" >&5
+echo "configure:1045: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1104,7 +1092,7 @@ fi
       # Extract the first word of "cl", so it can be a program name with args.
 set dummy cl; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1108: checking for $ac_word" >&5
+echo "configure:1096: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1136,7 +1124,7 @@ fi
 fi
 
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:1140: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+echo "configure:1128: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
 
 ac_ext=c
 # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
@@ -1147,12 +1135,12 @@ cross_compiling=$ac_cv_prog_cc_cross
 
 cat > conftest.$ac_ext << EOF
 
-#line 1151 "configure"
+#line 1139 "configure"
 #include "confdefs.h"
 
 main(){return(0);}
 EOF
-if { (eval echo configure:1156: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1144: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   ac_cv_prog_cc_works=yes
   # If we can't run a trivial program, we are probably using a cross compiler.
   if (./conftest; exit) 2>/dev/null; then
@@ -1178,12 +1166,12 @@ if test $ac_cv_prog_cc_works = no; then
   { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
 fi
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:1182: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "configure:1170: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
 cross_compiling=$ac_cv_prog_cc_cross
 
 echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:1187: checking whether we are using GNU C" >&5
+echo "configure:1175: checking whether we are using GNU C" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1192,7 +1180,7 @@ else
   yes;
 #endif
 EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1196: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1184: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
   ac_cv_prog_gcc=yes
 else
   ac_cv_prog_gcc=no
@@ -1211,7 +1199,7 @@ ac_test_CFLAGS="${CFLAGS+set}"
 ac_save_CFLAGS="$CFLAGS"
 CFLAGS=
 echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:1215: checking whether ${CC-cc} accepts -g" >&5
+echo "configure:1203: checking whether ${CC-cc} accepts -g" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1254,7 +1242,7 @@ fi
 
 
 echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:1258: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo "configure:1246: checking whether ${MAKE-make} sets \${MAKE}" >&5
 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1282,7 +1270,7 @@ fi
 
 
 echo $ac_n "checking whether a default assembler was specified""... $ac_c" 1>&6
-echo "configure:1286: checking whether a default assembler was specified" >&5
+echo "configure:1274: checking whether a default assembler was specified" >&5
 if test x"${DEFAULT_ASSEMBLER+set}" = x"set"; then
     if test x"$gas_flag" = x"no"; then
     	echo "$ac_t""yes ($DEFAULT_ASSEMBLER)" 1>&6
@@ -1294,7 +1282,7 @@ else
 fi
 
 echo $ac_n "checking whether a default linker was specified""... $ac_c" 1>&6
-echo "configure:1298: checking whether a default linker was specified" >&5
+echo "configure:1286: checking whether a default linker was specified" >&5
 if test x"${DEFAULT_LINKER+set}" = x"set"; then
     if test x"$gnu_ld_flag" = x"no"; then
 	echo "$ac_t""yes ($DEFAULT_LINKER)" 1>&6
@@ -1311,7 +1299,7 @@ do
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1315: checking for $ac_word" >&5
+echo "configure:1303: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_AWK'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1343,7 +1331,7 @@ done
 # Extract the first word of "flex", so it can be a program name with args.
 set dummy flex; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1347: checking for $ac_word" >&5
+echo "configure:1335: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_LEX'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1377,7 +1365,7 @@ then
   *) ac_lib=l ;;
   esac
   echo $ac_n "checking for yywrap in -l$ac_lib""... $ac_c" 1>&6
-echo "configure:1381: checking for yywrap in -l$ac_lib" >&5
+echo "configure:1369: checking for yywrap in -l$ac_lib" >&5
 ac_lib_var=`echo $ac_lib'_'yywrap | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1385,7 +1373,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-l$ac_lib  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1389 "configure"
+#line 1377 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1396,7 +1384,7 @@ int main() {
 yywrap()
 ; return 0; }
 EOF
-if { (eval echo configure:1400: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1388: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1419,7 +1407,7 @@ fi
 fi
 
 echo $ac_n "checking whether ln works""... $ac_c" 1>&6
-echo "configure:1423: checking whether ln works" >&5
+echo "configure:1411: checking whether ln works" >&5
 if eval "test \"`echo '$''{'gcc_cv_prog_LN'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1451,7 +1439,7 @@ else
 fi
 
 echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
-echo "configure:1455: checking whether ln -s works" >&5
+echo "configure:1443: checking whether ln -s works" >&5
 if eval "test \"`echo '$''{'gcc_cv_prog_LN_S'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1483,19 +1471,19 @@ else
 fi
 
 echo $ac_n "checking for volatile""... $ac_c" 1>&6
-echo "configure:1487: checking for volatile" >&5
+echo "configure:1475: checking for volatile" >&5
 if eval "test \"`echo '$''{'gcc_cv_c_volatile'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1492 "configure"
+#line 1480 "configure"
 #include "confdefs.h"
 
 int main() {
 volatile int foo;
 ; return 0; }
 EOF
-if { (eval echo configure:1499: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1487: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   gcc_cv_c_volatile=yes
 else
@@ -1518,7 +1506,7 @@ fi
 # Extract the first word of "ranlib", so it can be a program name with args.
 set dummy ranlib; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1522: checking for $ac_word" >&5
+echo "configure:1510: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1550,7 +1538,7 @@ do
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1554: checking for $ac_word" >&5
+echo "configure:1542: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_YACC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1591,7 +1579,7 @@ test -n "$YACC" || YACC="yacc"
 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
 # ./install, which can be erroneously created by make from ./install.sh.
 echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:1595: checking for a BSD compatible install" >&5
+echo "configure:1583: checking for a BSD compatible install" >&5
 if test -z "$INSTALL"; then
 if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1642,7 +1630,7 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
 
 
 echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:1646: checking how to run the C preprocessor" >&5
+echo "configure:1634: checking how to run the C preprocessor" >&5
 # On Suns, sometimes $CPP names a directory.
 if test -n "$CPP" && test -d "$CPP"; then
   CPP=
@@ -1657,13 +1645,13 @@ else
   # On the NeXT, cc -E runs the code through the compiler's parser,
   # not just through cpp.
   cat > conftest.$ac_ext <<EOF
-#line 1661 "configure"
+#line 1649 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1667: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1655: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   :
@@ -1674,13 +1662,13 @@ else
   rm -rf conftest*
   CPP="${CC-cc} -E -traditional-cpp"
   cat > conftest.$ac_ext <<EOF
-#line 1678 "configure"
+#line 1666 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1684: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1672: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   :
@@ -1691,13 +1679,13 @@ else
   rm -rf conftest*
   CPP="${CC-cc} -nologo -E"
   cat > conftest.$ac_ext <<EOF
-#line 1695 "configure"
+#line 1683 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1701: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1689: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   :
@@ -1722,12 +1710,12 @@ fi
 echo "$ac_t""$CPP" 1>&6
 
 echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:1726: checking for ANSI C header files" >&5
+echo "configure:1714: checking for ANSI C header files" >&5
 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1731 "configure"
+#line 1719 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 #include <stdarg.h>
@@ -1735,7 +1723,7 @@ else
 #include <float.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1739: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1727: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -1752,7 +1740,7 @@ rm -f conftest*
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 1756 "configure"
+#line 1744 "configure"
 #include "confdefs.h"
 #include <string.h>
 EOF
@@ -1770,7 +1758,7 @@ fi
 if test $ac_cv_header_stdc = yes; then
   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 1774 "configure"
+#line 1762 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 EOF
@@ -1791,7 +1779,7 @@ if test "$cross_compiling" = yes; then
   :
 else
   cat > conftest.$ac_ext <<EOF
-#line 1795 "configure"
+#line 1783 "configure"
 #include "confdefs.h"
 #include <ctype.h>
 #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
@@ -1802,7 +1790,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
 exit (0); }
 
 EOF
-if { (eval echo configure:1806: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:1794: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   :
 else
@@ -1826,12 +1814,12 @@ EOF
 fi
 
 echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6
-echo "configure:1830: checking whether time.h and sys/time.h may both be included" >&5
+echo "configure:1818: checking whether time.h and sys/time.h may both be included" >&5
 if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1835 "configure"
+#line 1823 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/time.h>
@@ -1840,7 +1828,7 @@ int main() {
 struct tm *tp;
 ; return 0; }
 EOF
-if { (eval echo configure:1844: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1832: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_header_time=yes
 else
@@ -1861,12 +1849,12 @@ EOF
 fi
 
 echo $ac_n "checking whether string.h and strings.h may both be included""... $ac_c" 1>&6
-echo "configure:1865: checking whether string.h and strings.h may both be included" >&5
+echo "configure:1853: checking whether string.h and strings.h may both be included" >&5
 if eval "test \"`echo '$''{'gcc_cv_header_string'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1870 "configure"
+#line 1858 "configure"
 #include "confdefs.h"
 #include <string.h>
 #include <strings.h>
@@ -1874,7 +1862,7 @@ int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:1878: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1866: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   gcc_cv_header_string=yes
 else
@@ -1895,12 +1883,12 @@ EOF
 fi
 
 echo $ac_n "checking for sys/wait.h that is POSIX.1 compatible""... $ac_c" 1>&6
-echo "configure:1899: checking for sys/wait.h that is POSIX.1 compatible" >&5
+echo "configure:1887: checking for sys/wait.h that is POSIX.1 compatible" >&5
 if eval "test \"`echo '$''{'ac_cv_header_sys_wait_h'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1904 "configure"
+#line 1892 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/wait.h>
@@ -1916,7 +1904,7 @@ wait (&s);
 s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;
 ; return 0; }
 EOF
-if { (eval echo configure:1920: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1908: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_header_sys_wait_h=yes
 else
@@ -1940,17 +1928,17 @@ for ac_hdr in limits.h stddef.h string.h strings.h stdlib.h time.h fcntl.h unist
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:1944: checking for $ac_hdr" >&5
+echo "configure:1932: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1949 "configure"
+#line 1937 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1954: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1942: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -1980,17 +1968,17 @@ done
 # Check for thread headers.
 ac_safe=`echo "thread.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for thread.h""... $ac_c" 1>&6
-echo "configure:1984: checking for thread.h" >&5
+echo "configure:1972: checking for thread.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1989 "configure"
+#line 1977 "configure"
 #include "confdefs.h"
 #include <thread.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1994: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1982: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -2014,17 +2002,17 @@ fi
 
 ac_safe=`echo "pthread.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for pthread.h""... $ac_c" 1>&6
-echo "configure:2018: checking for pthread.h" >&5
+echo "configure:2006: checking for pthread.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2023 "configure"
+#line 2011 "configure"
 #include "confdefs.h"
 #include <pthread.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2028: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2016: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -2051,7 +2039,7 @@ fi
 # Extract the first word of "gnatbind", so it can be a program name with args.
 set dummy gnatbind; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2055: checking for $ac_word" >&5
+echo "configure:2043: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_gnat'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2082,12 +2070,12 @@ fi
 # See if the system preprocessor understands the ANSI C preprocessor
 # stringification operator.
 echo $ac_n "checking whether cpp understands the stringify operator""... $ac_c" 1>&6
-echo "configure:2086: checking whether cpp understands the stringify operator" >&5
+echo "configure:2074: checking whether cpp understands the stringify operator" >&5
 if eval "test \"`echo '$''{'gcc_cv_c_have_stringify'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2091 "configure"
+#line 2079 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -2095,7 +2083,7 @@ int main() {
 char *test = S(foo);
 ; return 0; }
 EOF
-if { (eval echo configure:2099: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2087: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   gcc_cv_c_have_stringify=yes
 else
@@ -2118,12 +2106,12 @@ fi
 # Use <inttypes.h> only if it exists,
 # doesn't clash with <sys/types.h>, and declares intmax_t.
 echo $ac_n "checking for inttypes.h""... $ac_c" 1>&6
-echo "configure:2122: checking for inttypes.h" >&5
+echo "configure:2110: checking for inttypes.h" >&5
 if eval "test \"`echo '$''{'gcc_cv_header_inttypes_h'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2127 "configure"
+#line 2115 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <inttypes.h>
@@ -2131,7 +2119,7 @@ int main() {
 intmax_t i = -1;
 ; return 0; }
 EOF
-if { (eval echo configure:2135: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2123: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   gcc_cv_header_inttypes_h=yes
 else
@@ -2157,12 +2145,12 @@ for ac_func in strtoul bsearch strerror putenv popen bcopy bzero bcmp \
 	fputs_unlocked
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:2161: checking for $ac_func" >&5
+echo "configure:2149: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2166 "configure"
+#line 2154 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -2185,7 +2173,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:2189: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2177: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -2214,12 +2202,12 @@ done
 #AC_CHECK_TYPE(wchar_t, unsigned int)
 
 echo $ac_n "checking for vprintf""... $ac_c" 1>&6
-echo "configure:2218: checking for vprintf" >&5
+echo "configure:2206: checking for vprintf" >&5
 if eval "test \"`echo '$''{'ac_cv_func_vprintf'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2223 "configure"
+#line 2211 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char vprintf(); below.  */
@@ -2242,7 +2230,7 @@ vprintf();
 
 ; return 0; }
 EOF
-if { (eval echo configure:2246: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2234: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_vprintf=yes"
 else
@@ -2266,12 +2254,12 @@ fi
 
 if test "$ac_cv_func_vprintf" != yes; then
 echo $ac_n "checking for _doprnt""... $ac_c" 1>&6
-echo "configure:2270: checking for _doprnt" >&5
+echo "configure:2258: checking for _doprnt" >&5
 if eval "test \"`echo '$''{'ac_cv_func__doprnt'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2275 "configure"
+#line 2263 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char _doprnt(); below.  */
@@ -2294,7 +2282,7 @@ _doprnt();
 
 ; return 0; }
 EOF
-if { (eval echo configure:2298: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2286: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func__doprnt=yes"
 else
@@ -2330,7 +2318,7 @@ fi
 
 
 echo $ac_n "checking whether the printf functions support %p""... $ac_c" 1>&6
-echo "configure:2334: checking whether the printf functions support %p" >&5
+echo "configure:2322: checking whether the printf functions support %p" >&5
 if eval "test \"`echo '$''{'gcc_cv_func_printf_ptr'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2338,7 +2326,7 @@ else
   gcc_cv_func_printf_ptr=no
 else
   cat > conftest.$ac_ext <<EOF
-#line 2342 "configure"
+#line 2330 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 
@@ -2351,7 +2339,7 @@ main()
   exit (p != q);
 }
 EOF
-if { (eval echo configure:2355: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:2343: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   gcc_cv_func_printf_ptr=yes
 else
@@ -2384,12 +2372,12 @@ case "${host}" in
   ;;
 esac
 echo $ac_n "checking for pid_t""... $ac_c" 1>&6
-echo "configure:2388: checking for pid_t" >&5
+echo "configure:2376: checking for pid_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_pid_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2393 "configure"
+#line 2381 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -2418,17 +2406,17 @@ fi
 
 ac_safe=`echo "vfork.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for vfork.h""... $ac_c" 1>&6
-echo "configure:2422: checking for vfork.h" >&5
+echo "configure:2410: checking for vfork.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2427 "configure"
+#line 2415 "configure"
 #include "confdefs.h"
 #include <vfork.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2432: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2420: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -2453,18 +2441,18 @@ else
 fi
 
 echo $ac_n "checking for working vfork""... $ac_c" 1>&6
-echo "configure:2457: checking for working vfork" >&5
+echo "configure:2445: checking for working vfork" >&5
 if eval "test \"`echo '$''{'ac_cv_func_vfork_works'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   if test "$cross_compiling" = yes; then
   echo $ac_n "checking for vfork""... $ac_c" 1>&6
-echo "configure:2463: checking for vfork" >&5
+echo "configure:2451: checking for vfork" >&5
 if eval "test \"`echo '$''{'ac_cv_func_vfork'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2468 "configure"
+#line 2456 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char vfork(); below.  */
@@ -2487,7 +2475,7 @@ vfork();
 
 ; return 0; }
 EOF
-if { (eval echo configure:2491: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2479: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_vfork=yes"
 else
@@ -2509,7 +2497,7 @@ fi
 ac_cv_func_vfork_works=$ac_cv_func_vfork
 else
   cat > conftest.$ac_ext <<EOF
-#line 2513 "configure"
+#line 2501 "configure"
 #include "confdefs.h"
 /* Thanks to Paul Eggert for this test.  */
 #include <stdio.h>
@@ -2604,7 +2592,7 @@ main() {
   }
 }
 EOF
-if { (eval echo configure:2608: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:2596: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ac_cv_func_vfork_works=yes
 else
@@ -2632,12 +2620,12 @@ for ac_func in malloc realloc calloc free bcopy bzero bcmp \
 	strsignal putc_unlocked fputs_unlocked strstr
 do
 echo $ac_n "checking whether $ac_func must be declared""... $ac_c" 1>&6
-echo "configure:2636: checking whether $ac_func must be declared" >&5
+echo "configure:2624: checking whether $ac_func must be declared" >&5
 if eval "test \"`echo '$''{'gcc_cv_decl_needed_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2641 "configure"
+#line 2629 "configure"
 #include "confdefs.h"
 
 #include <stdio.h>
@@ -2670,7 +2658,7 @@ int main() {
 char *(*pfn) = (char *(*)) $ac_func
 ; return 0; }
 EOF
-if { (eval echo configure:2674: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2662: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   eval "gcc_cv_decl_needed_$ac_func=no"
 else
@@ -2699,12 +2687,12 @@ done
 for ac_func in getrlimit setrlimit
 do
 echo $ac_n "checking whether $ac_func must be declared""... $ac_c" 1>&6
-echo "configure:2703: checking whether $ac_func must be declared" >&5
+echo "configure:2691: checking whether $ac_func must be declared" >&5
 if eval "test \"`echo '$''{'gcc_cv_decl_needed_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2708 "configure"
+#line 2696 "configure"
 #include "confdefs.h"
 
 #include <stdio.h>
@@ -2741,7 +2729,7 @@ int main() {
 char *(*pfn) = (char *(*)) $ac_func
 ; return 0; }
 EOF
-if { (eval echo configure:2745: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2733: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   eval "gcc_cv_decl_needed_$ac_func=no"
 else
@@ -2768,12 +2756,12 @@ done
 
 
 echo $ac_n "checking for sys_siglist declaration in signal.h or unistd.h""... $ac_c" 1>&6
-echo "configure:2772: checking for sys_siglist declaration in signal.h or unistd.h" >&5
+echo "configure:2760: checking for sys_siglist declaration in signal.h or unistd.h" >&5
 if eval "test \"`echo '$''{'ac_cv_decl_sys_siglist'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2777 "configure"
+#line 2765 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <signal.h>
@@ -2785,7 +2773,7 @@ int main() {
 char *msg = *(sys_siglist + 1);
 ; return 0; }
 EOF
-if { (eval echo configure:2789: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2777: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_decl_sys_siglist=yes
 else
@@ -2808,12 +2796,12 @@ fi
 
 # mkdir takes a single argument on some systems. 
 echo $ac_n "checking if mkdir takes one argument""... $ac_c" 1>&6
-echo "configure:2812: checking if mkdir takes one argument" >&5
+echo "configure:2800: checking if mkdir takes one argument" >&5
 if eval "test \"`echo '$''{'gcc_cv_mkdir_takes_one_arg'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2817 "configure"
+#line 2805 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -2830,7 +2818,7 @@ int main() {
 mkdir ("foo", 0);
 ; return 0; }
 EOF
-if { (eval echo configure:2834: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2822: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   gcc_cv_mkdir_takes_one_arg=no
 else
@@ -5986,14 +5974,6 @@ then float_h_file=Makefile.in
 else float_h_file=float-$float_format.h
 fi
 
-if test x$enable_haifa = x
-then
-  case $target in
-    alpha*-* | hppa*-* | powerpc*-* | rs6000-* | *sparc*-* | m32r*-*)
-      enable_haifa=yes;;
-  esac
-fi
-
 # Handle cpp installation.
 if test x$enable_cpp != xno
 then
@@ -6183,7 +6163,7 @@ fi
 
 
         echo $ac_n "checking for strerror in -lcposix""... $ac_c" 1>&6
-echo "configure:6187: checking for strerror in -lcposix" >&5
+echo "configure:6167: checking for strerror in -lcposix" >&5
 ac_lib_var=`echo cposix'_'strerror | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -6191,7 +6171,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lcposix  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 6195 "configure"
+#line 6175 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -6202,7 +6182,7 @@ int main() {
 strerror()
 ; return 0; }
 EOF
-if { (eval echo configure:6206: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6186: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -6225,12 +6205,12 @@ fi
   
 
 echo $ac_n "checking for working const""... $ac_c" 1>&6
-echo "configure:6229: checking for working const" >&5
+echo "configure:6209: checking for working const" >&5
 if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6234 "configure"
+#line 6214 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -6279,7 +6259,7 @@ ccp = (char const *const *) p;
 
 ; return 0; }
 EOF
-if { (eval echo configure:6283: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6263: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_const=yes
 else
@@ -6300,21 +6280,21 @@ EOF
 fi
 
 echo $ac_n "checking for inline""... $ac_c" 1>&6
-echo "configure:6304: checking for inline" >&5
+echo "configure:6284: checking for inline" >&5
 if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   ac_cv_c_inline=no
 for ac_kw in inline __inline__ __inline; do
   cat > conftest.$ac_ext <<EOF
-#line 6311 "configure"
+#line 6291 "configure"
 #include "confdefs.h"
 
 int main() {
 } $ac_kw foo() {
 ; return 0; }
 EOF
-if { (eval echo configure:6318: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6298: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_inline=$ac_kw; break
 else
@@ -6340,12 +6320,12 @@ EOF
 esac
 
 echo $ac_n "checking for off_t""... $ac_c" 1>&6
-echo "configure:6344: checking for off_t" >&5
+echo "configure:6324: checking for off_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6349 "configure"
+#line 6329 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -6373,12 +6353,12 @@ EOF
 fi
 
 echo $ac_n "checking for size_t""... $ac_c" 1>&6
-echo "configure:6377: checking for size_t" >&5
+echo "configure:6357: checking for size_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6382 "configure"
+#line 6362 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -6408,19 +6388,19 @@ fi
 # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
 # for constant arguments.  Useless!
 echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
-echo "configure:6412: checking for working alloca.h" >&5
+echo "configure:6392: checking for working alloca.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6417 "configure"
+#line 6397 "configure"
 #include "confdefs.h"
 #include <alloca.h>
 int main() {
 char *p = alloca(2 * sizeof(int));
 ; return 0; }
 EOF
-if { (eval echo configure:6424: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6404: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_cv_header_alloca_h=yes
 else
@@ -6441,12 +6421,12 @@ EOF
 fi
 
 echo $ac_n "checking for alloca""... $ac_c" 1>&6
-echo "configure:6445: checking for alloca" >&5
+echo "configure:6425: checking for alloca" >&5
 if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6450 "configure"
+#line 6430 "configure"
 #include "confdefs.h"
 
 #ifdef __GNUC__
@@ -6474,7 +6454,7 @@ int main() {
 char *p = (char *) alloca(1);
 ; return 0; }
 EOF
-if { (eval echo configure:6478: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6458: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_cv_func_alloca_works=yes
 else
@@ -6506,12 +6486,12 @@ EOF
 
 
 echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
-echo "configure:6510: checking whether alloca needs Cray hooks" >&5
+echo "configure:6490: checking whether alloca needs Cray hooks" >&5
 if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6515 "configure"
+#line 6495 "configure"
 #include "confdefs.h"
 #if defined(CRAY) && ! defined(CRAY2)
 webecray
@@ -6536,12 +6516,12 @@ echo "$ac_t""$ac_cv_os_cray" 1>&6
 if test $ac_cv_os_cray = yes; then
 for ac_func in _getb67 GETB67 getb67; do
   echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:6540: checking for $ac_func" >&5
+echo "configure:6520: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6545 "configure"
+#line 6525 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -6564,7 +6544,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:6568: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6548: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -6591,7 +6571,7 @@ done
 fi
 
 echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
-echo "configure:6595: checking stack direction for C alloca" >&5
+echo "configure:6575: checking stack direction for C alloca" >&5
 if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -6599,7 +6579,7 @@ else
   ac_cv_c_stack_direction=0
 else
   cat > conftest.$ac_ext <<EOF
-#line 6603 "configure"
+#line 6583 "configure"
 #include "confdefs.h"
 find_stack_direction ()
 {
@@ -6618,7 +6598,7 @@ main ()
   exit (find_stack_direction() < 0);
 }
 EOF
-if { (eval echo configure:6622: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:6602: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ac_cv_c_stack_direction=1
 else
@@ -6643,17 +6623,17 @@ for ac_hdr in unistd.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:6647: checking for $ac_hdr" >&5
+echo "configure:6627: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6652 "configure"
+#line 6632 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6657: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6637: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -6682,12 +6662,12 @@ done
 for ac_func in getpagesize
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:6686: checking for $ac_func" >&5
+echo "configure:6666: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6691 "configure"
+#line 6671 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -6710,7 +6690,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:6714: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6694: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -6735,7 +6715,7 @@ fi
 done
 
 echo $ac_n "checking for working mmap""... $ac_c" 1>&6
-echo "configure:6739: checking for working mmap" >&5
+echo "configure:6719: checking for working mmap" >&5
 if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -6743,7 +6723,7 @@ else
   ac_cv_func_mmap_fixed_mapped=no
 else
   cat > conftest.$ac_ext <<EOF
-#line 6747 "configure"
+#line 6727 "configure"
 #include "confdefs.h"
 
 /* Thanks to Mike Haertel and Jim Avera for this test.
@@ -6883,7 +6863,7 @@ main()
 }
 
 EOF
-if { (eval echo configure:6887: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:6867: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ac_cv_func_mmap_fixed_mapped=yes
 else
@@ -6911,17 +6891,17 @@ unistd.h sys/param.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:6915: checking for $ac_hdr" >&5
+echo "configure:6895: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6920 "configure"
+#line 6900 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6925: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6905: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -6951,12 +6931,12 @@ done
 strdup __argz_count __argz_stringify __argz_next
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:6955: checking for $ac_func" >&5
+echo "configure:6935: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6960 "configure"
+#line 6940 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -6979,7 +6959,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:6983: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6963: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -7008,12 +6988,12 @@ done
      for ac_func in stpcpy
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:7012: checking for $ac_func" >&5
+echo "configure:6992: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 7017 "configure"
+#line 6997 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -7036,7 +7016,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:7040: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7020: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -7070,19 +7050,19 @@ EOF
 
    if test $ac_cv_header_locale_h = yes; then
     echo $ac_n "checking for LC_MESSAGES""... $ac_c" 1>&6
-echo "configure:7074: checking for LC_MESSAGES" >&5
+echo "configure:7054: checking for LC_MESSAGES" >&5
 if eval "test \"`echo '$''{'am_cv_val_LC_MESSAGES'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 7079 "configure"
+#line 7059 "configure"
 #include "confdefs.h"
 #include <locale.h>
 int main() {
 return LC_MESSAGES
 ; return 0; }
 EOF
-if { (eval echo configure:7086: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7066: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   am_cv_val_LC_MESSAGES=yes
 else
@@ -7103,7 +7083,7 @@ EOF
     fi
   fi
    echo $ac_n "checking whether NLS is requested""... $ac_c" 1>&6
-echo "configure:7107: checking whether NLS is requested" >&5
+echo "configure:7087: checking whether NLS is requested" >&5
         # Check whether --enable-nls or --disable-nls was given.
 if test "${enable_nls+set}" = set; then
   enableval="$enable_nls"
@@ -7123,7 +7103,7 @@ fi
 EOF
 
       echo $ac_n "checking whether included gettext is requested""... $ac_c" 1>&6
-echo "configure:7127: checking whether included gettext is requested" >&5
+echo "configure:7107: checking whether included gettext is requested" >&5
       # Check whether --with-included-gettext or --without-included-gettext was given.
 if test "${with_included_gettext+set}" = set; then
   withval="$with_included_gettext"
@@ -7142,17 +7122,17 @@ fi
 
 	ac_safe=`echo "libintl.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for libintl.h""... $ac_c" 1>&6
-echo "configure:7146: checking for libintl.h" >&5
+echo "configure:7126: checking for libintl.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 7151 "configure"
+#line 7131 "configure"
 #include "confdefs.h"
 #include <libintl.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7156: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:7136: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -7169,19 +7149,19 @@ fi
 if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
   echo "$ac_t""yes" 1>&6
   echo $ac_n "checking for gettext in libc""... $ac_c" 1>&6
-echo "configure:7173: checking for gettext in libc" >&5
+echo "configure:7153: checking for gettext in libc" >&5
 if eval "test \"`echo '$''{'gt_cv_func_gettext_libc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 7178 "configure"
+#line 7158 "configure"
 #include "confdefs.h"
 #include <libintl.h>
 int main() {
 return (int) gettext ("")
 ; return 0; }
 EOF
-if { (eval echo configure:7185: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7165: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   gt_cv_func_gettext_libc=yes
 else
@@ -7197,7 +7177,7 @@ echo "$ac_t""$gt_cv_func_gettext_libc" 1>&6
 
 	   if test "$gt_cv_func_gettext_libc" != "yes"; then
 	     echo $ac_n "checking for bindtextdomain in -lintl""... $ac_c" 1>&6
-echo "configure:7201: checking for bindtextdomain in -lintl" >&5
+echo "configure:7181: checking for bindtextdomain in -lintl" >&5
 ac_lib_var=`echo intl'_'bindtextdomain | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -7205,7 +7185,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lintl  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 7209 "configure"
+#line 7189 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7216,7 +7196,7 @@ int main() {
 bindtextdomain()
 ; return 0; }
 EOF
-if { (eval echo configure:7220: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7200: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7232,12 +7212,12 @@ fi
 if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
   echo "$ac_t""yes" 1>&6
   echo $ac_n "checking for gettext in libintl""... $ac_c" 1>&6
-echo "configure:7236: checking for gettext in libintl" >&5
+echo "configure:7216: checking for gettext in libintl" >&5
 if eval "test \"`echo '$''{'gt_cv_func_gettext_libintl'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   echo $ac_n "checking for gettext in -lintl""... $ac_c" 1>&6
-echo "configure:7241: checking for gettext in -lintl" >&5
+echo "configure:7221: checking for gettext in -lintl" >&5
 ac_lib_var=`echo intl'_'gettext | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -7245,7 +7225,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lintl  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 7249 "configure"
+#line 7229 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7256,7 +7236,7 @@ int main() {
 gettext()
 ; return 0; }
 EOF
-if { (eval echo configure:7260: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7240: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7295,7 +7275,7 @@ EOF
 	      # Extract the first word of "msgfmt", so it can be a program name with args.
 set dummy msgfmt; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:7299: checking for $ac_word" >&5
+echo "configure:7279: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -7329,12 +7309,12 @@ fi
 		for ac_func in dcgettext
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:7333: checking for $ac_func" >&5
+echo "configure:7313: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 7338 "configure"
+#line 7318 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -7357,7 +7337,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:7361: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7341: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -7384,7 +7364,7 @@ done
 		# Extract the first word of "gmsgfmt", so it can be a program name with args.
 set dummy gmsgfmt; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:7388: checking for $ac_word" >&5
+echo "configure:7368: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -7420,7 +7400,7 @@ fi
 		# Extract the first word of "xgettext", so it can be a program name with args.
 set dummy xgettext; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:7424: checking for $ac_word" >&5
+echo "configure:7404: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -7452,7 +7432,7 @@ else
 fi
 
 		cat > conftest.$ac_ext <<EOF
-#line 7456 "configure"
+#line 7436 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -7460,7 +7440,7 @@ extern int _nl_msg_cat_cntr;
 			       return _nl_msg_cat_cntr
 ; return 0; }
 EOF
-if { (eval echo configure:7464: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7444: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   CATOBJEXT=.gmo
 		   DATADIRNAME=share
@@ -7483,7 +7463,7 @@ fi
 
         if test "$CATOBJEXT" = "NONE"; then
 	  echo $ac_n "checking whether catgets can be used""... $ac_c" 1>&6
-echo "configure:7487: checking whether catgets can be used" >&5
+echo "configure:7467: checking whether catgets can be used" >&5
 	  # Check whether --with-catgets or --without-catgets was given.
 if test "${with_catgets+set}" = set; then
   withval="$with_catgets"
@@ -7496,7 +7476,7 @@ fi
 
 	  if test "$nls_cv_use_catgets" = "yes"; then
 	    	    echo $ac_n "checking for main in -li""... $ac_c" 1>&6
-echo "configure:7500: checking for main in -li" >&5
+echo "configure:7480: checking for main in -li" >&5
 ac_lib_var=`echo i'_'main | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -7504,14 +7484,14 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-li  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 7508 "configure"
+#line 7488 "configure"
 #include "confdefs.h"
 
 int main() {
 main()
 ; return 0; }
 EOF
-if { (eval echo configure:7515: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7495: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7539,12 +7519,12 @@ else
 fi
 
 	    echo $ac_n "checking for catgets""... $ac_c" 1>&6
-echo "configure:7543: checking for catgets" >&5
+echo "configure:7523: checking for catgets" >&5
 if eval "test \"`echo '$''{'ac_cv_func_catgets'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 7548 "configure"
+#line 7528 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char catgets(); below.  */
@@ -7567,7 +7547,7 @@ catgets();
 
 ; return 0; }
 EOF
-if { (eval echo configure:7571: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7551: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_catgets=yes"
 else
@@ -7589,7 +7569,7 @@ EOF
 	       # Extract the first word of "gencat", so it can be a program name with args.
 set dummy gencat; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:7593: checking for $ac_word" >&5
+echo "configure:7573: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_GENCAT'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -7625,7 +7605,7 @@ fi
 		 # Extract the first word of "gmsgfmt", so it can be a program name with args.
 set dummy gmsgfmt; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:7629: checking for $ac_word" >&5
+echo "configure:7609: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -7662,7 +7642,7 @@ fi
 		   # Extract the first word of "msgfmt", so it can be a program name with args.
 set dummy msgfmt; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:7666: checking for $ac_word" >&5
+echo "configure:7646: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -7697,7 +7677,7 @@ fi
 		 # Extract the first word of "xgettext", so it can be a program name with args.
 set dummy xgettext; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:7701: checking for $ac_word" >&5
+echo "configure:7681: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -7755,7 +7735,7 @@ fi
         # Extract the first word of "msgfmt", so it can be a program name with args.
 set dummy msgfmt; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:7759: checking for $ac_word" >&5
+echo "configure:7739: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -7789,7 +7769,7 @@ fi
         # Extract the first word of "gmsgfmt", so it can be a program name with args.
 set dummy gmsgfmt; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:7793: checking for $ac_word" >&5
+echo "configure:7773: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -7825,7 +7805,7 @@ fi
         # Extract the first word of "xgettext", so it can be a program name with args.
 set dummy xgettext; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:7829: checking for $ac_word" >&5
+echo "configure:7809: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -7918,7 +7898,7 @@ fi
        LINGUAS=
      else
        echo $ac_n "checking for catalogs to be installed""... $ac_c" 1>&6
-echo "configure:7922: checking for catalogs to be installed" >&5
+echo "configure:7902: checking for catalogs to be installed" >&5
        NEW_LINGUAS=
        for lang in ${LINGUAS=$ALL_LINGUAS}; do
          case "$ALL_LINGUAS" in
@@ -7946,17 +7926,17 @@ echo "configure:7922: checking for catalogs to be installed" >&5
    if test "$CATOBJEXT" = ".cat"; then
      ac_safe=`echo "linux/version.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for linux/version.h""... $ac_c" 1>&6
-echo "configure:7950: checking for linux/version.h" >&5
+echo "configure:7930: checking for linux/version.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 7955 "configure"
+#line 7935 "configure"
 #include "confdefs.h"
 #include <linux/version.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7960: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:7940: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -8031,7 +8011,7 @@ fi
 
 
 echo $ac_n "checking whether windows registry support is requested""... $ac_c" 1>&6
-echo "configure:8035: checking whether windows registry support is requested" >&5
+echo "configure:8015: checking whether windows registry support is requested" >&5
 if test x$enable_win32_registry != xno; then
   cat >> confdefs.h <<\EOF
 #define ENABLE_WIN32_REGISTRY 1
@@ -8060,7 +8040,7 @@ esac
 
 if test x$enable_win32_registry != xno; then
   echo $ac_n "checking registry key on windows hosts""... $ac_c" 1>&6
-echo "configure:8064: checking registry key on windows hosts" >&5
+echo "configure:8044: checking registry key on windows hosts" >&5
   cat >> confdefs.h <<EOF
 #define WIN32_REGISTRY_KEY "$gcc_cv_win32_registry_key"
 EOF
@@ -8236,7 +8216,7 @@ fi
 
 # Figure out what assembler alignment features are present.
 echo $ac_n "checking assembler alignment features""... $ac_c" 1>&6
-echo "configure:8240: checking assembler alignment features" >&5
+echo "configure:8220: checking assembler alignment features" >&5
 gcc_cv_as=
 gcc_cv_as_alignment_features=
 gcc_cv_as_gas_srcdir=`echo $srcdir | sed -e 's,/gcc$,,'`/gas
@@ -8357,7 +8337,7 @@ fi
 echo "$ac_t""$gcc_cv_as_alignment_features" 1>&6
 
 echo $ac_n "checking assembler subsection support""... $ac_c" 1>&6
-echo "configure:8361: checking assembler subsection support" >&5
+echo "configure:8341: checking assembler subsection support" >&5
 gcc_cv_as_subsections=
 if test x$gcc_cv_as != x; then
 	# Check if we have .subsection
@@ -8399,7 +8379,7 @@ echo "$ac_t""$gcc_cv_as_subsections" 1>&6
 case "$target" in 
   sparc*-*-*)
     echo $ac_n "checking assembler .register pseudo-op support""... $ac_c" 1>&6
-echo "configure:8403: checking assembler .register pseudo-op support" >&5
+echo "configure:8383: checking assembler .register pseudo-op support" >&5
     gcc_cv_as_register_pseudo_op=
     if test x$gcc_cv_as != x; then
 	# Check if we have .register
@@ -8416,7 +8396,7 @@ EOF
     echo "$ac_t""$gcc_cv_as_register_pseudo_op" 1>&6
 
     echo $ac_n "checking assembler offsetable %lo() support""... $ac_c" 1>&6
-echo "configure:8420: checking assembler offsetable %lo() support" >&5
+echo "configure:8400: checking assembler offsetable %lo() support" >&5
     gcc_cv_as_offsetable_lo10=
     if test x$gcc_cv_as != x; then
 	# Check if assembler has offsetable %lo()
@@ -8449,7 +8429,7 @@ EOF
 
   i[34567]86-*-*)
     echo $ac_n "checking assembler instructions""... $ac_c" 1>&6
-echo "configure:8453: checking assembler instructions" >&5
+echo "configure:8433: checking assembler instructions" >&5
     gcc_cv_as_instructions=
     if test x$gcc_cv_as != x; then
 	set "filds fists" "filds mem; fists mem"
@@ -8682,26 +8662,6 @@ if test x$with_newlib = xyes; then
 fi
 
 
-# Override SCHED_OBJ and SCHED_CFLAGS to enable the Haifa scheduler.
-sched_prefix=
-sched_cflags=
-if test x$enable_haifa = xyes; then
-    echo "Using the Haifa scheduler."
-    sched_prefix=haifa-
-    sched_cflags=-DHAIFA
-fi
-
-
-if test x$enable_haifa != x; then
-    # Explicitly remove files that need to be recompiled for the Haifa scheduler.
-    for x in genattrtab.o toplev.o *sched.o; do
-	if test -f $x; then
-	    echo "Removing $x"
-	    rm -f $x
-	fi
-    done
-fi
-
 # If $(exec_prefix) exists and is not the same as $(prefix), then compute an
 # absolute path for gcc_tooldir based on inserting the number of up-directory
 # movements required to get from $(exec_prefix) to $(prefix) into the basic
@@ -9038,8 +8998,6 @@ s%@build_canonical@%$build_canonical%g
 s%@host_canonical@%$host_canonical%g
 s%@target_subdir@%$target_subdir%g
 s%@inhibit_libc@%$inhibit_libc%g
-s%@sched_prefix@%$sched_prefix%g
-s%@sched_cflags@%$sched_cflags%g
 s%@gcc_tooldir@%$gcc_tooldir%g
 s%@dollar@%$dollar%g
 s%@objdir@%$objdir%g
diff --git a/gcc/configure.in b/gcc/configure.in
index 9667e45e029c..5690dffd70bc 100644
--- a/gcc/configure.in
+++ b/gcc/configure.in
@@ -232,12 +232,6 @@ if test x$enable_fast_fixincludes = xno ; then
   cp $srcdir/fixincludes ./fixinc.sh
 fi)
 
-# Enable Haifa scheduler.
-AC_ARG_ENABLE(haifa,
-[  --enable-haifa          use the experimental scheduler.
-  --disable-haifa         don't use the experimental scheduler for the
-                          targets which normally enable it.])
-
 # Enable threads
 # Pass with no value to take the default
 # Pass with a value to specify a thread package
@@ -3682,14 +3676,6 @@ then float_h_file=Makefile.in
 else float_h_file=float-$float_format.h
 fi
 
-if test x$enable_haifa = x
-then
-  case $target in
-    alpha*-* | hppa*-* | powerpc*-* | rs6000-* | *sparc*-* | m32r*-*)
-      enable_haifa=yes;;
-  esac
-fi
-
 # Handle cpp installation.
 if test x$enable_cpp != xno
 then
@@ -4504,26 +4490,6 @@ if test x$with_newlib = xyes; then
 fi
 AC_SUBST(inhibit_libc)
 
-# Override SCHED_OBJ and SCHED_CFLAGS to enable the Haifa scheduler.
-sched_prefix=
-sched_cflags=
-if test x$enable_haifa = xyes; then
-    echo "Using the Haifa scheduler."
-    sched_prefix=haifa-
-    sched_cflags=-DHAIFA
-fi
-AC_SUBST(sched_prefix)
-AC_SUBST(sched_cflags)
-if test x$enable_haifa != x; then
-    # Explicitly remove files that need to be recompiled for the Haifa scheduler.
-    for x in genattrtab.o toplev.o *sched.o; do
-	if test -f $x; then
-	    echo "Removing $x"
-	    rm -f $x
-	fi
-    done
-fi
-
 # If $(exec_prefix) exists and is not the same as $(prefix), then compute an
 # absolute path for gcc_tooldir based on inserting the number of up-directory
 # movements required to get from $(exec_prefix) to $(prefix) into the basic
diff --git a/gcc/flags.h b/gcc/flags.h
index 9871fb88b78a..c81a721833a7 100644
--- a/gcc/flags.h
+++ b/gcc/flags.h
@@ -349,7 +349,6 @@ extern int flag_shared_data;
 extern int flag_schedule_insns;
 extern int flag_schedule_insns_after_reload;
 
-#ifdef HAIFA
 /* The following flags have effect only for scheduling before register
    allocation:
 
@@ -364,7 +363,6 @@ extern int flag_schedule_interblock;
 extern int flag_schedule_speculative;
 extern int flag_schedule_speculative_load;
 extern int flag_schedule_speculative_load_dangerous;
-#endif  /* HAIFA */
 
 /* flag_on_branch_count_reg means try to replace add-1,compare,branch tupple
    by a cheaper branch, on a count register. */
diff --git a/gcc/genattrtab.c b/gcc/genattrtab.c
index ef050af44010..2713789da3a1 100644
--- a/gcc/genattrtab.c
+++ b/gcc/genattrtab.c
@@ -2082,25 +2082,7 @@ expand_units ()
 
 	  for (op = unit->ops; op; op = op->next)
 	    {
-#ifdef HAIFA
 	      rtx blockage = op->issue_exp;
-#else
-	      rtx blockage = operate_exp (POS_MINUS_OP, readycost,
-					  make_numeric_value (1));
-
-	      if (unit->simultaneity != 0)
-		{
-		  rtx filltime = make_numeric_value ((unit->simultaneity - 1)
-						     * unit->issue_delay.min);
-		  blockage = operate_exp (MIN_OP, blockage, filltime);
-		}
-
-	      blockage = operate_exp (POS_MINUS_OP,
-				      make_numeric_value (op->ready),
-				      blockage);
-
-	      blockage = operate_exp (MAX_OP, blockage, op->issue_exp);
-#endif
 	      blockage = simplify_knowing (blockage, unit->condexp);
 
 	      /* Add this op's contribution to MAX (BLOCKAGE (E,*)) and
diff --git a/gcc/rtl.h b/gcc/rtl.h
index 381e66d74d33..5d7afa2f8263 100644
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -1346,9 +1346,7 @@ extern void dump_combine_total_stats	PROTO ((FILE *));
 #ifdef BUFSIZ
 extern void schedule_insns		PROTO ((FILE *));
 #endif
-#ifdef HAIFA
 extern void fix_sched_param		PROTO ((const char *, const char *));
-#endif
 
 /* In print-rtl.c */
 extern void debug_rtx			PROTO ((rtx));
diff --git a/gcc/sched.c b/gcc/sched.c
deleted file mode 100644
index c438c02075e5..000000000000
--- a/gcc/sched.c
+++ /dev/null
@@ -1,4480 +0,0 @@
-/* Instruction scheduling pass.
-   Copyright (C) 1992, 93-98, 1999 Free Software Foundation, Inc.
-   Contributed by Michael Tiemann (tiemann@cygnus.com)
-   Enhanced by, and currently maintained by, Jim Wilson (wilson@cygnus.com)
-
-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.  */
-
-/* Instruction scheduling pass.
-
-   This pass implements list scheduling within basic blocks.  It is
-   run after flow analysis, but before register allocation.  The
-   scheduler works as follows:
-
-   We compute insn priorities based on data dependencies.  Flow
-   analysis only creates a fraction of the data-dependencies we must
-   observe: namely, only those dependencies which the combiner can be
-   expected to use.  For this pass, we must therefore create the
-   remaining dependencies we need to observe: register dependencies,
-   memory dependencies, dependencies to keep function calls in order,
-   and the dependence between a conditional branch and the setting of
-   condition codes are all dealt with here.
-
-   The scheduler first traverses the data flow graph, starting with
-   the last instruction, and proceeding to the first, assigning
-   values to insn_priority as it goes.  This sorts the instructions
-   topologically by data dependence.
-
-   Once priorities have been established, we order the insns using
-   list scheduling.  This works as follows: starting with a list of
-   all the ready insns, and sorted according to priority number, we
-   schedule the insn from the end of the list by placing its
-   predecessors in the list according to their priority order.  We
-   consider this insn scheduled by setting the pointer to the "end" of
-   the list to point to the previous insn.  When an insn has no
-   predecessors, we either queue it until sufficient time has elapsed
-   or add it to the ready list.  As the instructions are scheduled or
-   when stalls are introduced, the queue advances and dumps insns into
-   the ready list.  When all insns down to the lowest priority have
-   been scheduled, the critical path of the basic block has been made
-   as short as possible.  The remaining insns are then scheduled in
-   remaining slots.
-
-   Function unit conflicts are resolved during reverse list scheduling
-   by tracking the time when each insn is committed to the schedule
-   and from that, the time the function units it uses must be free.
-   As insns on the ready list are considered for scheduling, those
-   that would result in a blockage of the already committed insns are
-   queued until no blockage will result.  Among the remaining insns on
-   the ready list to be considered, the first one with the largest
-   potential for causing a subsequent blockage is chosen.
-
-   The following list shows the order in which we want to break ties
-   among insns in the ready list:
-
-	1.  choose insn with lowest conflict cost, ties broken by
-	2.  choose insn with the longest path to end of bb, ties broken by
-	3.  choose insn that kills the most registers, ties broken by
-	4.  choose insn that conflicts with the most ready insns, or finally
-	5.  choose insn with lowest UID.
-
-   Memory references complicate matters.  Only if we can be certain
-   that memory references are not part of the data dependency graph
-   (via true, anti, or output dependence), can we move operations past
-   memory references.  To first approximation, reads can be done
-   independently, while writes introduce dependencies.  Better
-   approximations will yield fewer dependencies.
-
-   Dependencies set up by memory references are treated in exactly the
-   same way as other dependencies, by using LOG_LINKS.
-
-   Having optimized the critical path, we may have also unduly
-   extended the lifetimes of some registers.  If an operation requires
-   that constants be loaded into registers, it is certainly desirable
-   to load those constants as early as necessary, but no earlier.
-   I.e., it will not do to load up a bunch of registers at the
-   beginning of a basic block only to use them at the end, if they
-   could be loaded later, since this may result in excessive register
-   utilization.
-
-   Note that since branches are never in basic blocks, but only end
-   basic blocks, this pass will not do any branch scheduling.  But
-   that is ok, since we can use GNU's delayed branch scheduling
-   pass to take care of this case.
-
-   Also note that no further optimizations based on algebraic identities
-   are performed, so this pass would be a good one to perform instruction
-   splitting, such as breaking up a multiply instruction into shifts
-   and adds where that is profitable.
-
-   Given the memory aliasing analysis that this pass should perform,
-   it should be possible to remove redundant stores to memory, and to
-   load values from registers instead of hitting memory.
-
-   This pass must update information that subsequent passes expect to be
-   correct.  Namely: reg_n_refs, reg_n_sets, reg_n_deaths,
-   reg_n_calls_crossed, and reg_live_length.  Also, BLOCK_HEAD,
-   BLOCK_END.
-
-   The information in the line number notes is carefully retained by
-   this pass.  Notes that refer to the starting and ending of
-   exception regions are also carefully retained by this pass.  All
-   other NOTE insns are grouped in their same relative order at the
-   beginning of basic blocks that have been scheduled.  */
-
-#include "config.h"
-#include "system.h"
-#include "toplev.h"
-#include "rtl.h"
-#include "basic-block.h"
-#include "regs.h"
-#include "function.h"
-#include "hard-reg-set.h"
-#include "flags.h"
-#include "insn-config.h"
-#include "insn-attr.h"
-#include "recog.h"
-
-#ifndef INSN_SCHEDULING
-void
-schedule_insns (dump_file)
-     FILE *dump_file ATTRIBUTE_UNUSED;
-{
-}
-#else /* INSN_SCHEDULING -- rest of file */
-
-extern char *reg_known_equiv_p;
-extern rtx *reg_known_value;
-
-/* Arrays set up by scheduling for the same respective purposes as
-   similar-named arrays set up by flow analysis.  We work with these
-   arrays during the scheduling pass so we can compare values against
-   unscheduled code.
-
-   Values of these arrays are copied at the end of this pass into the
-   arrays set up by flow analysis.  */
-static int *sched_reg_n_calls_crossed;
-static int *sched_reg_live_length;
-
-/* Element N is the next insn that sets (hard or pseudo) register
-   N within the current basic block; or zero, if there is no
-   such insn.  Needed for new registers which may be introduced
-   by splitting insns.  */
-static rtx *reg_last_uses;
-static rtx *reg_last_sets;
-static regset reg_pending_sets;
-static int reg_pending_sets_all;
-
-/* Vector indexed by INSN_UID giving the original ordering of the insns.  */
-static int *insn_luid;
-#define INSN_LUID(INSN) (insn_luid[INSN_UID (INSN)])
-
-/* Vector indexed by INSN_UID giving each instruction a priority.  */
-static int *insn_priority;
-#define INSN_PRIORITY(INSN) (insn_priority[INSN_UID (INSN)])
-
-static short *insn_costs;
-#define INSN_COST(INSN)	insn_costs[INSN_UID (INSN)]
-
-/* Vector indexed by INSN_UID giving an encoding of the function units
-   used.  */
-static short *insn_units;
-#define INSN_UNIT(INSN)	insn_units[INSN_UID (INSN)]
-
-/* Vector indexed by INSN_UID giving an encoding of the blockage range
-   function.  The unit and the range are encoded.  */
-static unsigned int *insn_blockage;
-#define INSN_BLOCKAGE(INSN) insn_blockage[INSN_UID (INSN)]
-#define UNIT_BITS 5
-#define BLOCKAGE_MASK ((1 << BLOCKAGE_BITS) - 1)
-#define ENCODE_BLOCKAGE(U,R)				\
-  ((((U) << UNIT_BITS) << BLOCKAGE_BITS			\
-    | MIN_BLOCKAGE_COST (R)) << BLOCKAGE_BITS		\
-   | MAX_BLOCKAGE_COST (R))
-#define UNIT_BLOCKED(B) ((B) >> (2 * BLOCKAGE_BITS))
-#define BLOCKAGE_RANGE(B) \
-  (((((B) >> BLOCKAGE_BITS) & BLOCKAGE_MASK) << (HOST_BITS_PER_INT / 2)) \
-   | ((B) & BLOCKAGE_MASK))
-
-/* Encodings of the `<name>_unit_blockage_range' function.  */
-#define MIN_BLOCKAGE_COST(R) ((R) >> (HOST_BITS_PER_INT / 2))
-#define MAX_BLOCKAGE_COST(R) ((R) & ((1 << (HOST_BITS_PER_INT / 2)) - 1))
-
-#define DONE_PRIORITY	-1
-#define MAX_PRIORITY	0x7fffffff
-#define TAIL_PRIORITY	0x7ffffffe
-#define LAUNCH_PRIORITY	0x7f000001
-#define DONE_PRIORITY_P(INSN) (INSN_PRIORITY (INSN) < 0)
-#define LOW_PRIORITY_P(INSN) ((INSN_PRIORITY (INSN) & 0x7f000000) == 0)
-
-/* Vector indexed by INSN_UID giving number of insns referring to this insn.  */
-static int *insn_ref_count;
-#define INSN_REF_COUNT(INSN) (insn_ref_count[INSN_UID (INSN)])
-
-/* Vector indexed by INSN_UID giving line-number note in effect for each
-   insn.  For line-number notes, this indicates whether the note may be
-   reused.  */
-static rtx *line_note;
-#define LINE_NOTE(INSN) (line_note[INSN_UID (INSN)])
-
-/* Vector indexed by basic block number giving the starting line-number
-   for each basic block.  */
-static rtx *line_note_head;
-
-/* List of important notes we must keep around.  This is a pointer to the
-   last element in the list.  */
-static rtx note_list;
-
-/* Regsets telling whether a given register is live or dead before the last
-   scheduled insn.  Must scan the instructions once before scheduling to
-   determine what registers are live or dead at the end of the block.  */
-static regset bb_dead_regs;
-static regset bb_live_regs;
-
-/* Regset telling whether a given register is live after the insn currently
-   being scheduled.  Before processing an insn, this is equal to bb_live_regs
-   above.  This is used so that we can find registers that are newly born/dead
-   after processing an insn.  */
-static regset old_live_regs;
-
-/* The chain of REG_DEAD notes.  REG_DEAD notes are removed from all insns
-   during the initial scan and reused later.  If there are not exactly as
-   many REG_DEAD notes in the post scheduled code as there were in the
-   prescheduled code then we trigger an abort because this indicates a bug.  */
-static rtx dead_notes;
-
-/* Queues, etc.  */
-
-/* An instruction is ready to be scheduled when all insns following it
-   have already been scheduled.  It is important to ensure that all
-   insns which use its result will not be executed until its result
-   has been computed.  An insn is maintained in one of four structures:
-
-   (P) the "Pending" set of insns which cannot be scheduled until
-   their dependencies have been satisfied.
-   (Q) the "Queued" set of insns that can be scheduled when sufficient
-   time has passed.
-   (R) the "Ready" list of unscheduled, uncommitted insns.
-   (S) the "Scheduled" list of insns.
-
-   Initially, all insns are either "Pending" or "Ready" depending on
-   whether their dependencies are satisfied.
-
-   Insns move from the "Ready" list to the "Scheduled" list as they
-   are committed to the schedule.  As this occurs, the insns in the
-   "Pending" list have their dependencies satisfied and move to either
-   the "Ready" list or the "Queued" set depending on whether
-   sufficient time has passed to make them ready.  As time passes,
-   insns move from the "Queued" set to the "Ready" list.  Insns may
-   move from the "Ready" list to the "Queued" set if they are blocked
-   due to a function unit conflict.
-
-   The "Pending" list (P) are the insns in the LOG_LINKS of the unscheduled
-   insns, i.e., those that are ready, queued, and pending.
-   The "Queued" set (Q) is implemented by the variable `insn_queue'.
-   The "Ready" list (R) is implemented by the variables `ready' and
-   `n_ready'.
-   The "Scheduled" list (S) is the new insn chain built by this pass.
-
-   The transition (R->S) is implemented in the scheduling loop in
-   `schedule_block' when the best insn to schedule is chosen.
-   The transition (R->Q) is implemented in `schedule_select' when an
-   insn is found to have a function unit conflict with the already
-   committed insns.
-   The transitions (P->R and P->Q) are implemented in `schedule_insn' as
-   insns move from the ready list to the scheduled list.
-   The transition (Q->R) is implemented at the top of the scheduling
-   loop in `schedule_block' as time passes or stalls are introduced.  */
-
-/* Implement a circular buffer to delay instructions until sufficient
-   time has passed.  INSN_QUEUE_SIZE is a power of two larger than
-   MAX_BLOCKAGE and MAX_READY_COST computed by genattr.c.  This is the
-   longest time an isnsn may be queued.  */
-static rtx insn_queue[INSN_QUEUE_SIZE];
-static int q_ptr = 0;
-static int q_size = 0;
-#define NEXT_Q(X) (((X)+1) & (INSN_QUEUE_SIZE-1))
-#define NEXT_Q_AFTER(X,C) (((X)+C) & (INSN_QUEUE_SIZE-1))
-
-/* Vector indexed by INSN_UID giving the minimum clock tick at which
-   the insn becomes ready.  This is used to note timing constraints for
-   insns in the pending list.  */
-static int *insn_tick;
-#define INSN_TICK(INSN) (insn_tick[INSN_UID (INSN)])
-
-/* Data structure for keeping track of register information
-   during that register's life.  */
-
-struct sometimes
-{
-  int regno;
-  int live_length;
-  int calls_crossed;
-};
-
-/* Forward declarations.  */
-static void add_dependence		PROTO((rtx, rtx, enum reg_note));
-static void remove_dependence		PROTO((rtx, rtx));
-static rtx find_insn_list		PROTO((rtx, rtx));
-static int insn_unit			PROTO((rtx));
-static unsigned int blockage_range	PROTO((int, rtx));
-static void clear_units			PROTO((void));
-static void prepare_unit		PROTO((int));
-static int actual_hazard_this_instance	PROTO((int, int, rtx, int, int));
-static void schedule_unit		PROTO((int, rtx, int));
-static int actual_hazard		PROTO((int, rtx, int, int));
-static int potential_hazard		PROTO((int, rtx, int));
-static int insn_cost			PROTO((rtx, rtx, rtx));
-static int priority			PROTO((rtx));
-static void free_pending_lists		PROTO((void));
-static void add_insn_mem_dependence	PROTO((rtx *, rtx *, rtx, rtx));
-static void flush_pending_lists		PROTO((rtx, int));
-static void sched_analyze_1		PROTO((rtx, rtx));
-static void sched_analyze_2		PROTO((rtx, rtx));
-static void sched_analyze_insn		PROTO((rtx, rtx, rtx));
-static int sched_analyze		PROTO((rtx, rtx));
-static void sched_note_set		PROTO((rtx, int));
-static int rank_for_schedule		PROTO((const GENERIC_PTR, const GENERIC_PTR));
-static void swap_sort			PROTO((rtx *, int));
-static void queue_insn			PROTO((rtx, int));
-static int birthing_insn_p		PROTO((rtx));
-static void adjust_priority		PROTO((rtx));
-static int schedule_insn		PROTO((rtx, rtx *, int, int));
-static int schedule_select		PROTO((rtx *, int, int, FILE *));
-static void create_reg_dead_note	PROTO((rtx, rtx));
-static void attach_deaths		PROTO((rtx, rtx, int));
-static void attach_deaths_insn		PROTO((rtx));
-static rtx unlink_notes			PROTO((rtx, rtx));
-static int new_sometimes_live		PROTO((struct sometimes *, int, int));
-static void finish_sometimes_live	PROTO((struct sometimes *, int));
-static rtx reemit_notes			PROTO((rtx, rtx));
-static void schedule_block		PROTO((int, FILE *));
-static void split_hard_reg_notes	PROTO((rtx, rtx, rtx));
-static void new_insn_dead_notes		PROTO((rtx, rtx, rtx, rtx));
-static void update_n_sets		PROTO((rtx, int));
-
-/* Main entry point of this file.  */
-void schedule_insns	PROTO((FILE *));
-
-#define SIZE_FOR_MODE(X) (GET_MODE_SIZE (GET_MODE (X)))
-
-/* Helper functions for instruction scheduling.  */
-
-/* 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
-   of dependence that this link represents.  */
-
-static void
-add_dependence (insn, elem, dep_type)
-     rtx insn;
-     rtx elem;
-     enum reg_note dep_type;
-{
-  rtx link, next;
-
-  /* Don't depend an insn on itself.  */
-  if (insn == elem)
-    return;
-
-  /* If elem is part of a sequence that must be scheduled together, then
-     make the dependence point to the last insn of the sequence.
-     When HAVE_cc0, it is possible for NOTEs to exist between users and
-     setters of the condition codes, so we must skip past notes here.
-     Otherwise, NOTEs are impossible here.  */
-
-  next = NEXT_INSN (elem);
-
-#ifdef HAVE_cc0
-  while (next && GET_CODE (next) == NOTE)
-    next = NEXT_INSN (next);
-#endif
-
-  if (next && SCHED_GROUP_P (next)
-      && GET_CODE (next) != CODE_LABEL)
-    {
-      /* Notes will never intervene here though, so don't bother checking
-	 for them.  */
-      /* We must reject CODE_LABELs, so that we don't get confused by one
-	 that has LABEL_PRESERVE_P set, which is represented by the same
-	 bit in the rtl as SCHED_GROUP_P.  A CODE_LABEL can never be
-	 SCHED_GROUP_P.  */
-      while (NEXT_INSN (next) && SCHED_GROUP_P (NEXT_INSN (next))
-	     && GET_CODE (NEXT_INSN (next)) != CODE_LABEL)
-	next = NEXT_INSN (next);
-
-      /* Again, don't depend an insn on itself.  */
-      if (insn == next)
-	return;
-
-      /* Make the dependence to NEXT, the last insn of the group, instead
-	 of the original ELEM.  */
-      elem = next;
-    }
-
-  /* Check that we don't already have this dependence.  */
-  for (link = LOG_LINKS (insn); link; link = XEXP (link, 1))
-    if (XEXP (link, 0) == elem)
-      {
-	/* If this is a more restrictive type of dependence than the existing
-	   one, then change the existing dependence to this type.  */
-	if ((int) dep_type < (int) REG_NOTE_KIND (link))
-	  PUT_REG_NOTE_KIND (link, dep_type);
-	return;
-      }
-  /* Might want to check one level of transitivity to save conses.  */
-
-  link = rtx_alloc (INSN_LIST);
-  /* Insn dependency, not data dependency.  */
-  PUT_REG_NOTE_KIND (link, dep_type);
-  XEXP (link, 0) = elem;
-  XEXP (link, 1) = LOG_LINKS (insn);
-  LOG_LINKS (insn) = link;
-}
-
-/* Remove ELEM wrapped in an INSN_LIST from the LOG_LINKS
-   of INSN.  Abort if not found.  */
-
-static void
-remove_dependence (insn, elem)
-     rtx insn;
-     rtx elem;
-{
-  rtx prev, link;
-  int found = 0;
-
-  for (prev = 0, link = LOG_LINKS (insn); link; link = XEXP (link, 1))
-    {
-      if (XEXP (link, 0) == elem)
-	{
-	  RTX_INTEGRATED_P (link) = 1;
-	  if (prev)
-	    XEXP (prev, 1) = XEXP (link, 1);
-	  else
-	    LOG_LINKS (insn) = XEXP (link, 1);
-	  found = 1;
-	}
-      else
-	prev = link;
-    }
-
-  if (! found)
-    abort ();
-  return;
-}
-
-#ifndef __GNUC__
-#define __inline
-#endif
-
-/* Computation of memory dependencies.  */
-
-/* The *_insns and *_mems are paired lists.  Each pending memory operation
-   will have a pointer to the MEM rtx on one list and a pointer to the
-   containing insn on the other list in the same place in the list.  */
-
-/* We can't use add_dependence like the old code did, because a single insn
-   may have multiple memory accesses, and hence needs to be on the list
-   once for each memory access.  Add_dependence won't let you add an insn
-   to a list more than once.  */
-
-/* An INSN_LIST containing all insns with pending read operations.  */
-static rtx pending_read_insns;
-
-/* An EXPR_LIST containing all MEM rtx's which are pending reads.  */
-static rtx pending_read_mems;
-
-/* An INSN_LIST containing all insns with pending write operations.  */
-static rtx pending_write_insns;
-
-/* An EXPR_LIST containing all MEM rtx's which are pending writes.  */
-static rtx pending_write_mems;
-
-/* Indicates the combined length of the two pending lists.  We must prevent
-   these lists from ever growing too large since the number of dependencies
-   produced is at least O(N*N), and execution time is at least O(4*N*N), as
-   a function of the length of these pending lists.  */
-
-static int pending_lists_length;
-
-/* 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;
-
-/* The last insn upon which all memory references must depend.
-   This is an insn which flushed the pending lists, creating a dependency
-   between it and all previously pending memory references.  This creates
-   a barrier (or a checkpoint) which no memory reference is allowed to cross.
-
-   This includes all non constant CALL_INSNs.  When we do interprocedural
-   alias analysis, this restriction can be relaxed.
-   This may also be an INSN that writes memory if the pending lists grow
-   too large.  */
-
-static rtx last_pending_memory_flush;
-
-/* The last function call we have seen.  All hard regs, and, of course,
-   the last function call, must depend on this.  */
-
-static rtx last_function_call;
-
-/* The LOG_LINKS field of this is a list of insns which use a pseudo register
-   that does not already cross a call.  We create dependencies between each
-   of those insn and the next call insn, to ensure that they won't cross a call
-   after scheduling is done.  */
-
-static rtx sched_before_next_call;
-
-/* Pointer to the last instruction scheduled.  Used by rank_for_schedule,
-   so that insns independent of the last scheduled insn will be preferred
-   over dependent instructions.  */
-
-static rtx last_scheduled_insn;
-
-/* Process an insn's memory dependencies.  There are four kinds of
-   dependencies:
-
-   (0) read dependence: read follows read
-   (1) true dependence: read follows write
-   (2) anti dependence: write follows read
-   (3) output dependence: write follows write
-
-   We are careful to build only dependencies which actually exist, and
-   use transitivity to avoid building too many links.  */
-
-/* Return the INSN_LIST containing INSN in LIST, or NULL
-   if LIST does not contain INSN.  */
-
-__inline static rtx
-find_insn_list (insn, list)
-     rtx insn;
-     rtx list;
-{
-  while (list)
-    {
-      if (XEXP (list, 0) == insn)
-	return list;
-      list = XEXP (list, 1);
-    }
-  return 0;
-}
-
-/* Compute the function units used by INSN.  This caches the value
-   returned by function_units_used.  A function unit is encoded as the
-   unit number if the value is non-negative and the compliment of a
-   mask if the value is negative.  A function unit index is the
-   non-negative encoding.  */
-
-__inline static int
-insn_unit (insn)
-     rtx insn;
-{
-  register int unit = INSN_UNIT (insn);
-
-  if (unit == 0)
-    {
-      recog_memoized (insn);
-
-      /* A USE insn, or something else we don't need to understand.
-	 We can't pass these directly to function_units_used because it will
-	 trigger a fatal error for unrecognizable insns.  */
-      if (INSN_CODE (insn) < 0)
-	unit = -1;
-      else
-	{
-	  unit = function_units_used (insn);
-	  /* Increment non-negative values so we can cache zero.  */
-	  if (unit >= 0) unit++;
-	}
-      /* We only cache 16 bits of the result, so if the value is out of
-	 range, don't cache it.  */
-      if (FUNCTION_UNITS_SIZE < HOST_BITS_PER_SHORT
-	  || unit >= 0
-	  || (unit & ~((1 << (HOST_BITS_PER_SHORT - 1)) - 1)) == 0)
-      INSN_UNIT (insn) = unit;
-    }
-  return (unit > 0 ? unit - 1 : unit);
-}
-
-/* Compute the blockage range for executing INSN on UNIT.  This caches
-   the value returned by the blockage_range_function for the unit.
-   These values are encoded in an int where the upper half gives the
-   minimum value and the lower half gives the maximum value.  */
-
-__inline static unsigned int
-blockage_range (unit, insn)
-     int unit;
-     rtx insn;
-{
-  unsigned int blockage = INSN_BLOCKAGE (insn);
-  unsigned int range;
-
-  if ((int) UNIT_BLOCKED (blockage) != unit + 1)
-    {
-      range = function_units[unit].blockage_range_function (insn);
-      /* We only cache the blockage range for one unit and then only if
-	 the values fit.  */
-      if (HOST_BITS_PER_INT >= UNIT_BITS + 2 * BLOCKAGE_BITS)
-	INSN_BLOCKAGE (insn) = ENCODE_BLOCKAGE (unit + 1, range);
-    }
-  else
-    range = BLOCKAGE_RANGE (blockage);
-
-  return range;
-}
-
-/* A vector indexed by function unit instance giving the last insn to use
-   the unit.  The value of the function unit instance index for unit U
-   instance I is (U + I * FUNCTION_UNITS_SIZE).  */
-static rtx unit_last_insn[FUNCTION_UNITS_SIZE * MAX_MULTIPLICITY];
-
-/* A vector indexed by function unit instance giving the minimum time when
-   the unit will unblock based on the maximum blockage cost.  */
-static int unit_tick[FUNCTION_UNITS_SIZE * MAX_MULTIPLICITY];
-
-/* A vector indexed by function unit number giving the number of insns
-   that remain to use the unit.  */
-static int unit_n_insns[FUNCTION_UNITS_SIZE];
-
-/* Reset the function unit state to the null state.  */
-
-static void
-clear_units ()
-{
-  bzero ((char *) unit_last_insn, sizeof (unit_last_insn));
-  bzero ((char *) unit_tick, sizeof (unit_tick));
-  bzero ((char *) unit_n_insns, sizeof (unit_n_insns));
-}
-
-/* Record an insn as one that will use the units encoded by UNIT.  */
-
-__inline static void
-prepare_unit (unit)
-     int unit;
-{
-  int i;
-
-  if (unit >= 0)
-    unit_n_insns[unit]++;
-  else
-    for (i = 0, unit = ~unit; unit; i++, unit >>= 1)
-      if ((unit & 1) != 0)
-	prepare_unit (i);
-}
-
-/* Return the actual hazard cost of executing INSN on the unit UNIT,
-   instance INSTANCE at time CLOCK if the previous actual hazard cost
-   was COST.  */
-
-__inline static int
-actual_hazard_this_instance (unit, instance, insn, clock, cost)
-     int unit, instance, clock, cost;
-     rtx insn;
-{
-  int tick = unit_tick[instance];
-
-  if (tick - clock > cost)
-    {
-      /* The scheduler is operating in reverse, so INSN is the executing
-	 insn and the unit's last insn is the candidate insn.  We want a
-	 more exact measure of the blockage if we execute INSN at CLOCK
-	 given when we committed the execution of the unit's last insn.
-
-	 The blockage value is given by either the unit's max blockage
-	 constant, blockage range function, or blockage function.  Use
-	 the most exact form for the given unit.  */
-
-      if (function_units[unit].blockage_range_function)
-	{
-	  if (function_units[unit].blockage_function)
-	    tick += (function_units[unit].blockage_function
-		     (insn, unit_last_insn[instance])
-		     - function_units[unit].max_blockage);
-	  else
-	    tick += ((int) MAX_BLOCKAGE_COST (blockage_range (unit, insn))
-		     - function_units[unit].max_blockage);
-	}
-      if (tick - clock > cost)
-	cost = tick - clock;
-    }
-  return cost;
-}
-
-/* Record INSN as having begun execution on the units encoded by UNIT at
-   time CLOCK.  */
-
-__inline static void
-schedule_unit (unit, insn, clock)
-     int unit, clock;
-     rtx insn;
-{
-  int i;
-
-  if (unit >= 0)
-    {
-      int instance = unit;
-#if MAX_MULTIPLICITY > 1
-      /* Find the first free instance of the function unit and use that
-	 one.  We assume that one is free.  */
-      for (i = function_units[unit].multiplicity - 1; i > 0; i--)
-	{
-	  if (! actual_hazard_this_instance (unit, instance, insn, clock, 0))
-	    break;
-	  instance += FUNCTION_UNITS_SIZE;
-	}
-#endif
-      unit_last_insn[instance] = insn;
-      unit_tick[instance] = (clock + function_units[unit].max_blockage);
-    }
-  else
-    for (i = 0, unit = ~unit; unit; i++, unit >>= 1)
-      if ((unit & 1) != 0)
-	schedule_unit (i, insn, clock);
-}
-
-/* Return the actual hazard cost of executing INSN on the units encoded by
-   UNIT at time CLOCK if the previous actual hazard cost was COST.  */
-
-__inline static int
-actual_hazard (unit, insn, clock, cost)
-     int unit, clock, cost;
-     rtx insn;
-{
-  int i;
-
-  if (unit >= 0)
-    {
-      /* Find the instance of the function unit with the minimum hazard.  */
-      int instance = unit;
-      int best_cost = actual_hazard_this_instance (unit, instance, insn,
-						   clock, cost);
-#if MAX_MULTIPLICITY > 1
-      int this_cost;
-
-      if (best_cost > cost)
-	{
-	  for (i = function_units[unit].multiplicity - 1; i > 0; i--)
-	    {
-	      instance += FUNCTION_UNITS_SIZE;
-	      this_cost = actual_hazard_this_instance (unit, instance, insn,
-						       clock, cost);
-	      if (this_cost < best_cost)
-		{
-		  best_cost = this_cost;
-		  if (this_cost <= cost)
-		    break;
-		}
-	    }
-	}
-#endif
-      cost = MAX (cost, best_cost);
-    }
-  else
-    for (i = 0, unit = ~unit; unit; i++, unit >>= 1)
-      if ((unit & 1) != 0)
-	cost = actual_hazard (i, insn, clock, cost);
-
-  return cost;
-}
-
-/* Return the potential hazard cost of executing an instruction on the
-   units encoded by UNIT if the previous potential hazard cost was COST.
-   An insn with a large blockage time is chosen in preference to one
-   with a smaller time; an insn that uses a unit that is more likely
-   to be used is chosen in preference to one with a unit that is less
-   used.  We are trying to minimize a subsequent actual hazard.  */
-
-__inline static int
-potential_hazard (unit, insn, cost)
-     int unit, cost;
-     rtx insn;
-{
-  int i, ncost;
-  unsigned int minb, maxb;
-
-  if (unit >= 0)
-    {
-      minb = maxb = function_units[unit].max_blockage;
-      if (maxb > 1)
-	{
-	  if (function_units[unit].blockage_range_function)
-	    {
-	      maxb = minb = blockage_range (unit, insn);
-	      maxb = MAX_BLOCKAGE_COST (maxb);
-	      minb = MIN_BLOCKAGE_COST (minb);
-	    }
-
-	  if (maxb > 1)
-	    {
-	      /* Make the number of instructions left dominate.  Make the
-		 minimum delay dominate the maximum delay.  If all these
-		 are the same, use the unit number to add an arbitrary
-		 ordering.  Other terms can be added.  */
-	      ncost = minb * 0x40 + maxb;
-	      ncost *= (unit_n_insns[unit] - 1) * 0x1000 + unit;
-	      if (ncost > cost)
-		cost = ncost;
-	    }
-	}
-    }
-  else
-    for (i = 0, unit = ~unit; unit; i++, unit >>= 1)
-      if ((unit & 1) != 0)
-	cost = potential_hazard (i, insn, cost);
-
-  return cost;
-}
-
-/* Compute cost of executing INSN given the dependence LINK on the insn USED.
-   This is the number of virtual cycles taken between instruction issue and
-   instruction results.  */
-
-__inline static int
-insn_cost (insn, link, used)
-     rtx insn, link, used;
-{
-  register int cost = INSN_COST (insn);
-
-  if (cost == 0)
-    {
-      recog_memoized (insn);
-
-      /* A USE insn, or something else we don't need to understand.
-	 We can't pass these directly to result_ready_cost because it will
-	 trigger a fatal error for unrecognizable insns.  */
-      if (INSN_CODE (insn) < 0)
-	{
-	  INSN_COST (insn) = 1;
-	  return 1;
-	}
-      else
-	{
-	  cost = result_ready_cost (insn);
-
-	  if (cost < 1)
-	    cost = 1;
-
-	  INSN_COST (insn) = cost;
-	}
-    }
-
-  /* A USE insn should never require the value used to be computed.  This
-     allows the computation of a function's result and parameter values to
-     overlap the return and call.  */
-  recog_memoized (used);
-  if (INSN_CODE (used) < 0)
-    LINK_COST_FREE (link) = 1;
-
-  /* If some dependencies vary the cost, compute the adjustment.  Most
-     commonly, the adjustment is complete: either the cost is ignored
-     (in the case of an output- or anti-dependence), or the cost is
-     unchanged.  These values are cached in the link as LINK_COST_FREE
-     and LINK_COST_ZERO.  */
-
-  if (LINK_COST_FREE (link))
-    cost = 1;
-#ifdef ADJUST_COST
-  else if (! LINK_COST_ZERO (link))
-    {
-      int ncost = cost;
-
-      ADJUST_COST (used, link, insn, ncost);
-      if (ncost <= 1)
-	LINK_COST_FREE (link) = ncost = 1;
-      if (cost == ncost)
-	LINK_COST_ZERO (link) = 1;
-      cost = ncost;
-    }
-#endif
-  return cost;
-}
-
-/* Compute the priority number for INSN.  */
-
-static int
-priority (insn)
-     rtx insn;
-{
-  if (insn && GET_RTX_CLASS (GET_CODE (insn)) == 'i')
-    {
-      int prev_priority;
-      int max_priority;
-      int this_priority = INSN_PRIORITY (insn);
-      rtx prev;
-
-      if (this_priority > 0)
-	return this_priority;
-
-      max_priority = 1;
-
-      /* Nonzero if these insns must be scheduled together.  */
-      if (SCHED_GROUP_P (insn))
-	{
-	  prev = insn;
-	  while (SCHED_GROUP_P (prev))
-	    {
-	      prev = PREV_INSN (prev);
-	      INSN_REF_COUNT (prev) += 1;
-	    }
-	}
-
-      for (prev = LOG_LINKS (insn); prev; prev = XEXP (prev, 1))
-	{
-	  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
-	     obsolete, because sched_analyze_insn will have created any
-	     necessary new dependences which replace it.  Notes and deleted
-	     insns can be created when instructions are deleted by insn
-	     splitting, or by register allocation.  */
-	  if (GET_CODE (x) == NOTE || INSN_DELETED_P (x))
-	    {
-	      remove_dependence (insn, x);
-	      continue;
-	    }
-
-	  /* Clear the link cost adjustment bits.  */
-	  LINK_COST_FREE (prev) = 0;
-#ifdef ADJUST_COST
-	  LINK_COST_ZERO (prev) = 0;
-#endif
-
-	  /* This priority calculation was chosen because it results in the
-	     least instruction movement, and does not hurt the performance
-	     of the resulting code compared to the old algorithm.
-	     This makes the sched algorithm more stable, which results
-	     in better code, because there is less register pressure,
-	     cross jumping is more likely to work, and debugging is easier.
-
-	     When all instructions have a latency of 1, there is no need to
-	     move any instructions.  Subtracting one here ensures that in such
-	     cases all instructions will end up with a priority of one, and
-	     hence no scheduling will be done.
-
-	     The original code did not subtract the one, and added the
-	     insn_cost of the current instruction to its priority (e.g.
-	     move the insn_cost call down to the end).  */
-
-	  prev_priority = priority (x) + insn_cost (x, prev, insn) - 1;
-
-	  if (prev_priority > max_priority)
-	    max_priority = prev_priority;
-	  INSN_REF_COUNT (x) += 1;
-	}
-
-      prepare_unit (insn_unit (insn));
-      INSN_PRIORITY (insn) = max_priority;
-      return INSN_PRIORITY (insn);
-    }
-  return 0;
-}
-
-/* Remove all INSN_LISTs and EXPR_LISTs from the pending lists and add
-   them to the unused_*_list variables, so that they can be reused.  */
-
-static void
-free_pending_lists ()
-{
-  register rtx link, prev_link;
-
-  if (pending_read_insns)
-    {
-      prev_link = pending_read_insns;
-      link = XEXP (prev_link, 1);
-
-      while (link)
-	{
-	  prev_link = link;
-	  link = XEXP (link, 1);
-	}
-
-      XEXP (prev_link, 1) = unused_insn_list;
-      unused_insn_list = pending_read_insns;
-      pending_read_insns = 0;
-    }
-
-  if (pending_write_insns)
-    {
-      prev_link = pending_write_insns;
-      link = XEXP (prev_link, 1);
-
-      while (link)
-	{
-	  prev_link = link;
-	  link = XEXP (link, 1);
-	}
-
-      XEXP (prev_link, 1) = unused_insn_list;
-      unused_insn_list = pending_write_insns;
-      pending_write_insns = 0;
-    }
-
-  if (pending_read_mems)
-    {
-      prev_link = pending_read_mems;
-      link = XEXP (prev_link, 1);
-
-      while (link)
-	{
-	  prev_link = link;
-	  link = XEXP (link, 1);
-	}
-
-      XEXP (prev_link, 1) = unused_expr_list;
-      unused_expr_list = pending_read_mems;
-      pending_read_mems = 0;
-    }
-
-  if (pending_write_mems)
-    {
-      prev_link = pending_write_mems;
-      link = XEXP (prev_link, 1);
-
-      while (link)
-	{
-	  prev_link = link;
-	  link = XEXP (link, 1);
-	}
-
-      XEXP (prev_link, 1) = unused_expr_list;
-      unused_expr_list = pending_write_mems;
-      pending_write_mems = 0;
-    }
-}
-
-/* Add an INSN and MEM reference pair to a pending INSN_LIST and MEM_LIST.
-   The MEM is a memory reference contained within INSN, which we are saving
-   so that we can do memory aliasing on it.  */
-
-static void
-add_insn_mem_dependence (insn_list, mem_list, insn, mem)
-     rtx *insn_list, *mem_list, insn, mem;
-{
-  register rtx link;
-
-  if (unused_insn_list)
-    {
-      link = unused_insn_list;
-      unused_insn_list = XEXP (link, 1);
-    }
-  else
-    link = rtx_alloc (INSN_LIST);
-  XEXP (link, 0) = insn;
-  XEXP (link, 1) = *insn_list;
-  *insn_list = link;
-
-  if (unused_expr_list)
-    {
-      link = unused_expr_list;
-      unused_expr_list = XEXP (link, 1);
-    }
-  else
-    link = rtx_alloc (EXPR_LIST);
-  XEXP (link, 0) = mem;
-  XEXP (link, 1) = *mem_list;
-  *mem_list = link;
-
-  pending_lists_length++;
-}
-
-/* Make a dependency between every memory reference on the pending lists
-   and INSN, thus flushing the pending lists.  If ONLY_WRITE, don't flush
-   the read list.  */
-
-static void
-flush_pending_lists (insn, only_write)
-     rtx insn;
-     int only_write;
-{
-  rtx link;
-
-  while (pending_read_insns && ! only_write)
-    {
-      add_dependence (insn, XEXP (pending_read_insns, 0), REG_DEP_ANTI);
-
-      link = pending_read_insns;
-      pending_read_insns = XEXP (pending_read_insns, 1);
-      XEXP (link, 1) = unused_insn_list;
-      unused_insn_list = link;
-
-      link = pending_read_mems;
-      pending_read_mems = XEXP (pending_read_mems, 1);
-      XEXP (link, 1) = unused_expr_list;
-      unused_expr_list = link;
-    }
-  while (pending_write_insns)
-    {
-      add_dependence (insn, XEXP (pending_write_insns, 0), REG_DEP_ANTI);
-
-      link = pending_write_insns;
-      pending_write_insns = XEXP (pending_write_insns, 1);
-      XEXP (link, 1) = unused_insn_list;
-      unused_insn_list = link;
-
-      link = pending_write_mems;
-      pending_write_mems = XEXP (pending_write_mems, 1);
-      XEXP (link, 1) = unused_expr_list;
-      unused_expr_list = link;
-    }
-  pending_lists_length = 0;
-
-  if (last_pending_memory_flush)
-    add_dependence (insn, last_pending_memory_flush, REG_DEP_ANTI);
-
-  last_pending_memory_flush = insn;
-}
-
-/* Analyze a single SET or CLOBBER rtx, X, creating all dependencies generated
-   by the write to the destination of X, and reads of everything mentioned.  */
-
-static void
-sched_analyze_1 (x, insn)
-     rtx x;
-     rtx insn;
-{
-  register int regno;
-  register rtx dest = SET_DEST (x);
-
-  if (dest == 0)
-    return;
-
-  while (GET_CODE (dest) == STRICT_LOW_PART || GET_CODE (dest) == SUBREG
-	 || GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SIGN_EXTRACT)
-    {
-      if (GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SIGN_EXTRACT)
-	{
-	  /* The second and third arguments are values read by this insn.  */
-	  sched_analyze_2 (XEXP (dest, 1), insn);
-	  sched_analyze_2 (XEXP (dest, 2), insn);
-	}
-      dest = SUBREG_REG (dest);
-    }
-
-  if (GET_CODE (dest) == REG)
-    {
-      register int i;
-
-      regno = REGNO (dest);
-
-      /* A hard reg in a wide mode may really be multiple registers.
-	 If so, mark all of them just like the first.  */
-      if (regno < FIRST_PSEUDO_REGISTER)
-	{
-	  i = HARD_REGNO_NREGS (regno, GET_MODE (dest));
-	  while (--i >= 0)
-	    {
-	      rtx u;
-
-	      for (u = reg_last_uses[regno+i]; u; u = XEXP (u, 1))
-		add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
-	      reg_last_uses[regno + i] = 0;
-	      if (reg_last_sets[regno + i])
-		add_dependence (insn, reg_last_sets[regno + i],
-				REG_DEP_OUTPUT);
-	      SET_REGNO_REG_SET (reg_pending_sets, regno + i);
-	      if ((call_used_regs[i] || global_regs[i])
-		  && last_function_call)
-		/* Function calls clobber all call_used regs.  */
-		add_dependence (insn, last_function_call, REG_DEP_ANTI);
-	    }
-	}
-      else
-	{
-	  rtx u;
-
-	  for (u = reg_last_uses[regno]; u; u = XEXP (u, 1))
-	    add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
-	  reg_last_uses[regno] = 0;
-	  if (reg_last_sets[regno])
-	    add_dependence (insn, reg_last_sets[regno], REG_DEP_OUTPUT);
-	  SET_REGNO_REG_SET (reg_pending_sets, regno);
-
-	  /* Pseudos that are REG_EQUIV to something may be replaced
-	     by that during reloading.  We need only add dependencies for
-	     the address in the REG_EQUIV note.  */
-	  if (! reload_completed
-	      && reg_known_equiv_p[regno]
-	      && GET_CODE (reg_known_value[regno]) == MEM)
-	    sched_analyze_2 (XEXP (reg_known_value[regno], 0), insn);
-
-	  /* Don't let it cross a call after scheduling if it doesn't
-	     already cross one.  */
-	  if (REG_N_CALLS_CROSSED (regno) == 0 && last_function_call)
-	    add_dependence (insn, last_function_call, REG_DEP_ANTI);
-	}
-    }
-  else if (GET_CODE (dest) == MEM)
-    {
-      /* Writing memory.  */
-
-      if (pending_lists_length > 32)
-	{
-	  /* Flush all pending reads and writes to prevent the pending lists
-	     from getting any larger.  Insn scheduling runs too slowly when
-	     these lists get long.  The number 32 was chosen because it
-	     seems like a reasonable number.  When compiling GCC with itself,
-	     this flush occurs 8 times for sparc, and 10 times for m88k using
-	     the number 32.  */
-	  flush_pending_lists (insn, 0);
-	}
-      else
-	{
-	  rtx pending, pending_mem;
-
-	  pending = pending_read_insns;
-	  pending_mem = pending_read_mems;
-	  while (pending)
-	    {
-	      /* If a dependency already exists, don't create a new one.  */
-	      if (! find_insn_list (XEXP (pending, 0), LOG_LINKS (insn)))
-		if (anti_dependence (XEXP (pending_mem, 0), dest))
-		  add_dependence (insn, XEXP (pending, 0), REG_DEP_ANTI);
-
-	      pending = XEXP (pending, 1);
-	      pending_mem = XEXP (pending_mem, 1);
-	    }
-
-	  pending = pending_write_insns;
-	  pending_mem = pending_write_mems;
-	  while (pending)
-	    {
-	      /* If a dependency already exists, don't create a new one.  */
-	      if (! find_insn_list (XEXP (pending, 0), LOG_LINKS (insn)))
-		if (output_dependence (XEXP (pending_mem, 0), dest))
-		  add_dependence (insn, XEXP (pending, 0), REG_DEP_OUTPUT);
-
-	      pending = XEXP (pending, 1);
-	      pending_mem = XEXP (pending_mem, 1);
-	    }
-
-	  if (last_pending_memory_flush)
-	    add_dependence (insn, last_pending_memory_flush, REG_DEP_ANTI);
-
-	  add_insn_mem_dependence (&pending_write_insns, &pending_write_mems,
-				   insn, dest);
-	}
-      sched_analyze_2 (XEXP (dest, 0), insn);
-    }
-
-  /* Analyze reads.  */
-  if (GET_CODE (x) == SET)
-    sched_analyze_2 (SET_SRC (x), insn);
-}
-
-/* Analyze the uses of memory and registers in rtx X in INSN.  */
-
-static void
-sched_analyze_2 (x, insn)
-     rtx x;
-     rtx insn;
-{
-  register int i;
-  register int j;
-  register enum rtx_code code;
-  register const char *fmt;
-
-  if (x == 0)
-    return;
-
-  code = GET_CODE (x);
-
-  switch (code)
-    {
-    case CONST_INT:
-    case CONST_DOUBLE:
-    case SYMBOL_REF:
-    case CONST:
-    case LABEL_REF:
-      /* Ignore constants.  Note that we must handle CONST_DOUBLE here
-	 because it may have a cc0_rtx in its CONST_DOUBLE_CHAIN field, but
-	 this does not mean that this insn is using cc0.  */
-      return;
-
-#ifdef HAVE_cc0
-    case CC0:
-      {
-	rtx link, prev;
-
-	/* User of CC0 depends on immediately preceding insn.  */
-	SCHED_GROUP_P (insn) = 1;
-
-	/* There may be a note before this insn now, but all notes will
-	   be removed before we actually try to schedule the insns, so
-	   it won't cause a problem later.  We must avoid it here though.  */
-	prev = prev_nonnote_insn (insn);
-
-	/* Make a copy of all dependencies on the immediately previous insn,
-	   and add to this insn.  This is so that all the dependencies will
-	   apply to the group.  Remove an explicit dependence on this insn
-	   as SCHED_GROUP_P now represents it.  */
-
-	if (find_insn_list (prev, LOG_LINKS (insn)))
-	  remove_dependence (insn, prev);
-
-	for (link = LOG_LINKS (prev); link; link = XEXP (link, 1))
-	  add_dependence (insn, XEXP (link, 0), REG_NOTE_KIND (link));
-
-	return;
-      }
-#endif
-
-    case REG:
-      {
-	int regno = REGNO (x);
-	if (regno < FIRST_PSEUDO_REGISTER)
-	  {
-	    int i;
-
-	    i = HARD_REGNO_NREGS (regno, GET_MODE (x));
-	    while (--i >= 0)
-	      {
-		reg_last_uses[regno + i]
-		  = gen_rtx_INSN_LIST (VOIDmode,
-				       insn, reg_last_uses[regno + i]);
-		if (reg_last_sets[regno + i])
-		  add_dependence (insn, reg_last_sets[regno + i], 0);
-		if ((call_used_regs[regno + i] || global_regs[regno + i])
-		    && last_function_call)
-		  /* Function calls clobber all call_used regs.  */
-		  add_dependence (insn, last_function_call, REG_DEP_ANTI);
-	      }
-	  }
-	else
-	  {
-	    reg_last_uses[regno]
-	      = gen_rtx_INSN_LIST (VOIDmode, insn, reg_last_uses[regno]);
-	    if (reg_last_sets[regno])
-	      add_dependence (insn, reg_last_sets[regno], 0);
-
-	    /* Pseudos that are REG_EQUIV to something may be replaced
-	       by that during reloading.  We need only add dependencies for
-	       the address in the REG_EQUIV note.  */
-	    if (! reload_completed
-		&& reg_known_equiv_p[regno]
-		&& GET_CODE (reg_known_value[regno]) == MEM)
-	      sched_analyze_2 (XEXP (reg_known_value[regno], 0), insn);
-
-	    /* If the register does not already cross any calls, then add this
-	       insn to the sched_before_next_call list so that it will still
-	       not cross calls after scheduling.  */
-	    if (REG_N_CALLS_CROSSED (regno) == 0)
-	      add_dependence (sched_before_next_call, insn, REG_DEP_ANTI);
-	  }
-	return;
-      }
-
-    case MEM:
-      {
-	/* Reading memory.  */
-
-	rtx pending, pending_mem;
-
-	pending = pending_read_insns;
-	pending_mem = pending_read_mems;
-	while (pending)
-	  {
-	    /* If a dependency already exists, don't create a new one.  */
-	    if (! find_insn_list (XEXP (pending, 0), LOG_LINKS (insn)))
-	      if (read_dependence (XEXP (pending_mem, 0), x))
-		add_dependence (insn, XEXP (pending, 0), REG_DEP_ANTI);
-
-	    pending = XEXP (pending, 1);
-	    pending_mem = XEXP (pending_mem, 1);
-	  }
-
-	pending = pending_write_insns;
-	pending_mem = pending_write_mems;
-	while (pending)
-	  {
-	    /* If a dependency already exists, don't create a new one.  */
-	    if (! find_insn_list (XEXP (pending, 0), LOG_LINKS (insn)))
-	      if (true_dependence (XEXP (pending_mem, 0), VOIDmode,
-				   x, rtx_varies_p))
-		add_dependence (insn, XEXP (pending, 0), 0);
-
-	    pending = XEXP (pending, 1);
-	    pending_mem = XEXP (pending_mem, 1);
-	  }
-	if (last_pending_memory_flush)
-	  add_dependence (insn, last_pending_memory_flush, REG_DEP_ANTI);
-
-	/* Always add these dependencies to pending_reads, since
-	   this insn may be followed by a write.  */
-	add_insn_mem_dependence (&pending_read_insns, &pending_read_mems,
-				 insn, x);
-
-	/* Take advantage of tail recursion here.  */
-	sched_analyze_2 (XEXP (x, 0), insn);
-	return;
-      }
-
-    case ASM_OPERANDS:
-    case ASM_INPUT:
-    case UNSPEC_VOLATILE:
-    case TRAP_IF:
-      {
-	rtx u;
-
-	/* Traditional and volatile asm instructions must be considered to use
-	   and clobber all hard registers, all pseudo-registers and all of
-	   memory.  So must TRAP_IF and UNSPEC_VOLATILE operations.
-
-	   Consider for instance a volatile asm that changes the fpu rounding
-	   mode.  An insn should not be moved across this even if it only uses
-	   pseudo-regs because it might give an incorrectly rounded result.  */
-	if (code != ASM_OPERANDS || MEM_VOLATILE_P (x))
-	  {
-	    int max_reg = max_reg_num ();
-	    for (i = 0; i < max_reg; i++)
-	      {
-		for (u = reg_last_uses[i]; u; u = XEXP (u, 1))
-		  add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
-		reg_last_uses[i] = 0;
-		if (reg_last_sets[i])
-		  add_dependence (insn, reg_last_sets[i], 0);
-	      }
-	    reg_pending_sets_all = 1;
-
-	    flush_pending_lists (insn, 0);
-	  }
-
-	/* For all ASM_OPERANDS, we must traverse the vector of input operands.
-	   We can not just fall through here since then we would be confused
-	   by the ASM_INPUT rtx inside ASM_OPERANDS, which do not indicate
-	   traditional asms unlike their normal usage.  */
-
-	if (code == ASM_OPERANDS)
-	  {
-	    for (j = 0; j < ASM_OPERANDS_INPUT_LENGTH (x); j++)
-	      sched_analyze_2 (ASM_OPERANDS_INPUT (x, j), insn);
-	    return;
-	  }
-	break;
-      }
-
-    case PRE_DEC:
-    case POST_DEC:
-    case PRE_INC:
-    case POST_INC:
-      /* These both read and modify the result.  We must handle them as writes
-	 to get proper dependencies for following instructions.  We must handle
-	 them as reads to get proper dependencies from this to previous
-	 instructions.  Thus we need to pass them to both sched_analyze_1
-	 and sched_analyze_2.  We must call sched_analyze_2 first in order
-	 to get the proper antecedent for the read.  */
-      sched_analyze_2 (XEXP (x, 0), insn);
-      sched_analyze_1 (x, insn);
-      return;
-      
-    default:
-      break;
-    }
-
-  /* Other cases: walk the insn.  */
-  fmt = GET_RTX_FORMAT (code);
-  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
-    {
-      if (fmt[i] == 'e')
-	sched_analyze_2 (XEXP (x, i), insn);
-      else if (fmt[i] == 'E')
-	for (j = 0; j < XVECLEN (x, i); j++)
-	  sched_analyze_2 (XVECEXP (x, i, j), insn);
-    }
-}
-
-/* Analyze an INSN with pattern X to find all dependencies.  */
-
-static void
-sched_analyze_insn (x, insn, loop_notes)
-     rtx x, insn;
-     rtx loop_notes;
-{
-  register RTX_CODE code = GET_CODE (x);
-  rtx link;
-  int maxreg = max_reg_num ();
-  int i;
-
-  if (code == SET || code == CLOBBER)
-    sched_analyze_1 (x, insn);
-  else if (code == PARALLEL)
-    {
-      register int i;
-      for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
-	{
-	  code = GET_CODE (XVECEXP (x, 0, i));
-	  if (code == SET || code == CLOBBER)
-	    sched_analyze_1 (XVECEXP (x, 0, i), insn);
-	  else
-	    sched_analyze_2 (XVECEXP (x, 0, i), insn);
-	}
-    }
-  else
-    sched_analyze_2 (x, insn);
-
-  /* Mark registers CLOBBERED or used by called function.  */
-  if (GET_CODE (insn) == CALL_INSN)
-    for (link = CALL_INSN_FUNCTION_USAGE (insn); link; link = XEXP (link, 1))
-      {
-	if (GET_CODE (XEXP (link, 0)) == CLOBBER)
-	  sched_analyze_1 (XEXP (link, 0), insn);
-	else
-	  sched_analyze_2 (XEXP (link, 0), insn);
-      }
-
-  /* If there is a {LOOP,EHREGION}_{BEG,END} note in the middle of a basic block, then
-     we must be sure that no instructions are scheduled across it.
-     Otherwise, the reg_n_refs info (which depends on loop_depth) would
-     become incorrect.  */
-
-  if (loop_notes)
-    {
-      int max_reg = max_reg_num ();
-      rtx link;
-
-      for (i = 0; i < max_reg; i++)
-	{
-	  rtx u;
-	  for (u = reg_last_uses[i]; u; u = XEXP (u, 1))
-	    add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
-	  reg_last_uses[i] = 0;
-	  if (reg_last_sets[i])
-	    add_dependence (insn, reg_last_sets[i], 0);
-	}
-      reg_pending_sets_all = 1;
-
-      flush_pending_lists (insn, 0);
-
-      link = loop_notes;
-      while (XEXP (link, 1))
-	link = XEXP (link, 1);
-      XEXP (link, 1) = REG_NOTES (insn);
-      REG_NOTES (insn) = loop_notes;
-    }
-
-  EXECUTE_IF_SET_IN_REG_SET (reg_pending_sets, 0, i,
-			     {
-			       reg_last_sets[i] = insn;
-			     });
-  CLEAR_REG_SET (reg_pending_sets);
-
-  if (reg_pending_sets_all)
-    {
-      for (i = 0; i < maxreg; i++)
-	reg_last_sets[i] = insn;
-      reg_pending_sets_all = 0;
-    }
-
-  /* Handle function calls and function returns created by the epilogue
-     threading code.  */
-  if (GET_CODE (insn) == CALL_INSN || GET_CODE (insn) == JUMP_INSN)
-    {
-      rtx dep_insn;
-      rtx prev_dep_insn;
-
-      /* When scheduling instructions, we make sure calls don't lose their
-	 accompanying USE insns by depending them one on another in order.
-
-	 Also, we must do the same thing for returns created by the epilogue
-	 threading code.  Note this code works only in this special case,
-	 because other passes make no guarantee that they will never emit
-	 an instruction between a USE and a RETURN.  There is such a guarantee
-	 for USE instructions immediately before a call.  */
-
-      prev_dep_insn = insn;
-      dep_insn = PREV_INSN (insn);
-      while (GET_CODE (dep_insn) == INSN
-	     && GET_CODE (PATTERN (dep_insn)) == USE
-	     && GET_CODE (XEXP (PATTERN (dep_insn), 0)) == REG)
-	{
-	  SCHED_GROUP_P (prev_dep_insn) = 1;
-
-	  /* Make a copy of all dependencies on dep_insn, and add to insn.
-	     This is so that all of the dependencies will apply to the
-	     group.  */
-
-	  for (link = LOG_LINKS (dep_insn); link; link = XEXP (link, 1))
-	    add_dependence (insn, XEXP (link, 0), REG_NOTE_KIND (link));
-
-	  prev_dep_insn = dep_insn;
-	  dep_insn = PREV_INSN (dep_insn);
-	}
-    }
-}
-
-/* Analyze every insn between HEAD and TAIL inclusive, creating LOG_LINKS
-   for every dependency.  */
-
-static int
-sched_analyze (head, tail)
-     rtx head, tail;
-{
-  register rtx insn;
-  register int n_insns = 0;
-  register rtx u;
-  register int luid = 0;
-  rtx loop_notes = 0;
-
-  for (insn = head; ; insn = NEXT_INSN (insn))
-    {
-      INSN_LUID (insn) = luid++;
-
-      if (GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN)
-	{
-	  sched_analyze_insn (PATTERN (insn), insn, loop_notes);
-	  loop_notes = 0;
-	  n_insns += 1;
-	}
-      else if (GET_CODE (insn) == CALL_INSN)
-	{
-	  rtx x;
-	  register int i;
-
-	  /* Any instruction using a hard register which may get clobbered
-	     by a call needs to be marked as dependent on this call.
-	     This prevents a use of a hard return reg from being moved
-	     past a void call (i.e. it does not explicitly set the hard
-	     return reg).  */
-
-	  /* If this call is followed by a NOTE_INSN_SETJMP, then assume that
-	     all registers, not just hard registers, may be clobbered by this
-	     call.  */
-
-	  /* Insn, being a CALL_INSN, magically depends on
-	     `last_function_call' already.  */
-
-	  if (NEXT_INSN (insn) && GET_CODE (NEXT_INSN (insn)) == NOTE
-	      && NOTE_LINE_NUMBER (NEXT_INSN (insn)) == NOTE_INSN_SETJMP)
-	    {
-	      int max_reg = max_reg_num ();
-	      for (i = 0; i < max_reg; i++)
-		{
-		  for (u = reg_last_uses[i]; u; u = XEXP (u, 1))
-		    add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
-		  reg_last_uses[i] = 0;
-		  if (reg_last_sets[i])
-		    add_dependence (insn, reg_last_sets[i], 0);
-		}
-	      reg_pending_sets_all = 1;
-
-	      /* Add a pair of fake REG_NOTEs which we will later
-		 convert back into a NOTE_INSN_SETJMP note.  See
-		 reemit_notes for why we use a pair of NOTEs.  */
-
-	      REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_DEAD,
-						    GEN_INT (0),
-						    REG_NOTES (insn));
-	      REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_DEAD,
-						    GEN_INT (NOTE_INSN_SETJMP),
-						    REG_NOTES (insn));
-	    }
-	  else
-	    {
-	      for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
-		if (call_used_regs[i] || global_regs[i])
-		  {
-		    for (u = reg_last_uses[i]; u; u = XEXP (u, 1))
-		      add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
-		    reg_last_uses[i] = 0;
-		    if (reg_last_sets[i])
-		      add_dependence (insn, reg_last_sets[i], REG_DEP_ANTI);
-		    SET_REGNO_REG_SET (reg_pending_sets, i);
-		  }
-	    }
-
-	  /* For each insn which shouldn't cross a call, add a dependence
-	     between that insn and this call insn.  */
-	  x = LOG_LINKS (sched_before_next_call);
-	  while (x)
-	    {
-	      add_dependence (insn, XEXP (x, 0), REG_DEP_ANTI);
-	      x = XEXP (x, 1);
-	    }
-	  LOG_LINKS (sched_before_next_call) = 0;
-
-	  sched_analyze_insn (PATTERN (insn), insn, loop_notes);
-	  loop_notes = 0;
-
-	  /* In the absence of interprocedural alias analysis, we must flush
-	     all pending reads and writes, and start new dependencies starting
-	     from here.  But only flush writes for constant calls (which may
-	     be passed a pointer to something we haven't written yet).  */
-	  flush_pending_lists (insn, CONST_CALL_P (insn));
-
-	  /* Depend this function call (actually, the user of this
-	     function call) on all hard register clobberage.  */
-	  last_function_call = insn;
-	  n_insns += 1;
-	}
-
-      /* See comments on reemit_notes as to why we do this.  */
-      else if (GET_CODE (insn) == NOTE
-	       && (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG
-		   || NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END
-		   || NOTE_LINE_NUMBER (insn) == NOTE_INSN_EH_REGION_BEG
-		   || NOTE_LINE_NUMBER (insn) == NOTE_INSN_EH_REGION_END
-		   || NOTE_LINE_NUMBER (insn) == NOTE_INSN_RANGE_START
-		   || NOTE_LINE_NUMBER (insn) == NOTE_INSN_RANGE_END
-		   || (NOTE_LINE_NUMBER (insn) == NOTE_INSN_SETJMP
-		       && GET_CODE (PREV_INSN (insn)) != CALL_INSN)))
-	{
-	  loop_notes = gen_rtx_EXPR_LIST (REG_DEAD,
-					  GEN_INT (NOTE_BLOCK_NUMBER (insn)),
-					  loop_notes);
-	  loop_notes = gen_rtx_EXPR_LIST (REG_DEAD,
-					  GEN_INT (NOTE_LINE_NUMBER (insn)),
-					  loop_notes);
-	  CONST_CALL_P (loop_notes) = CONST_CALL_P (insn);
-	}
-
-      if (insn == tail)
-	return n_insns;
-    }
-
-  abort ();
-}
-
-/* Called when we see a set of a register.  If death is true, then we are
-   scanning backwards.  Mark that register as unborn.  If nobody says
-   otherwise, that is how things will remain.  If death is false, then we
-   are scanning forwards.  Mark that register as being born.  */
-
-static void
-sched_note_set (x, death)
-     rtx x;
-     int death;
-{
-  register int regno;
-  register rtx reg = SET_DEST (x);
-  int subreg_p = 0;
-
-  if (reg == 0)
-    return;
-
-  while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == STRICT_LOW_PART
-	 || GET_CODE (reg) == SIGN_EXTRACT || GET_CODE (reg) == ZERO_EXTRACT)
-    {
-      /* Must treat modification of just one hardware register of a multi-reg
-	 value or just a byte field of a register exactly the same way that
-	 mark_set_1 in flow.c does, i.e. anything except a paradoxical subreg
-	 does not kill the entire register.  */
-      if (GET_CODE (reg) != SUBREG
-	  || REG_SIZE (SUBREG_REG (reg)) > REG_SIZE (reg))
-	subreg_p = 1;
-
-      reg = SUBREG_REG (reg);
-    }
-
-  if (GET_CODE (reg) != REG)
-    return;
-
-  /* Global registers are always live, so the code below does not apply
-     to them.  */
-
-  regno = REGNO (reg);
-  if (regno >= FIRST_PSEUDO_REGISTER || ! global_regs[regno])
-    {
-      if (death)
-	{
-	  /* If we only set part of the register, then this set does not
-	     kill it.  */
-	  if (subreg_p)
-	    return;
-
-	  /* Try killing this register.  */
-	  if (regno < FIRST_PSEUDO_REGISTER)
-	    {
-	      int j = HARD_REGNO_NREGS (regno, GET_MODE (reg));
-	      while (--j >= 0)
-		{
-		  CLEAR_REGNO_REG_SET (bb_live_regs, regno + j);
-		  SET_REGNO_REG_SET (bb_dead_regs, regno + j);
-		}
-	    }
-	  else
-	    {
-	      CLEAR_REGNO_REG_SET (bb_live_regs, regno);
-	      SET_REGNO_REG_SET (bb_dead_regs, regno);
-	    }
-	}
-      else
-	{
-	  /* Make the register live again.  */
-	  if (regno < FIRST_PSEUDO_REGISTER)
-	    {
-	      int j = HARD_REGNO_NREGS (regno, GET_MODE (reg));
-	      while (--j >= 0)
-		{
-		  SET_REGNO_REG_SET (bb_live_regs, regno + j);
-		  CLEAR_REGNO_REG_SET (bb_dead_regs, regno + j);
-		}
-	    }
-	  else
-	    {
-	      SET_REGNO_REG_SET (bb_live_regs, regno);
-	      CLEAR_REGNO_REG_SET (bb_dead_regs, regno);
-	    }
-	}
-    }
-}
-
-/* Macros and functions for keeping the priority queue sorted, and
-   dealing with queueing and dequeueing of instructions.  */
-
-#define SCHED_SORT(READY, NEW_READY, OLD_READY) \
-  do { if ((NEW_READY) - (OLD_READY) == 1)				\
-	 swap_sort (READY, NEW_READY);					\
-       else if ((NEW_READY) - (OLD_READY) > 1)				\
-	 qsort (READY, NEW_READY, sizeof (rtx), rank_for_schedule); }	\
-  while (0)
-
-/* Returns a positive value if y is preferred; returns a negative value if
-   x is preferred.  Should never return 0, since that will make the sort
-   unstable.  */
-
-static int
-rank_for_schedule (x, y)
-     const GENERIC_PTR x;
-     const GENERIC_PTR y;
-{
-  rtx tmp = *(rtx *)y;
-  rtx tmp2 = *(rtx *)x;
-  rtx link;
-  int tmp_class, tmp2_class;
-  int value;
-
-  /* Choose the instruction with the highest priority, if different.  */
-  if ((value = INSN_PRIORITY (tmp) - INSN_PRIORITY (tmp2)))
-    return value;
-
-  if (last_scheduled_insn)
-    {
-      /* Classify the instructions into three classes:
-	 1) Data dependent on last schedule insn.
-	 2) Anti/Output dependent on last scheduled insn.
-	 3) Independent of last scheduled insn, or has latency of one.
-	 Choose the insn from the highest numbered class if different.  */
-      link = find_insn_list (tmp, LOG_LINKS (last_scheduled_insn));
-      if (link == 0 || insn_cost (tmp, link, last_scheduled_insn) == 1)
-	tmp_class = 3;
-      else if (REG_NOTE_KIND (link) == 0) /* Data dependence.  */
-	tmp_class = 1;
-      else
-	tmp_class = 2;
-
-      link = find_insn_list (tmp2, LOG_LINKS (last_scheduled_insn));
-      if (link == 0 || insn_cost (tmp2, link, last_scheduled_insn) == 1)
-	tmp2_class = 3;
-      else if (REG_NOTE_KIND (link) == 0) /* Data dependence.  */
-	tmp2_class = 1;
-      else
-	tmp2_class = 2;
-
-      if ((value = tmp_class - tmp2_class))
-	return value;
-    }
-
-  /* If insns are equally good, sort by INSN_LUID (original insn order),
-     so that we make the sort stable.  This minimizes instruction movement,
-     thus minimizing sched's effect on debugging and cross-jumping.  */
-  return INSN_LUID (tmp) - INSN_LUID (tmp2);
-}
-
-/* Resort the array A in which only element at index N may be out of order.  */
-
-__inline static void
-swap_sort (a, n)
-     rtx *a;
-     int n;
-{
-  rtx insn = a[n-1];
-  int i = n-2;
-
-  while (i >= 0 && rank_for_schedule (a+i, &insn) >= 0)
-    {
-      a[i+1] = a[i];
-      i -= 1;
-    }
-  a[i+1] = insn;
-}
-
-static int max_priority;
-
-/* Add INSN to the insn queue so that it fires at least N_CYCLES
-   before the currently executing insn.  */
-
-__inline static void
-queue_insn (insn, n_cycles)
-     rtx insn;
-     int n_cycles;
-{
-  int next_q = NEXT_Q_AFTER (q_ptr, n_cycles);
-  NEXT_INSN (insn) = insn_queue[next_q];
-  insn_queue[next_q] = insn;
-  q_size += 1;
-}
-
-/* Return nonzero if PAT is the pattern of an insn which makes a
-   register live.  */
-
-__inline static int
-birthing_insn_p (pat)
-     rtx pat;
-{
-  int j;
-
-  if (reload_completed == 1)
-    return 0;
-
-  if (GET_CODE (pat) == SET
-      && GET_CODE (SET_DEST (pat)) == REG)
-    {
-      rtx dest = SET_DEST (pat);
-      int i = REGNO (dest);
-
-      /* It would be more accurate to use refers_to_regno_p or
-	 reg_mentioned_p to determine when the dest is not live before this
-	 insn.  */
-
-      if (REGNO_REG_SET_P (bb_live_regs, i))
-	return (REG_N_SETS (i) == 1);
-
-      return 0;
-    }
-  if (GET_CODE (pat) == PARALLEL)
-    {
-      for (j = 0; j < XVECLEN (pat, 0); j++)
-	if (birthing_insn_p (XVECEXP (pat, 0, j)))
-	  return 1;
-    }
-  return 0;
-}
-
-/* PREV is an insn that is ready to execute.  Adjust its priority if that
-   will help shorten register lifetimes.  */
-
-__inline static void
-adjust_priority (prev)
-     rtx prev;
-{
-  /* Trying to shorten register lives after reload has completed
-     is useless and wrong.  It gives inaccurate schedules.  */
-  if (reload_completed == 0)
-    {
-      rtx note;
-      int n_deaths = 0;
-
-      /* ??? This code has no effect, because REG_DEAD notes are removed
-	 before we ever get here.  */
-      for (note = REG_NOTES (prev); note; note = XEXP (note, 1))
-	if (REG_NOTE_KIND (note) == REG_DEAD)
-	  n_deaths += 1;
-
-      /* Defer scheduling insns which kill registers, since that
-	 shortens register lives.  Prefer scheduling insns which
-	 make registers live for the same reason.  */
-      switch (n_deaths)
-	{
-	default:
-	  INSN_PRIORITY (prev) >>= 3;
-	  break;
-	case 3:
-	  INSN_PRIORITY (prev) >>= 2;
-	  break;
-	case 2:
-	case 1:
-	  INSN_PRIORITY (prev) >>= 1;
-	  break;
-	case 0:
-	  if (birthing_insn_p (PATTERN (prev)))
-	    {
-	      int max = max_priority;
-
-	      if (max > INSN_PRIORITY (prev))
-		INSN_PRIORITY (prev) = max;
-	    }
-	  break;
-	}
-#ifdef ADJUST_PRIORITY
-      ADJUST_PRIORITY (prev);
-#endif
-    }
-}
-
-/* INSN is the "currently executing insn".  Launch each insn which was
-   waiting on INSN (in the backwards dataflow sense).  READY is a
-   vector of insns which are ready to fire.  N_READY is the number of
-   elements in READY.  CLOCK is the current virtual cycle.  */
-
-static int
-schedule_insn (insn, ready, n_ready, clock)
-     rtx insn;
-     rtx *ready;
-     int n_ready;
-     int clock;
-{
-  rtx link;
-  int new_ready = n_ready;
-
-  if (MAX_BLOCKAGE > 1)
-    schedule_unit (insn_unit (insn), insn, clock);
-
-  if (LOG_LINKS (insn) == 0)
-    return n_ready;
-
-  /* This is used by the function adjust_priority above.  */
-  if (n_ready > 0)
-    max_priority = MAX (INSN_PRIORITY (ready[0]), INSN_PRIORITY (insn));
-  else
-    max_priority = INSN_PRIORITY (insn);
-
-  for (link = LOG_LINKS (insn); link != 0; link = XEXP (link, 1))
-    {
-      rtx prev = XEXP (link, 0);
-      int cost = insn_cost (prev, link, insn);
-
-      if ((INSN_REF_COUNT (prev) -= 1) != 0)
-	{
-	  /* We satisfied one requirement to fire PREV.  Record the earliest
-	     time when PREV can fire.  No need to do this if the cost is 1,
-	     because PREV can fire no sooner than the next cycle.  */
-	  if (cost > 1)
-	    INSN_TICK (prev) = MAX (INSN_TICK (prev), clock + cost);
-	}
-      else
-	{
-	  /* We satisfied the last requirement to fire PREV.  Ensure that all
-	     timing requirements are satisfied.  */
-	  if (INSN_TICK (prev) - clock > cost)
-	    cost = INSN_TICK (prev) - clock;
-
-	  /* Adjust the priority of PREV and either put it on the ready
-	     list or queue it.  */
-	  adjust_priority (prev);
-	  if (cost <= 1)
-	    ready[new_ready++] = prev;
-	  else
-	    queue_insn (prev, cost);
-	}
-    }
-
-  return new_ready;
-}
-
-/* Given N_READY insns in the ready list READY at time CLOCK, queue
-   those that are blocked due to function unit hazards and rearrange
-   the remaining ones to minimize subsequent function unit hazards.  */
-
-static int
-schedule_select (ready, n_ready, clock, file)
-     rtx *ready;
-     int n_ready, clock;
-     FILE *file;
-{
-  int pri = INSN_PRIORITY (ready[0]);
-  int i, j, k, q, cost, best_cost, best_insn = 0, new_ready = n_ready;
-  rtx insn;
-
-  /* Work down the ready list in groups of instructions with the same
-     priority value.  Queue insns in the group that are blocked and
-     select among those that remain for the one with the largest
-     potential hazard.  */
-  for (i = 0; i < n_ready; i = j)
-    {
-      int opri = pri;
-      for (j = i + 1; j < n_ready; j++)
-	if ((pri = INSN_PRIORITY (ready[j])) != opri)
-	  break;
-
-      /* Queue insns in the group that are blocked.  */
-      for (k = i, q = 0; k < j; k++)
-	{
-	  insn = ready[k];
-	  if ((cost = actual_hazard (insn_unit (insn), insn, clock, 0)) != 0)
-	    {
-	      q++;
-	      ready[k] = 0;
-	      queue_insn (insn, cost);
-	      if (file)
-		fprintf (file, "\n;; blocking insn %d for %d cycles",
-			 INSN_UID (insn), cost);
-	    }
-	}
-      new_ready -= q;
-
-      /* Check the next group if all insns were queued.  */
-      if (j - i - q == 0)
-	continue;
-
-      /* If more than one remains, select the first one with the largest
-	 potential hazard.  */
-      else if (j - i - q > 1)
-	{
-	  best_cost = -1;
-	  for (k = i; k < j; k++)
-	    {
-	      if ((insn = ready[k]) == 0)
-		continue;
-	      if ((cost = potential_hazard (insn_unit (insn), insn, 0))
-		  > best_cost)
-		{
-		  best_cost = cost;
-		  best_insn = k;
-		}
-	    }
-	}
-      /* We have found a suitable insn to schedule.  */
-      break;
-    }
-
-  /* Move the best insn to be front of the ready list.  */
-  if (best_insn != 0)
-    {
-      if (file)
-	{
-	  fprintf (file, ", now");
-	  for (i = 0; i < n_ready; i++)
-	    if (ready[i])
-	      fprintf (file, " %d", INSN_UID (ready[i]));
-	  fprintf (file, "\n;; insn %d has a greater potential hazard",
-		   INSN_UID (ready[best_insn]));
-	}
-      for (i = best_insn; i > 0; i--)
-	{
-	  insn = ready[i-1];
-	  ready[i-1] = ready[i];
-	  ready[i] = insn;
-	}
-    }
-
-  /* Compact the ready list.  */
-  if (new_ready < n_ready)
-    for (i = j = 0; i < n_ready; i++)
-      if (ready[i])
-	ready[j++] = ready[i];
-
-  return new_ready;
-}
-
-/* Add a REG_DEAD note for REG to INSN, reusing a REG_DEAD note from the
-   dead_notes list.  */
-
-static void
-create_reg_dead_note (reg, insn)
-     rtx reg, insn;
-{
-  rtx link;
-		
-  /* The number of registers killed after scheduling must be the same as the
-     number of registers killed before scheduling.  The number of REG_DEAD
-     notes may not be conserved, i.e. two SImode hard register REG_DEAD notes
-     might become one DImode hard register REG_DEAD note, but the number of
-     registers killed will be conserved.
-     
-     We carefully remove REG_DEAD notes from the dead_notes list, so that
-     there will be none left at the end.  If we run out early, then there
-     is a bug somewhere in flow, combine and/or sched.  */
-
-  if (dead_notes == 0)
-    {
-#if 1
-      abort ();
-#else
-      link = rtx_alloc (EXPR_LIST);
-      PUT_REG_NOTE_KIND (link, REG_DEAD);
-#endif
-    }
-  else
-    {
-      /* Number of regs killed by REG.  */
-      int regs_killed = (REGNO (reg) >= FIRST_PSEUDO_REGISTER ? 1
-			 : HARD_REGNO_NREGS (REGNO (reg), GET_MODE (reg)));
-      /* Number of regs killed by REG_DEAD notes taken off the list.  */
-      int reg_note_regs;
-
-      link = dead_notes;
-      reg_note_regs = (REGNO (XEXP (link, 0)) >= FIRST_PSEUDO_REGISTER ? 1
-		       : HARD_REGNO_NREGS (REGNO (XEXP (link, 0)),
-					   GET_MODE (XEXP (link, 0))));
-      while (reg_note_regs < regs_killed)
-	{
-	  /* LINK might be zero if we killed more registers after scheduling
-	     than before, and the last hard register we kill is actually
-	     multiple hard regs.  */
-	  if (link == NULL_RTX)
-	    abort ();
-  
-	  link = XEXP (link, 1);
-	  reg_note_regs += (REGNO (XEXP (link, 0)) >= FIRST_PSEUDO_REGISTER ? 1
-			    : HARD_REGNO_NREGS (REGNO (XEXP (link, 0)),
-						GET_MODE (XEXP (link, 0))));
-	}
-      dead_notes = XEXP (link, 1);
-
-      /* If we took too many regs kills off, put the extra ones back.  */
-      while (reg_note_regs > regs_killed)
-	{
-	  rtx temp_reg, temp_link;
-
-	  temp_reg = gen_rtx_REG (word_mode, 0);
-	  temp_link = rtx_alloc (EXPR_LIST);
-	  PUT_REG_NOTE_KIND (temp_link, REG_DEAD);
-	  XEXP (temp_link, 0) = temp_reg;
-	  XEXP (temp_link, 1) = dead_notes;
-	  dead_notes = temp_link;
-	  reg_note_regs--;
-	}
-    }
-
-  XEXP (link, 0) = reg;
-  XEXP (link, 1) = REG_NOTES (insn);
-  REG_NOTES (insn) = link;
-}
-
-/* Subroutine on attach_deaths_insn--handles the recursive search
-   through INSN.  If SET_P is true, then x is being modified by the insn.  */
-
-static void
-attach_deaths (x, insn, set_p)
-     rtx x;
-     rtx insn;
-     int set_p;
-{
-  register int i;
-  register int j;
-  register enum rtx_code code;
-  register const char *fmt;
-
-  if (x == 0)
-    return;
-
-  code = GET_CODE (x);
-
-  switch (code)
-    {
-    case CONST_INT:
-    case CONST_DOUBLE:
-    case LABEL_REF:
-    case SYMBOL_REF:
-    case CONST:
-    case CODE_LABEL:
-    case PC:
-    case CC0:
-      /* Get rid of the easy cases first.  */
-      return;
-
-    case REG:
-      {
-	/* If the register dies in this insn, queue that note, and mark
-	   this register as needing to die.  */
-	/* This code is very similar to mark_used_1 (if set_p is false)
-	   and mark_set_1 (if set_p is true) in flow.c.  */
-
-	register int regno;
-	int some_needed;
-	int all_needed;
-
-	if (set_p)
-	  return;
-
-	regno = REGNO (x);
-	all_needed = some_needed = REGNO_REG_SET_P (old_live_regs, regno);
-	if (regno < FIRST_PSEUDO_REGISTER)
-	  {
-	    int n;
-
-	    n = HARD_REGNO_NREGS (regno, GET_MODE (x));
-	    while (--n > 0)
-	      {
-		int needed = (REGNO_REG_SET_P (old_live_regs, regno + n));
-		some_needed |= needed;
-		all_needed &= needed;
-	      }
-	  }
-
-	/* If it wasn't live before we started, then add a REG_DEAD note.
-	   We must check the previous lifetime info not the current info,
-	   because we may have to execute this code several times, e.g.
-	   once for a clobber (which doesn't add a note) and later
-	   for a use (which does add a note).
-	   
-	   Always make the register live.  We must do this even if it was
-	   live before, because this may be an insn which sets and uses
-	   the same register, in which case the register has already been
-	   killed, so we must make it live again.
-
-	   Global registers are always live, and should never have a REG_DEAD
-	   note added for them, so none of the code below applies to them.  */
-
-	if (regno >= FIRST_PSEUDO_REGISTER || ! global_regs[regno])
-	  {
-	    /* Never add REG_DEAD notes for STACK_POINTER_REGNUM
-	       since it's always considered to be live.  Similarly
-	       for FRAME_POINTER_REGNUM if a frame pointer is needed
-	       and for ARG_POINTER_REGNUM if it is fixed.  */
-	    if (! (regno == FRAME_POINTER_REGNUM
-		   && (! reload_completed || frame_pointer_needed))
-#if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
-		&& ! (regno == HARD_FRAME_POINTER_REGNUM
-		      && (! reload_completed || frame_pointer_needed))
-#endif
-#if ARG_POINTER_REGNUM != FRAME_POINTER_REGNUM
-		&& ! (regno == ARG_POINTER_REGNUM && fixed_regs[regno])
-#endif
-		&& regno != STACK_POINTER_REGNUM)
-	      {
-		if (! all_needed && ! dead_or_set_p (insn, x))
-		  {
-		    /* Check for the case where the register dying partially
-		       overlaps the register set by this insn.  */
-		    if (regno < FIRST_PSEUDO_REGISTER
-			&& HARD_REGNO_NREGS (regno, GET_MODE (x)) > 1)
-		      {
-			int n = HARD_REGNO_NREGS (regno, GET_MODE (x));
-			while (--n >= 0)
-			  some_needed |= dead_or_set_regno_p (insn, regno + n);
-		      }
-
-		    /* If none of the words in X is needed, make a REG_DEAD
-		       note.  Otherwise, we must make partial REG_DEAD
-		       notes.  */
-		    if (! some_needed)
-		      create_reg_dead_note (x, insn);
-		    else
-		      {
-			int i;
-
-			/* Don't make a REG_DEAD note for a part of a
-			   register that is set in the insn.  */
-			for (i = HARD_REGNO_NREGS (regno, GET_MODE (x)) - 1;
-			     i >= 0; i--)
-			  if (! REGNO_REG_SET_P (old_live_regs, regno + i)
-			      && ! dead_or_set_regno_p (insn, regno + i))
-			    create_reg_dead_note (gen_rtx_REG (reg_raw_mode[regno + i],
-							       regno + i),
-						  insn);
-		      }
-		  }
-	      }
-
-	    if (regno < FIRST_PSEUDO_REGISTER)
-	      {
-		int j = HARD_REGNO_NREGS (regno, GET_MODE (x));
-		while (--j >= 0)
-		  {
-		    CLEAR_REGNO_REG_SET (bb_dead_regs, regno + j);
-		    SET_REGNO_REG_SET (bb_live_regs, regno + j);
-		  }
-	      }
-	    else
-	      {
-		CLEAR_REGNO_REG_SET (bb_dead_regs, regno);
-		SET_REGNO_REG_SET (bb_live_regs, regno);
-	      }
-	  }
-	return;
-      }
-
-    case MEM:
-      /* Handle tail-recursive case.  */
-      attach_deaths (XEXP (x, 0), insn, 0);
-      return;
-
-    case SUBREG:
-      attach_deaths (SUBREG_REG (x), insn,
-		     set_p && ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))
-			       <= UNITS_PER_WORD)
-			       || (GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))
-				   == GET_MODE_SIZE (GET_MODE ((x))))));
-      return;
-
-    case STRICT_LOW_PART:
-      attach_deaths (XEXP (x, 0), insn, 0);
-      return;
-
-    case ZERO_EXTRACT:
-    case SIGN_EXTRACT:
-      attach_deaths (XEXP (x, 0), insn, 0);
-      attach_deaths (XEXP (x, 1), insn, 0);
-      attach_deaths (XEXP (x, 2), insn, 0);
-      return;
-
-    default:
-      /* Other cases: walk the insn.  */
-      fmt = GET_RTX_FORMAT (code);
-      for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
-	{
-	  if (fmt[i] == 'e')
-	    attach_deaths (XEXP (x, i), insn, 0);
-	  else if (fmt[i] == 'E')
-	    for (j = 0; j < XVECLEN (x, i); j++)
-	      attach_deaths (XVECEXP (x, i, j), insn, 0);
-	}
-    }
-}
-
-/* After INSN has executed, add register death notes for each register
-   that is dead after INSN.  */
-
-static void
-attach_deaths_insn (insn)
-     rtx insn;
-{
-  rtx x = PATTERN (insn);
-  register RTX_CODE code = GET_CODE (x);
-  rtx link;
-
-  if (code == SET)
-    {
-      attach_deaths (SET_SRC (x), insn, 0);
-
-      /* A register might die here even if it is the destination, e.g.
-	 it is the target of a volatile read and is otherwise unused.
-	 Hence we must always call attach_deaths for the SET_DEST.  */
-      attach_deaths (SET_DEST (x), insn, 1);
-    }
-  else if (code == PARALLEL)
-    {
-      register int i;
-      for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
-	{
-	  code = GET_CODE (XVECEXP (x, 0, i));
-	  if (code == SET)
-	    {
-	      attach_deaths (SET_SRC (XVECEXP (x, 0, i)), insn, 0);
-
-	      attach_deaths (SET_DEST (XVECEXP (x, 0, i)), insn, 1);
-	    }
-	  /* Flow does not add REG_DEAD notes to registers that die in
-	     clobbers, so we can't either.  */
-	  else if (code != CLOBBER)
-	    attach_deaths (XVECEXP (x, 0, i), insn, 0);
-	}
-    }
-  /* If this is a CLOBBER, only add REG_DEAD notes to registers inside a
-     MEM being clobbered, just like flow.  */
-  else if (code == CLOBBER && GET_CODE (XEXP (x, 0)) == MEM)
-    attach_deaths (XEXP (XEXP (x, 0), 0), insn, 0);
-  /* Otherwise don't add a death note to things being clobbered.  */
-  else if (code != CLOBBER)
-    attach_deaths (x, insn, 0);
-
-  /* Make death notes for things used in the called function.  */
-  if (GET_CODE (insn) == CALL_INSN)
-    for (link = CALL_INSN_FUNCTION_USAGE (insn); link; link = XEXP (link, 1))
-      attach_deaths (XEXP (XEXP (link, 0), 0), insn,
-		     GET_CODE (XEXP (link, 0)) == CLOBBER);
-}
-
-/* Delete notes beginning with INSN and maybe put them in the chain
-   of notes ended by NOTE_LIST.
-   Returns the insn following the notes.  */
-
-static rtx
-unlink_notes (insn, tail)
-     rtx insn, tail;
-{
-  rtx prev = PREV_INSN (insn);
-
-  while (insn != tail && GET_CODE (insn) == NOTE)
-    {
-      rtx next = NEXT_INSN (insn);
-      /* Delete the note from its current position.  */
-      if (prev)
-	NEXT_INSN (prev) = next;
-      if (next)
-	PREV_INSN (next) = prev;
-
-      if (write_symbols != NO_DEBUG && NOTE_LINE_NUMBER (insn) > 0)
-	/* Record line-number notes so they can be reused.  */
-	LINE_NOTE (insn) = insn;
-
-      /* Don't save away NOTE_INSN_SETJMPs, because they must remain
-	 immediately after the call they follow.  We use a fake
-	 (REG_DEAD (const_int -1)) note to remember them.
-	 Likewise with NOTE_INSN_{LOOP,EHREGION}_{BEG, END}.  */
-      else if (NOTE_LINE_NUMBER (insn) != NOTE_INSN_SETJMP
-	       && NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_BEG
-	       && NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_END
-	       && NOTE_LINE_NUMBER (insn) != NOTE_INSN_RANGE_START
-	       && NOTE_LINE_NUMBER (insn) != NOTE_INSN_RANGE_END
-	       && NOTE_LINE_NUMBER (insn) != NOTE_INSN_EH_REGION_BEG
-	       && NOTE_LINE_NUMBER (insn) != NOTE_INSN_EH_REGION_END)
-	{
-	  /* Insert the note at the end of the notes list.  */
-	  PREV_INSN (insn) = note_list;
-	  if (note_list)
-	    NEXT_INSN (note_list) = insn;
-	  note_list = insn;
-	}
-
-      insn = next;
-    }
-  return insn;
-}
-
-/* Constructor for `sometimes' data structure.  */
-
-static int
-new_sometimes_live (regs_sometimes_live, regno, sometimes_max)
-     struct sometimes *regs_sometimes_live;
-     int regno;
-     int sometimes_max;
-{
-  register struct sometimes *p;
-
-  /* There should never be a register greater than max_regno here.  If there
-     is, it means that a define_split has created a new pseudo reg.  This
-     is not allowed, since there will not be flow info available for any
-     new register, so catch the error here.  */
-  if (regno >= max_regno)
-    abort ();
-
-  p = &regs_sometimes_live[sometimes_max];
-  p->regno = regno;
-  p->live_length = 0;
-  p->calls_crossed = 0;
-  sometimes_max++;
-  return sometimes_max;
-}
-
-/* Count lengths of all regs we are currently tracking,
-   and find new registers no longer live.  */
-
-static void
-finish_sometimes_live (regs_sometimes_live, sometimes_max)
-     struct sometimes *regs_sometimes_live;
-     int sometimes_max;
-{
-  int i;
-
-  for (i = 0; i < sometimes_max; i++)
-    {
-      register struct sometimes *p = &regs_sometimes_live[i];
-      int regno = p->regno;
-
-      sched_reg_live_length[regno] += p->live_length;
-      sched_reg_n_calls_crossed[regno] += p->calls_crossed;
-    }
-}
-
-/* Search INSN for fake REG_DEAD note pairs for NOTE_INSN_SETJMP,
-   NOTE_INSN_{LOOP,EHREGION}_{BEG,END}; and convert them back into
-   NOTEs.  The REG_DEAD note following first one is contains the saved
-   value for NOTE_BLOCK_NUMBER which is useful for
-   NOTE_INSN_EH_REGION_{BEG,END} NOTEs.  LAST is the last instruction
-   output by the instruction scheduler.  Return the new value of LAST.  */
-
-static rtx
-reemit_notes (insn, last)
-     rtx insn;
-     rtx last;
-{
-  rtx note;
-
-  for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
-    {
-      if (REG_NOTE_KIND (note) == REG_DEAD
-	  && GET_CODE (XEXP (note, 0)) == CONST_INT)
-	{
-	  int note_type = INTVAL (XEXP (note, 0));
-	  if (note_type == NOTE_INSN_SETJMP)
-	    {
-	      CONST_CALL_P (emit_note_after (note_type, insn))
-		= CONST_CALL_P (note);
-	      remove_note (insn, note);
-	      note = XEXP (note, 1);
-	    }
-	  else if (note_type == NOTE_INSN_RANGE_START
-                   || note_type == NOTE_INSN_RANGE_END)
-	    {
-	      last = emit_note_before (note_type, last);
-	      remove_note (insn, note);
-	      note = XEXP (note, 1);
-	      NOTE_RANGE_INFO (last) = XEXP (note, 0);
-	    }
-	  else
-	    {
-	      last = emit_note_before (note_type, last);
-	      remove_note (insn, note);
-	      note = XEXP (note, 1);
-	      NOTE_BLOCK_NUMBER (last) = INTVAL (XEXP (note, 0));
-	    }
-	  remove_note (insn, note);
-	}
-    }
-  return last;
-}
-
-/* Use modified list scheduling to rearrange insns in basic block
-   B.  FILE, if nonzero, is where we dump interesting output about
-   this pass.  */
-
-static void
-schedule_block (b, file)
-     int b;
-     FILE *file;
-{
-  rtx insn, last;
-  rtx *ready, link;
-  int i, j, n_ready = 0, new_ready, n_insns;
-  int sched_n_insns = 0;
-  int clock;
-#define NEED_NOTHING	0
-#define NEED_HEAD	1
-#define NEED_TAIL	2
-  int new_needs;
-
-  /* HEAD and TAIL delimit the region being scheduled.  */
-  rtx head = BLOCK_HEAD (b);
-  rtx tail = BLOCK_END (b);
-  /* PREV_HEAD and NEXT_TAIL are the boundaries of the insns
-     being scheduled.  When the insns have been ordered,
-     these insns delimit where the new insns are to be
-     spliced back into the insn chain.  */
-  rtx next_tail;
-  rtx prev_head;
-
-  /* Keep life information accurate.  */
-  register struct sometimes *regs_sometimes_live;
-  int sometimes_max;
-
-  if (file)
-    fprintf (file, ";;\t -- basic block number %d from %d to %d --\n",
-	     b, INSN_UID (BLOCK_HEAD (b)), INSN_UID (BLOCK_END (b)));
-
-  i = max_reg_num ();
-  reg_last_uses = (rtx *) alloca (i * sizeof (rtx));
-  bzero ((char *) reg_last_uses, i * sizeof (rtx));
-  reg_last_sets = (rtx *) alloca (i * sizeof (rtx));
-  bzero ((char *) reg_last_sets, i * sizeof (rtx));
-  reg_pending_sets = ALLOCA_REG_SET ();
-  CLEAR_REG_SET (reg_pending_sets);
-  reg_pending_sets_all = 0;
-  clear_units ();
-
-#if 0
-  /* We used to have code to avoid getting parameters moved from hard
-     argument registers into pseudos.
-
-     However, it was removed when it proved to be of marginal benefit and
-     caused problems because of different notions of what the "head" insn
-     was.  */
-
-  /* Remove certain insns at the beginning from scheduling,
-     by advancing HEAD.  */
-
-  /* At the start of a function, before reload has run, don't delay getting
-     parameters from hard registers into pseudo registers.  */
-  if (reload_completed == 0 && b == 0)
-    {
-      while (head != tail
-	     && GET_CODE (head) == NOTE
-	     && NOTE_LINE_NUMBER (head) != NOTE_INSN_FUNCTION_BEG)
-	head = NEXT_INSN (head);
-      while (head != tail
-	     && GET_CODE (head) == INSN
-	     && GET_CODE (PATTERN (head)) == SET)
-	{
-	  rtx src = SET_SRC (PATTERN (head));
-	  while (GET_CODE (src) == SUBREG
-		 || GET_CODE (src) == SIGN_EXTEND
-		 || GET_CODE (src) == ZERO_EXTEND
-		 || GET_CODE (src) == SIGN_EXTRACT
-		 || GET_CODE (src) == ZERO_EXTRACT)
-	    src = XEXP (src, 0);
-	  if (GET_CODE (src) != REG
-	      || REGNO (src) >= FIRST_PSEUDO_REGISTER)
-	    break;
-	  /* Keep this insn from ever being scheduled.  */
-	  INSN_REF_COUNT (head) = 1;
-	  head = NEXT_INSN (head);
-	}
-    }
-#endif
-
-  /* Don't include any notes or labels at the beginning of the
-     basic block, or notes at the ends of basic blocks.  */
-  while (head != tail)
-    {
-      if (GET_CODE (head) == NOTE)
-	head = NEXT_INSN (head);
-      else if (GET_CODE (tail) == NOTE)
-	tail = PREV_INSN (tail);
-      else if (GET_CODE (head) == CODE_LABEL)
-	head = NEXT_INSN (head);
-      else break;
-    }
-  /* If the only insn left is a NOTE or a CODE_LABEL, then there is no need
-     to schedule this block.  */
-  if (head == tail
-      && (GET_CODE (head) == NOTE || GET_CODE (head) == CODE_LABEL))
-    goto ret;
-
-#if 0
-  /* This short-cut doesn't work.  It does not count call insns crossed by
-     registers in reg_sometimes_live.  It does not mark these registers as
-     dead if they die in this block.  It does not mark these registers live
-     (or create new reg_sometimes_live entries if necessary) if they are born
-     in this block.
-
-     The easy solution is to just always schedule a block.  This block only
-     has one insn, so this won't slow down this pass by much.  */
-
-  if (head == tail)
-    goto ret;
-#endif
-
-  /* Now HEAD through TAIL are the insns actually to be rearranged;
-     Let PREV_HEAD and NEXT_TAIL enclose them.  */
-  prev_head = PREV_INSN (head);
-  next_tail = NEXT_INSN (tail);
-
-  /* Initialize basic block data structures.  */
-  dead_notes = 0;
-  pending_read_insns = 0;
-  pending_read_mems = 0;
-  pending_write_insns = 0;
-  pending_write_mems = 0;
-  pending_lists_length = 0;
-  last_pending_memory_flush = 0;
-  last_function_call = 0;
-  last_scheduled_insn = 0;
-
-  LOG_LINKS (sched_before_next_call) = 0;
-
-  n_insns = sched_analyze (head, tail);
-  if (n_insns == 0)
-    {
-      free_pending_lists ();
-      goto ret;
-    }
-
-  /* Allocate vector to hold insns to be rearranged (except those
-     insns which are controlled by an insn with SCHED_GROUP_P set).
-     All these insns are included between ORIG_HEAD and ORIG_TAIL,
-     as those variables ultimately are set up.  */
-  ready = (rtx *) alloca ((n_insns+1) * sizeof (rtx));
-
-  /* TAIL is now the last of the insns to be rearranged.
-     Put those insns into the READY vector.  */
-  insn = tail;
-
-  /* For all branches, calls, uses, and cc0 setters, force them to remain
-     in order at the end of the block by adding dependencies and giving
-     the last a high priority.  There may be notes present, and prev_head
-     may also be a note.
-
-     Branches must obviously remain at the end.  Calls should remain at the
-     end since moving them results in worse register allocation.  Uses remain
-     at the end to ensure proper register allocation.  cc0 setters remaim
-     at the end because they can't be moved away from their cc0 user.  */
-  last = 0;
-  while (GET_CODE (insn) == CALL_INSN || GET_CODE (insn) == JUMP_INSN
-	 || (GET_CODE (insn) == INSN
-	     && (GET_CODE (PATTERN (insn)) == USE
-#ifdef HAVE_cc0
-		 || sets_cc0_p (PATTERN (insn))
-#endif
-		 ))
-	 || GET_CODE (insn) == NOTE)
-    {
-      if (GET_CODE (insn) != NOTE)
-	{
-	  priority (insn);
-	  if (last == 0)
-	    {
-	      ready[n_ready++] = insn;
-	      INSN_PRIORITY (insn) = TAIL_PRIORITY - i;
-	      INSN_REF_COUNT (insn) = 0;
-	    }
-	  else if (! find_insn_list (insn, LOG_LINKS (last)))
-	    {
-	      add_dependence (last, insn, REG_DEP_ANTI);
-	      INSN_REF_COUNT (insn)++;
-	    }
-	  last = insn;
-
-	  /* Skip over insns that are part of a group.  */
-	  while (SCHED_GROUP_P (insn))
-	    {
-	      insn = prev_nonnote_insn (insn);
-	      priority (insn);
-	    }
-	}
-
-      insn = PREV_INSN (insn);
-      /* Don't overrun the bounds of the basic block.  */
-      if (insn == prev_head)
-	break;
-    }
-
-  /* Assign priorities to instructions.  Also check whether they
-     are in priority order already.  If so then I will be nonnegative.
-     We use this shortcut only before reloading.  */
-#if 0
-  i = reload_completed ? DONE_PRIORITY : MAX_PRIORITY;
-#endif
-
-  for (; insn != prev_head; insn = PREV_INSN (insn))
-    {
-      if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
-	{
-	  priority (insn);
-	  if (INSN_REF_COUNT (insn) == 0)
-	    {
-	      if (last == 0)
-		ready[n_ready++] = insn;
-	      else
-		{
-		  /* Make this dependent on the last of the instructions
-		     that must remain in order at the end of the block.  */
-		  add_dependence (last, insn, REG_DEP_ANTI);
-		  INSN_REF_COUNT (insn) = 1;
-		}
-	    }
-	  if (SCHED_GROUP_P (insn))
-	    {
-	      while (SCHED_GROUP_P (insn))
-		{
-		  insn = prev_nonnote_insn (insn);
-		  priority (insn);
-		}
-	      continue;
-	    }
-#if 0
-	  if (i < 0)
-	    continue;
-	  if (INSN_PRIORITY (insn) < i)
-	    i = INSN_PRIORITY (insn);
-	  else if (INSN_PRIORITY (insn) > i)
-	    i = DONE_PRIORITY;
-#endif
-	}
-    }
-
-#if 0
-  /* This short-cut doesn't work.  It does not count call insns crossed by
-     registers in reg_sometimes_live.  It does not mark these registers as
-     dead if they die in this block.  It does not mark these registers live
-     (or create new reg_sometimes_live entries if necessary) if they are born
-     in this block.
-
-     The easy solution is to just always schedule a block.  These blocks tend
-     to be very short, so this doesn't slow down this pass by much.  */
-
-  /* If existing order is good, don't bother to reorder.  */
-  if (i != DONE_PRIORITY)
-    {
-      if (file)
-	fprintf (file, ";; already scheduled\n");
-
-      if (reload_completed == 0)
-	{
-	  for (i = 0; i < sometimes_max; i++)
-	    regs_sometimes_live[i].live_length += n_insns;
-
-	  finish_sometimes_live (regs_sometimes_live, sometimes_max);
-	}
-      free_pending_lists ();
-      goto ret;
-    }
-#endif
-
-  /* Scan all the insns to be scheduled, removing NOTE insns
-     and register death notes.
-     Line number NOTE insns end up in NOTE_LIST.
-     Register death notes end up in DEAD_NOTES.
-
-     Recreate the register life information for the end of this basic
-     block.  */
-
-  if (reload_completed == 0)
-    {
-      COPY_REG_SET (bb_live_regs, BASIC_BLOCK (b)->global_live_at_start);
-      CLEAR_REG_SET (bb_dead_regs);
-
-      if (b == 0)
-	{
-	  /* This is the first block in the function.  There may be insns
-	     before head that we can't schedule.   We still need to examine
-	     them though for accurate register lifetime analysis.  */
-
-	  /* We don't want to remove any REG_DEAD notes as the code below
-	     does.  */
-
-	  for (insn = BLOCK_HEAD (b); insn != head;
-	       insn = NEXT_INSN (insn))
-	    if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
-	      {
-		/* See if the register gets born here.  */
-		/* We must check for registers being born before we check for
-		   registers dying.  It is possible for a register to be born
-		   and die in the same insn, e.g. reading from a volatile
-		   memory location into an otherwise unused register.  Such
-		   a register must be marked as dead after this insn.  */
-		if (GET_CODE (PATTERN (insn)) == SET
-		    || GET_CODE (PATTERN (insn)) == CLOBBER)
-		  sched_note_set (PATTERN (insn), 0);
-		else if (GET_CODE (PATTERN (insn)) == PARALLEL)
-		  {
-		    int j;
-		    for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--)
-		      if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == SET
-			  || GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == CLOBBER)
-			sched_note_set (XVECEXP (PATTERN (insn), 0, j), 0);
-
-		    /* ??? This code is obsolete and should be deleted.  It
-		       is harmless though, so we will leave it in for now.  */
-		    for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--)
-		      if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == USE)
-			sched_note_set (XVECEXP (PATTERN (insn), 0, j), 0);
-		  }
-
-		/* Each call clobbers (makes live) all call-clobbered regs
-		   that are not global or fixed.  Note that the function-value
-		   reg is a call_clobbered reg.  */
-
-		if (GET_CODE (insn) == CALL_INSN)
-		  {
-		    int j;
-		    for (j = 0; j < FIRST_PSEUDO_REGISTER; j++)
-		      if (call_used_regs[j] && ! global_regs[j]
-			  && ! fixed_regs[j])
-			{
-			  SET_REGNO_REG_SET (bb_live_regs, j);
-			  CLEAR_REGNO_REG_SET (bb_dead_regs, j);
-			}
-		  }
-
-		for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
-		  {
-		    if ((REG_NOTE_KIND (link) == REG_DEAD
-			 || REG_NOTE_KIND (link) == REG_UNUSED)
-			/* Verify that the REG_NOTE has a valid value.  */
-			&& GET_CODE (XEXP (link, 0)) == REG)
-		      {
-			register int regno = REGNO (XEXP (link, 0));
-
-			if (regno < FIRST_PSEUDO_REGISTER)
-			  {
-			    int j = HARD_REGNO_NREGS (regno,
-						      GET_MODE (XEXP (link, 0)));
-			    while (--j >= 0)
-			      {
-				CLEAR_REGNO_REG_SET (bb_live_regs, regno + j);
-				SET_REGNO_REG_SET (bb_dead_regs, regno + j);
-			      }
-			  }
-			else
-			  {
-			    CLEAR_REGNO_REG_SET (bb_live_regs, regno);
-			    SET_REGNO_REG_SET (bb_dead_regs, regno);
-			  }
-		      }
-		  }
-	      }
-	}
-    }
-
-  /* If debugging information is being produced, keep track of the line
-     number notes for each insn.  */
-  if (write_symbols != NO_DEBUG)
-    {
-      /* We must use the true line number for the first insn in the block
-	 that was computed and saved at the start of this pass.  We can't
-	 use the current line number, because scheduling of the previous
-	 block may have changed the current line number.  */
-      rtx line = line_note_head[b];
-
-      for (insn = BLOCK_HEAD (b);
-	   insn != next_tail;
-	   insn = NEXT_INSN (insn))
-	if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0)
-	  line = insn;
-	else
-	  LINE_NOTE (insn) = line;
-    }
-
-  for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
-    {
-      rtx prev, next, link;
-
-      /* Farm out notes.  This is needed to keep the debugger from
-	 getting completely deranged.  */
-      if (GET_CODE (insn) == NOTE)
-	{
-	  prev = insn;
-	  insn = unlink_notes (insn, next_tail);
-	  if (prev == tail)
-	    abort ();
-	  if (prev == head)
-	    abort ();
-	  if (insn == next_tail)
-	    abort ();
-	}
-
-      if (reload_completed == 0
-	  && GET_RTX_CLASS (GET_CODE (insn)) == 'i')
-	{
-	  /* See if the register gets born here.  */
-	  /* We must check for registers being born before we check for
-	     registers dying.  It is possible for a register to be born and
-	     die in the same insn, e.g. reading from a volatile memory
-	     location into an otherwise unused register.  Such a register
-	     must be marked as dead after this insn.  */
-	  if (GET_CODE (PATTERN (insn)) == SET
-	      || GET_CODE (PATTERN (insn)) == CLOBBER)
-	    sched_note_set (PATTERN (insn), 0);
-	  else if (GET_CODE (PATTERN (insn)) == PARALLEL)
-	    {
-	      int j;
-	      for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--)
-		if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == SET
-		    || GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == CLOBBER)
-		  sched_note_set (XVECEXP (PATTERN (insn), 0, j), 0);
-
-	      /* ??? This code is obsolete and should be deleted.  It
-		 is harmless though, so we will leave it in for now.  */
-	      for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--)
-		if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == USE)
-		  sched_note_set (XVECEXP (PATTERN (insn), 0, j), 0);
-	    }
-
-	  /* Each call clobbers (makes live) all call-clobbered regs that are
-	     not global or fixed.  Note that the function-value reg is a
-	     call_clobbered reg.  */
-
-	  if (GET_CODE (insn) == CALL_INSN)
-	    {
-	      int j;
-	      for (j = 0; j < FIRST_PSEUDO_REGISTER; j++)
-		if (call_used_regs[j] && ! global_regs[j]
-		    && ! fixed_regs[j])
-		  {
-		    SET_REGNO_REG_SET (bb_live_regs, j);
-		    CLEAR_REGNO_REG_SET (bb_dead_regs, j);
-		  }
-	    }
-
-	  /* Need to know what registers this insn kills.  */
-	  for (prev = 0, link = REG_NOTES (insn); link; link = next)
-	    {
-	      next = XEXP (link, 1);
-	      if ((REG_NOTE_KIND (link) == REG_DEAD
-		   || REG_NOTE_KIND (link) == REG_UNUSED)
-		  /* Verify that the REG_NOTE has a valid value.  */
-		  && GET_CODE (XEXP (link, 0)) == REG)
-		{
-		  register int regno = REGNO (XEXP (link, 0));
-
-		  /* Only unlink REG_DEAD notes; leave REG_UNUSED notes
-		     alone.  */
-		  if (REG_NOTE_KIND (link) == REG_DEAD)
-		    {
-		      if (prev)
-			XEXP (prev, 1) = next;
-		      else
-			REG_NOTES (insn) = next;
-		      XEXP (link, 1) = dead_notes;
-		      dead_notes = link;
-		    }
-		  else
-		    prev = link;
-
-		  if (regno < FIRST_PSEUDO_REGISTER)
-		    {
-		      int j = HARD_REGNO_NREGS (regno,
-						GET_MODE (XEXP (link, 0)));
-		      while (--j >= 0)
-			{
-			  CLEAR_REGNO_REG_SET (bb_live_regs, regno + j);
-			  SET_REGNO_REG_SET (bb_dead_regs, regno + j);
-			}
-		    }
-		  else
-		    {
-		      CLEAR_REGNO_REG_SET (bb_live_regs, regno);
-		      SET_REGNO_REG_SET (bb_dead_regs, regno);
-		    }
-		}
-	      else
-		prev = link;
-	    }
-	}
-    }
-
-  if (reload_completed == 0)
-    {
-      /* Keep track of register lives.  */
-      old_live_regs = ALLOCA_REG_SET ();
-      regs_sometimes_live
-	= (struct sometimes *) alloca (max_regno * sizeof (struct sometimes));
-      sometimes_max = 0;
-
-      /* Start with registers live at end.  */
-      COPY_REG_SET (old_live_regs, bb_live_regs);
-      EXECUTE_IF_SET_IN_REG_SET (bb_live_regs, 0, j,
-				 {
-				   sometimes_max
-				     = new_sometimes_live (regs_sometimes_live,
-							   j, sometimes_max);
-				 });
-    }
-
-  SCHED_SORT (ready, n_ready, 1);
-
-  if (file)
-    {
-      fprintf (file, ";; ready list initially:\n;; ");
-      for (i = 0; i < n_ready; i++)
-	fprintf (file, "%d ", INSN_UID (ready[i]));
-      fprintf (file, "\n\n");
-
-      for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
-	if (INSN_PRIORITY (insn) > 0)
-	  fprintf (file, ";; insn[%4d]: priority = %4d, ref_count = %4d\n",
-		   INSN_UID (insn), INSN_PRIORITY (insn),
-		   INSN_REF_COUNT (insn));
-    }
-
-  /* Now HEAD and TAIL are going to become disconnected
-     entirely from the insn chain.  */
-  tail = 0;
-
-  /* Q_SIZE will always be zero here.  */
-  q_ptr = 0; clock = 0;
-  bzero ((char *) insn_queue, sizeof (insn_queue));
-
-  /* Now, perform list scheduling.  */
-
-  /* Where we start inserting insns is after TAIL.  */
-  last = next_tail;
-
-  new_needs = (NEXT_INSN (prev_head) == BLOCK_HEAD (b)
-	       ? NEED_HEAD : NEED_NOTHING);
-  if (PREV_INSN (next_tail) == BLOCK_END (b))
-    new_needs |= NEED_TAIL;
-
-  new_ready = n_ready;
-  while (sched_n_insns < n_insns)
-    {
-      q_ptr = NEXT_Q (q_ptr); clock++;
-
-      /* Add all pending insns that can be scheduled without stalls to the
-	 ready list.  */
-      for (insn = insn_queue[q_ptr]; insn; insn = NEXT_INSN (insn))
-	{
-	  if (file)
-	    fprintf (file, ";; launching %d before %d with no stalls at T-%d\n",
-		     INSN_UID (insn), INSN_UID (last), clock);
-	  ready[new_ready++] = insn;
-	  q_size -= 1;
-	}
-      insn_queue[q_ptr] = 0;
-
-      /* If there are no ready insns, stall until one is ready and add all
-	 of the pending insns at that point to the ready list.  */
-      if (new_ready == 0)
-	{
-	  register int stalls;
-
-	  for (stalls = 1; stalls < INSN_QUEUE_SIZE; stalls++)
-	    if ((insn = insn_queue[NEXT_Q_AFTER (q_ptr, stalls)]))
-	      {
-		for (; insn; insn = NEXT_INSN (insn))
-		  {
-		    if (file)
-		      fprintf (file, ";; launching %d before %d with %d stalls at T-%d\n",
-			       INSN_UID (insn), INSN_UID (last), stalls, clock);
-		    ready[new_ready++] = insn;
-		    q_size -= 1;
-		  }
-		insn_queue[NEXT_Q_AFTER (q_ptr, stalls)] = 0;
-		break;
-	      }
-
-	  q_ptr = NEXT_Q_AFTER (q_ptr, stalls); clock += stalls;
-	}
-
-      /* There should be some instructions waiting to fire.  */
-      if (new_ready == 0)
-	abort ();
-
-      if (file)
-	{
-	  fprintf (file, ";; ready list at T-%d:", clock);
-	  for (i = 0; i < new_ready; i++)
-	    fprintf (file, " %d (%x)",
-		     INSN_UID (ready[i]), INSN_PRIORITY (ready[i]));
-	}
-
-      /* Sort the ready list and choose the best insn to schedule.  Select
-	 which insn should issue in this cycle and queue those that are
-	 blocked by function unit hazards.
-
-	 N_READY holds the number of items that were scheduled the last time,
-	 minus the one instruction scheduled on the last loop iteration; it
-	 is not modified for any other reason in this loop.  */
-
-      SCHED_SORT (ready, new_ready, n_ready);
-      if (MAX_BLOCKAGE > 1)
-	{
-	  new_ready = schedule_select (ready, new_ready, clock, file);
-	  if (new_ready == 0)
-	    {
-	      if (file)
-		fprintf (file, "\n");
-	      /* We must set n_ready here, to ensure that sorting always
-		 occurs when we come back to the SCHED_SORT line above.  */
-	      n_ready = 0;
-	      continue;
-	    }
-	}
-      n_ready = new_ready;
-      last_scheduled_insn = insn = ready[0];
-
-      /* The first insn scheduled becomes the new tail.  */
-      if (tail == 0)
-	tail = insn;
-
-      if (file)
-	{
-	  fprintf (file, ", now");
-	  for (i = 0; i < n_ready; i++)
-	    fprintf (file, " %d", INSN_UID (ready[i]));
-	  fprintf (file, "\n");
-	}
-
-      if (DONE_PRIORITY_P (insn))
-	abort ();
-
-      if (reload_completed == 0)
-	{
-	  /* Process this insn, and each insn linked to this one which must
-	     be immediately output after this insn.  */
-	  do
-	    {
-	      /* First we kill registers set by this insn, and then we
-		 make registers used by this insn live.  This is the opposite
-		 order used above because we are traversing the instructions
-		 backwards.  */
-
-	      /* Strictly speaking, we should scan REG_UNUSED notes and make
-		 every register mentioned there live, however, we will just
-		 kill them again immediately below, so there doesn't seem to
-		 be any reason why we bother to do this.  */
-
-	      /* See if this is the last notice we must take of a register.  */
-	      if (GET_CODE (PATTERN (insn)) == SET
-		  || GET_CODE (PATTERN (insn)) == CLOBBER)
-		sched_note_set (PATTERN (insn), 1);
-	      else if (GET_CODE (PATTERN (insn)) == PARALLEL)
-		{
-		  int j;
-		  for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--)
-		    if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == SET
-			|| GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == CLOBBER)
-		      sched_note_set (XVECEXP (PATTERN (insn), 0, j), 1);
-		}
-	      
-	      /* This code keeps life analysis information up to date.  */
-	      if (GET_CODE (insn) == CALL_INSN)
-		{
-		  register struct sometimes *p;
-
-		  /* A call kills all call used registers that are not
-		     global or fixed, except for those mentioned in the call
-		     pattern which will be made live again later.  */
-		  for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
-		    if (call_used_regs[i] && ! global_regs[i]
-			&& ! fixed_regs[i])
-		      {
-			CLEAR_REGNO_REG_SET (bb_live_regs, i);
-			SET_REGNO_REG_SET (bb_dead_regs, i);
-		      }
-
-		  /* Regs live at the time of a call instruction must not
-		     go in a register clobbered by calls.  Record this for
-		     all regs now live.  Note that insns which are born or
-		     die in a call do not cross a call, so this must be done
-		     after the killings (above) and before the births
-		     (below).  */
-		  p = regs_sometimes_live;
-		  for (i = 0; i < sometimes_max; i++, p++)
-		    if (REGNO_REG_SET_P (bb_live_regs, p->regno))
-		      p->calls_crossed += 1;
-		}
-
-	      /* Make every register used live, and add REG_DEAD notes for
-		 registers which were not live before we started.  */
-	      attach_deaths_insn (insn);
-
-	      /* Find registers now made live by that instruction.  */
-	      EXECUTE_IF_AND_COMPL_IN_REG_SET (bb_live_regs, old_live_regs, 0, i,
-					       {
-						 sometimes_max
-						   = new_sometimes_live (regs_sometimes_live,
-									 i, sometimes_max);
-					       });
-	      IOR_REG_SET (old_live_regs, bb_live_regs);
-
-	      /* Count lengths of all regs we are worrying about now,
-		 and handle registers no longer live.  */
-
-	      for (i = 0; i < sometimes_max; i++)
-		{
-		  register struct sometimes *p = &regs_sometimes_live[i];
-		  int regno = p->regno;
-
-		  p->live_length += 1;
-
-		  if (!REGNO_REG_SET_P (bb_live_regs, p->regno))
-		    {
-		      /* This is the end of one of this register's lifetime
-			 segments.  Save the lifetime info collected so far,
-			 and clear its bit in the old_live_regs entry.  */
-		      sched_reg_live_length[regno] += p->live_length;
-		      sched_reg_n_calls_crossed[regno] += p->calls_crossed;
-		      CLEAR_REGNO_REG_SET (old_live_regs, p->regno);
-
-		      /* Delete the reg_sometimes_live entry for this reg by
-			 copying the last entry over top of it.  */
-		      *p = regs_sometimes_live[--sometimes_max];
-		      /* ...and decrement i so that this newly copied entry
-			 will be processed.  */
-		      i--;
-		    }
-		}
-
-	      link = insn;
-	      insn = PREV_INSN (insn);
-	    }
-	  while (SCHED_GROUP_P (link));
-
-	  /* Set INSN back to the insn we are scheduling now.  */
-	  insn = ready[0];
-	}
-
-      /* Schedule INSN.  Remove it from the ready list.  */
-      ready += 1;
-      n_ready -= 1;
-
-      sched_n_insns += 1;
-      NEXT_INSN (insn) = last;
-      PREV_INSN (last) = insn;
-
-      /* Everything that precedes INSN now either becomes "ready", if
-	 it can execute immediately before INSN, or "pending", if
-	 there must be a delay.  Give INSN high enough priority that
-	 at least one (maybe more) reg-killing insns can be launched
-	 ahead of all others.  Mark INSN as scheduled by changing its
-	 priority to -1.  */
-      INSN_PRIORITY (insn) = LAUNCH_PRIORITY;
-      new_ready = schedule_insn (insn, ready, n_ready, clock);
-      INSN_PRIORITY (insn) = DONE_PRIORITY;
-
-      /* Schedule all prior insns that must not be moved.  */
-      if (SCHED_GROUP_P (insn))
-	{
-	  /* Disable these insns from being launched, in case one of the
-	     insns in the group has a dependency on an earlier one.  */
-	  link = insn;
-	  while (SCHED_GROUP_P (link))
-	    {
-	      /* Disable these insns from being launched by anybody.  */
-	      link = PREV_INSN (link);
-	      INSN_REF_COUNT (link) = 0;
-	    }
-
-	  /* Now handle each group insn like the main insn was handled
-	     above.  */
-	  link = insn;
-	  while (SCHED_GROUP_P (link))
-	    {
-	      link = PREV_INSN (link);
-
-	      sched_n_insns += 1;
-
-	      /* ??? Why don't we set LAUNCH_PRIORITY here?  */
-	      new_ready = schedule_insn (link, ready, new_ready, clock);
-	      INSN_PRIORITY (link) = DONE_PRIORITY;
-	    }
-	}
-
-      /* Put back NOTE_INSN_SETJMP,
-         NOTE_INSN_{LOOP,EHREGION}_{BEGIN,END} notes.  */
-
-      /* To prime the loop.  We need to handle INSN and all the insns in the
-         sched group.  */
-      last = NEXT_INSN (insn);
-      do
-	{
-	  insn = PREV_INSN (last);
-
-	  /* Maintain a valid chain so emit_note_before works.
-	     This is necessary because PREV_INSN (insn) isn't valid
-	     (if ! SCHED_GROUP_P) and if it points to an insn already
-	     scheduled, a circularity will result.  */
-	  if (! SCHED_GROUP_P (insn))
-	    {
-	      NEXT_INSN (prev_head) = insn;
-	      PREV_INSN (insn) = prev_head;
-	    }
-
-	  last = reemit_notes (insn, insn);
-	}
-      while (SCHED_GROUP_P (insn));
-    }
-  if (q_size != 0)
-    abort ();
-
-  if (reload_completed == 0)
-    finish_sometimes_live (regs_sometimes_live, sometimes_max);
-
-  /* HEAD is now the first insn in the chain of insns that
-     been scheduled by the loop above.
-     TAIL is the last of those insns.  */
-  head = last;
-
-  /* NOTE_LIST is the end of a chain of notes previously found
-     among the insns.  Insert them at the beginning of the insns.  */
-  if (note_list != 0)
-    {
-      rtx note_head = note_list;
-      while (PREV_INSN (note_head))
-	note_head = PREV_INSN (note_head);
-
-      PREV_INSN (head) = note_list;
-      NEXT_INSN (note_list) = head;
-      head = note_head;
-    }
-
-  /* There should be no REG_DEAD notes leftover at the end.
-     In practice, this can occur as the result of bugs in flow, combine.c,
-     and/or sched.c.  The values of the REG_DEAD notes remaining are
-     meaningless, because dead_notes is just used as a free list.  */
-#if 1
-  if (dead_notes != 0)
-    abort ();
-#endif
-
-  if (new_needs & NEED_HEAD)
-    BLOCK_HEAD (b) = head;
-  PREV_INSN (head) = prev_head;
-  NEXT_INSN (prev_head) = head;
-
-  if (new_needs & NEED_TAIL)
-    BLOCK_END (b) = tail;
-  NEXT_INSN (tail) = next_tail;
-  PREV_INSN (next_tail) = tail;
-
-  /* Restore the line-number notes of each insn.  */
-  if (write_symbols != NO_DEBUG)
-    {
-      rtx line, note, prev, new;
-      int notes = 0;
-
-      head = BLOCK_HEAD (b);
-      next_tail = NEXT_INSN (BLOCK_END (b));
-
-      /* Determine the current line-number.  We want to know the current
-	 line number of the first insn of the block here, in case it is
-	 different from the true line number that was saved earlier.  If
-	 different, then we need a line number note before the first insn
-	 of this block.  If it happens to be the same, then we don't want to
-	 emit another line number note here.  */
-      for (line = head; line; line = PREV_INSN (line))
-	if (GET_CODE (line) == NOTE && NOTE_LINE_NUMBER (line) > 0)
-	  break;
-
-      /* Walk the insns keeping track of the current line-number and inserting
-	 the line-number notes as needed.  */
-      for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
-	if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0)
-	  line = insn;
-      /* This used to emit line number notes before every non-deleted note.
-	 However, this confuses a debugger, because line notes not separated
-	 by real instructions all end up at the same address.  I can find no
-	 use for line number notes before other notes, so none are emitted.  */
-	else if (GET_CODE (insn) != NOTE
-		 && (note = LINE_NOTE (insn)) != 0
-		 && note != line
-		 && (line == 0
-		     || NOTE_LINE_NUMBER (note) != NOTE_LINE_NUMBER (line)
-		     || NOTE_SOURCE_FILE (note) != NOTE_SOURCE_FILE (line)))
-	  {
-	    line = note;
-	    prev = PREV_INSN (insn);
-	    if (LINE_NOTE (note))
-	      {
-		/* Re-use the original line-number note.  */
-		LINE_NOTE (note) = 0;
-		PREV_INSN (note) = prev;
-		NEXT_INSN (prev) = note;
-		PREV_INSN (insn) = note;
-		NEXT_INSN (note) = insn;
-	      }
-	    else
-	      {
-		notes++;
-		new = emit_note_after (NOTE_LINE_NUMBER (note), prev);
-		NOTE_SOURCE_FILE (new) = NOTE_SOURCE_FILE (note);
-		RTX_INTEGRATED_P (new) = RTX_INTEGRATED_P (note);
-	      }
-	  }
-      if (file && notes)
-	fprintf (file, ";; added %d line-number notes\n", notes);
-    }
-
-  if (file)
-    {
-      fprintf (file, ";; total time = %d\n;; new basic block head = %d\n;; new basic block end = %d\n\n",
-	       clock, INSN_UID (BLOCK_HEAD (b)), INSN_UID (BLOCK_END (b)));
-    }
-
-  /* Yow! We're done!  */
-  free_pending_lists ();
-
-ret:
-  FREE_REG_SET (reg_pending_sets);
-  FREE_REG_SET (old_live_regs);
-
-  return;
-}
-
-/* Subroutine of update_flow_info.  Determines whether any new REG_NOTEs are
-   needed for the hard register mentioned in the note.  This can happen
-   if the reference to the hard register in the original insn was split into
-   several smaller hard register references in the split insns.  */
-
-static void
-split_hard_reg_notes (note, first, last)
-  rtx note, first, last;
-{
-  rtx reg, temp, link;
-  int n_regs, i, new_reg;
-  rtx insn;
-
-  /* Assume that this is a REG_DEAD note.  */
-  if (REG_NOTE_KIND (note) != REG_DEAD)
-    abort ();
-
-  reg = XEXP (note, 0);
-
-  n_regs = HARD_REGNO_NREGS (REGNO (reg), GET_MODE (reg));
-
-  for (i = 0; i < n_regs; i++)
-    {
-      new_reg = REGNO (reg) + i;
-
-      /* Check for references to new_reg in the split insns.  */
-      for (insn = last; ; insn = PREV_INSN (insn))
-	{
-	  if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
-	      && (temp = regno_use_in (new_reg, PATTERN (insn))))
-	    {
-	      /* Create a new reg dead note here.  */
-	      link = rtx_alloc (EXPR_LIST);
-	      PUT_REG_NOTE_KIND (link, REG_DEAD);
-	      XEXP (link, 0) = temp;
-	      XEXP (link, 1) = REG_NOTES (insn);
-	      REG_NOTES (insn) = link;
-
-	      /* If killed multiple registers here, then add in the excess.  */
-	      i += HARD_REGNO_NREGS (REGNO (temp), GET_MODE (temp)) - 1;
-
-	      break;
-	    }
-	  /* It isn't mentioned anywhere, so no new reg note is needed for
-	     this register.  */
-	  if (insn == first)
-	    break;
-	}
-    }
-}
-
-/* Subroutine of update_flow_info.  Determines whether a SET or CLOBBER in an
-   insn created by splitting needs a REG_DEAD or REG_UNUSED note added.  */
-
-static void
-new_insn_dead_notes (pat, insn, last, orig_insn)
-     rtx pat, insn, last, orig_insn;
-{
-  rtx dest, tem, set;
-
-  /* PAT is either a CLOBBER or a SET here.  */
-  dest = XEXP (pat, 0);
-
-  while (GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SUBREG
-	 || GET_CODE (dest) == STRICT_LOW_PART
-	 || GET_CODE (dest) == SIGN_EXTRACT)
-    dest = XEXP (dest, 0);
-
-  if (GET_CODE (dest) == REG)
-    {
-      /* If the original insn already used this register, we may not add new
-         notes for it.  One example for a split that needs this test is
-	 when a multi-word memory access with register-indirect addressing
-	 is split into multiple memory accesses with auto-increment and
-	 one adjusting add instruction for the address register.  */
-      if (reg_referenced_p (dest, PATTERN (orig_insn)))
-	return;
-      for (tem = last; tem != insn; tem = PREV_INSN (tem))
-	{
-	  if (GET_RTX_CLASS (GET_CODE (tem)) == 'i'
-	      && reg_overlap_mentioned_p (dest, PATTERN (tem))
-	      && (set = single_set (tem)))
-	    {
-	      rtx tem_dest = SET_DEST (set);
-
-	      while (GET_CODE (tem_dest) == ZERO_EXTRACT
-		     || GET_CODE (tem_dest) == SUBREG
-		     || GET_CODE (tem_dest) == STRICT_LOW_PART
-		     || GET_CODE (tem_dest) == SIGN_EXTRACT)
-		tem_dest = XEXP (tem_dest, 0);
-
-	      if (! rtx_equal_p (tem_dest, dest))
-		{
-		  /* Use the same scheme as combine.c, don't put both REG_DEAD
-		     and REG_UNUSED notes on the same insn.  */
-		  if (! find_regno_note (tem, REG_UNUSED, REGNO (dest))
-		      && ! find_regno_note (tem, REG_DEAD, REGNO (dest)))
-		    {
-		      rtx note = rtx_alloc (EXPR_LIST);
-		      PUT_REG_NOTE_KIND (note, REG_DEAD);
-		      XEXP (note, 0) = dest;
-		      XEXP (note, 1) = REG_NOTES (tem);
-		      REG_NOTES (tem) = note;
-		    }
-		  /* The reg only dies in one insn, the last one that uses
-		     it.  */
-		  break;
-		}
-	      else if (reg_overlap_mentioned_p (dest, SET_SRC (set)))
-		/* We found an instruction that both uses the register,
-		   and sets it, so no new REG_NOTE is needed for this set.  */
-		break;
-	    }
-	}
-      /* If this is a set, it must die somewhere, unless it is the dest of
-	 the original insn, and hence is live after the original insn.  Abort
-	 if it isn't supposed to be live after the original insn.
-
-	 If this is a clobber, then just add a REG_UNUSED note.  */
-      if (tem == insn)
-	{
-	  int live_after_orig_insn = 0;
-	  rtx pattern = PATTERN (orig_insn);
-	  int i;
-
-	  if (GET_CODE (pat) == CLOBBER)
-	    {
-	      rtx note = rtx_alloc (EXPR_LIST);
-	      PUT_REG_NOTE_KIND (note, REG_UNUSED);
-	      XEXP (note, 0) = dest;
-	      XEXP (note, 1) = REG_NOTES (insn);
-	      REG_NOTES (insn) = note;
-	      return;
-	    }
-
-	  /* The original insn could have multiple sets, so search the
-	     insn for all sets.  */
-	  if (GET_CODE (pattern) == SET)
-	    {
-	      if (reg_overlap_mentioned_p (dest, SET_DEST (pattern)))
-		live_after_orig_insn = 1;
-	    }
-	  else if (GET_CODE (pattern) == PARALLEL)
-	    {
-	      for (i = 0; i < XVECLEN (pattern, 0); i++)
-		if (GET_CODE (XVECEXP (pattern, 0, i)) == SET
-		    && reg_overlap_mentioned_p (dest,
-						SET_DEST (XVECEXP (pattern,
-								   0, i))))
-		  live_after_orig_insn = 1;
-	    }
-
-	  if (! live_after_orig_insn)
-	    abort ();
-	}
-    }
-}
-
-/* Subroutine of update_flow_info.  Update the value of reg_n_sets for all
-   registers modified by X.  INC is -1 if the containing insn is being deleted,
-   and is 1 if the containing insn is a newly generated insn.  */
-
-static void
-update_n_sets (x, inc)
-     rtx x;
-     int inc;
-{
-  rtx dest = SET_DEST (x);
-
-  while (GET_CODE (dest) == STRICT_LOW_PART || GET_CODE (dest) == SUBREG
-	 || GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SIGN_EXTRACT)
-    dest = SUBREG_REG (dest);
-	  
-  if (GET_CODE (dest) == REG)
-    {
-      int regno = REGNO (dest);
-      
-      if (regno < FIRST_PSEUDO_REGISTER)
-	{
-	  register int i;
-	  int endregno = regno + HARD_REGNO_NREGS (regno, GET_MODE (dest));
-	  
-	  for (i = regno; i < endregno; i++)
-	    REG_N_SETS (i) += inc;
-	}
-      else
-	REG_N_SETS (regno) += inc;
-    }
-}
-
-/* Updates all flow-analysis related quantities (including REG_NOTES) for
-   the insns from FIRST to LAST inclusive that were created by splitting
-   ORIG_INSN.  NOTES are the original REG_NOTES.  */
-
-void
-update_flow_info (notes, first, last, orig_insn)
-     rtx notes;
-     rtx first, last;
-     rtx orig_insn;
-{
-  rtx insn, note;
-  rtx next;
-  rtx orig_dest, temp;
-  rtx set;
-
-  /* Get and save the destination set by the original insn.  */
-
-  orig_dest = single_set (orig_insn);
-  if (orig_dest)
-    orig_dest = SET_DEST (orig_dest);
-
-  /* Move REG_NOTES from the original insn to where they now belong.  */
-
-  for (note = notes; note; note = next)
-    {
-      next = XEXP (note, 1);
-      switch (REG_NOTE_KIND (note))
-	{
-	case REG_DEAD:
-	case REG_UNUSED:
-	  /* Move these notes from the original insn to the last new insn where
-	     the register is now set.  */
-
-	  for (insn = last; ; insn = PREV_INSN (insn))
-	    {
-	      if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
-		  && reg_mentioned_p (XEXP (note, 0), PATTERN (insn)))
-		{
-		  /* If this note refers to a multiple word hard register, it
-		     may have been split into several smaller hard register
-		     references, so handle it specially.  */
-		  temp = XEXP (note, 0);
-		  if (REG_NOTE_KIND (note) == REG_DEAD
-		      && GET_CODE (temp) == REG
-		      && REGNO (temp) < FIRST_PSEUDO_REGISTER
-		      && HARD_REGNO_NREGS (REGNO (temp), GET_MODE (temp)) > 1)
-		    split_hard_reg_notes (note, first, last);
-		  else
-		    {
-		      XEXP (note, 1) = REG_NOTES (insn);
-		      REG_NOTES (insn) = note;
-		    }
-
-		  /* Sometimes need to convert REG_UNUSED notes to REG_DEAD
-		     notes.  */
-		  /* ??? This won't handle multiple word registers correctly,
-		     but should be good enough for now.  */
-		  if (REG_NOTE_KIND (note) == REG_UNUSED
-		      && GET_CODE (XEXP (note, 0)) != SCRATCH
-		      && ! dead_or_set_p (insn, XEXP (note, 0)))
-		    PUT_REG_NOTE_KIND (note, REG_DEAD);
-
-		  /* The reg only dies in one insn, the last one that uses
-		     it.  */
-		  break;
-		}
-	      /* It must die somewhere, fail it we couldn't find where it died.
-
-		 If this is a REG_UNUSED note, then it must be a temporary
-		 register that was not needed by this instantiation of the
-		 pattern, so we can safely ignore it.  */
-	      if (insn == first)
-		{			
-		  if (REG_NOTE_KIND (note) != REG_UNUSED)
-		    abort ();
-
-		  break;
-		}
-	    }
-	  break;
-
-	case REG_WAS_0:
-	  /* If the insn that set the register to 0 was deleted, this
-	     note cannot be relied on any longer.  The destination might
-	     even have been moved to memory.
-             This was observed for SH4 with execute/920501-6.c compilation,
-	     -O2 -fomit-frame-pointer -finline-functions .  */
-	  if (GET_CODE (XEXP (note, 0)) == NOTE
-	      || INSN_DELETED_P (XEXP (note, 0)))
-	    break;
-	  /* This note applies to the dest of the original insn.  Find the
-	     first new insn that now has the same dest, and move the note
-	     there.  */
-
-	  if (! orig_dest)
-	    abort ();
-
-	  for (insn = first; ; insn = NEXT_INSN (insn))
-	    {
-	      if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
-		  && (temp = single_set (insn))
-		  && rtx_equal_p (SET_DEST (temp), orig_dest))
-		{
-		  XEXP (note, 1) = REG_NOTES (insn);
-		  REG_NOTES (insn) = note;
-		  /* The reg is only zero before one insn, the first that
-		     uses it.  */
-		  break;
-		}
-	      /* If this note refers to a multiple word hard
-		 register, it may have been split into several smaller
-		 hard register references.  We could split the notes,
-		 but simply dropping them is good enough.  */
-	      if (GET_CODE (orig_dest) == REG
-		  && REGNO (orig_dest) < FIRST_PSEUDO_REGISTER
-		  && HARD_REGNO_NREGS (REGNO (orig_dest),
-				       GET_MODE (orig_dest)) > 1)
-		    break;
-	      /* It must be set somewhere, fail if we couldn't find where it
-		 was set.  */
-	      if (insn == last)
-		abort ();
-	    }
-	  break;
-
-	case REG_EQUAL:
-	case REG_EQUIV:
-	  /* A REG_EQUIV or REG_EQUAL note on an insn with more than one
-	     set is meaningless.  Just drop the note.  */
-	  if (! orig_dest)
-	    break;
-
-	case REG_NO_CONFLICT:
-	  /* These notes apply to the dest of the original insn.  Find the last
-	     new insn that now has the same dest, and move the note there.  */
-
-	  if (! orig_dest)
-	    abort ();
-
-	  for (insn = last; ; insn = PREV_INSN (insn))
-	    {
-	      if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
-		  && (temp = single_set (insn))
-		  && rtx_equal_p (SET_DEST (temp), orig_dest))
-		{
-		  XEXP (note, 1) = REG_NOTES (insn);
-		  REG_NOTES (insn) = note;
-		  /* Only put this note on one of the new insns.  */
-		  break;
-		}
-
-	      /* The original dest must still be set someplace.  Abort if we
-		 couldn't find it.  */
-	      if (insn == first)
-		{
-		  /* However, if this note refers to a multiple word hard
-		     register, it may have been split into several smaller
-		     hard register references.  We could split the notes,
-		     but simply dropping them is good enough.  */
-		  if (GET_CODE (orig_dest) == REG
-		      && REGNO (orig_dest) < FIRST_PSEUDO_REGISTER
-		      && HARD_REGNO_NREGS (REGNO (orig_dest),
-					   GET_MODE (orig_dest)) > 1)
-		    break;
-		  /* Likewise for multi-word memory references.  */
-		  if (GET_CODE (orig_dest) == MEM
-		      && SIZE_FOR_MODE (orig_dest) > MOVE_MAX)
-		    break;
-		  abort ();
-		}
-	    }
-	  break;
-
-	case REG_LIBCALL:
-	  /* Move a REG_LIBCALL note to the first insn created, and update
-	     the corresponding REG_RETVAL note.  */
-	  XEXP (note, 1) = REG_NOTES (first);
-	  REG_NOTES (first) = note;
-
-	  insn = XEXP (note, 0);
-	  note = find_reg_note (insn, REG_RETVAL, NULL_RTX);
-	  if (note)
-	    XEXP (note, 0) = first;
-	  break;
-
-	case REG_EXEC_COUNT:
-	  /* Move a REG_EXEC_COUNT note to the first insn created.  */
-	  XEXP (note, 1) = REG_NOTES (first);
-	  REG_NOTES (first) = note;
-	  break;
-
-	case REG_RETVAL:
-	  /* Move a REG_RETVAL note to the last insn created, and update
-	     the corresponding REG_LIBCALL note.  */
-	  XEXP (note, 1) = REG_NOTES (last);
-	  REG_NOTES (last) = note;
-
-	  insn = XEXP (note, 0);
-	  note = find_reg_note (insn, REG_LIBCALL, NULL_RTX);
-	  if (note)
-	    XEXP (note, 0) = last;
-	  break;
-
-	case REG_NONNEG:
-	case REG_BR_PROB:
-	  /* This should be moved to whichever instruction is a JUMP_INSN.  */
-
-	  for (insn = last; ; insn = PREV_INSN (insn))
-	    {
-	      if (GET_CODE (insn) == JUMP_INSN)
-		{
-		  XEXP (note, 1) = REG_NOTES (insn);
-		  REG_NOTES (insn) = note;
-		  /* Only put this note on one of the new insns.  */
-		  break;
-		}
-	      /* Fail if we couldn't find a JUMP_INSN.  */
-	      if (insn == first)
-		abort ();
-	    }
-	  break;
-
-	case REG_INC:
-	  /* reload sometimes leaves obsolete REG_INC notes around.  */
-	  if (reload_completed)
-	    break;
-	  /* This should be moved to whichever instruction now has the
-	     increment operation.  */
-	  abort ();
-
-	case REG_LABEL:
-	  /* Should be moved to the new insn(s) which use the label.  */
-	  for (insn = first; insn != NEXT_INSN (last); insn = NEXT_INSN (insn))
-	    if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
-		&& reg_mentioned_p (XEXP (note, 0), PATTERN (insn)))
-	      REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_LABEL,
-						    XEXP (note, 0),
-						    REG_NOTES (insn));
-	  break;
-
-	case REG_CC_SETTER:
-	case REG_CC_USER:
-	  /* These two notes will never appear until after reorg, so we don't
-	     have to handle them here.  */
-	default:
-	  abort ();
-	}
-    }
-
-  /* Each new insn created, except the last, has a new set.  If the destination
-     is a register, then this reg is now live across several insns, whereas
-     previously the dest reg was born and died within the same insn.  To
-     reflect this, we now need a REG_DEAD note on the insn where this
-     dest reg dies.
-
-     Similarly, the new insns may have clobbers that need REG_UNUSED notes.  */
-
-  for (insn = first; insn != last; insn = NEXT_INSN (insn))
-    {
-      rtx pat;
-      int i;
-
-      pat = PATTERN (insn);
-      if (GET_CODE (pat) == SET || GET_CODE (pat) == CLOBBER)
-	new_insn_dead_notes (pat, insn, last, orig_insn);
-      else if (GET_CODE (pat) == PARALLEL)
-	{
-	  for (i = 0; i < XVECLEN (pat, 0); i++)
-	    if (GET_CODE (XVECEXP (pat, 0, i)) == SET
-		|| GET_CODE (XVECEXP (pat, 0, i)) == CLOBBER)
-	      new_insn_dead_notes (XVECEXP (pat, 0, i), insn, last, orig_insn);
-	}
-    }
-
-  /* If any insn, except the last, uses the register set by the last insn,
-     then we need a new REG_DEAD note on that insn.  In this case, there
-     would not have been a REG_DEAD note for this register in the original
-     insn because it was used and set within one insn.  */
-
-  set = single_set (last);
-  if (set)
-    {
-      rtx dest = SET_DEST (set);
-
-      while (GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SUBREG
-	     || GET_CODE (dest) == STRICT_LOW_PART
-	     || GET_CODE (dest) == SIGN_EXTRACT)
-	dest = XEXP (dest, 0);
-
-      if (GET_CODE (dest) == REG
-	  /* Global registers are always live, so the code below does not
-	     apply to them.  */
-	  && (REGNO (dest) >= FIRST_PSEUDO_REGISTER
-	      || ! global_regs[REGNO (dest)]))
-	{
-	  rtx stop_insn = PREV_INSN (first);
-
-	  /* If the last insn uses the register that it is setting, then
-	     we don't want to put a REG_DEAD note there.  Search backwards
-	     to find the first insn that sets but does not use DEST.  */
-
-	  insn = last;
-	  if (reg_overlap_mentioned_p (dest, SET_SRC (set)))
-	    {
-	      for (insn = PREV_INSN (insn); insn != first;
-		   insn = PREV_INSN (insn))
-		{
-		  if ((set = single_set (insn))
-		      && reg_mentioned_p (dest, SET_DEST (set))
-		      && ! reg_overlap_mentioned_p (dest, SET_SRC (set)))
-		    break;
-		}
-	    }
-
-	  /* Now find the first insn that uses but does not set DEST.  */
-
-	  for (insn = PREV_INSN (insn); insn != stop_insn;
-	       insn = PREV_INSN (insn))
-	    {
-	      if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
-		  && reg_mentioned_p (dest, PATTERN (insn))
-		  && (set = single_set (insn)))
-		{
-		  rtx insn_dest = SET_DEST (set);
-
-		  while (GET_CODE (insn_dest) == ZERO_EXTRACT
-			 || GET_CODE (insn_dest) == SUBREG
-			 || GET_CODE (insn_dest) == STRICT_LOW_PART
-			 || GET_CODE (insn_dest) == SIGN_EXTRACT)
-		    insn_dest = XEXP (insn_dest, 0);
-
-		  if (insn_dest != dest)
-		    {
-		      note = rtx_alloc (EXPR_LIST);
-		      PUT_REG_NOTE_KIND (note, REG_DEAD);
-		      XEXP (note, 0) = dest;
-		      XEXP (note, 1) = REG_NOTES (insn);
-		      REG_NOTES (insn) = note;
-		      /* The reg only dies in one insn, the last one
-			 that uses it.  */
-		      break;
-		    }
-		}
-	    }
-	}
-    }
-
-  /* If the original dest is modifying a multiple register target, and the
-     original instruction was split such that the original dest is now set
-     by two or more SUBREG sets, then the split insns no longer kill the
-     destination of the original insn.
-
-     In this case, if there exists an instruction in the same basic block,
-     before the split insn, which uses the original dest, and this use is
-     killed by the original insn, then we must remove the REG_DEAD note on
-     this insn, because it is now superfluous.
-
-     This does not apply when a hard register gets split, because the code
-     knows how to handle overlapping hard registers properly.  */
-  if (orig_dest && GET_CODE (orig_dest) == REG)
-    {
-      int found_orig_dest = 0;
-      int found_split_dest = 0;
-
-      for (insn = first; ; insn = NEXT_INSN (insn))
-	{
-	  rtx pat = PATTERN (insn);
-	  int i = GET_CODE (pat) == PARALLEL ? XVECLEN (pat, 0) : 0;
-	  set = pat;
-	  for (;;)
-	    {
-	      if (GET_CODE (set) == SET)
-		{
-		  if (GET_CODE (SET_DEST (set)) == REG
-		      && REGNO (SET_DEST (set)) == REGNO (orig_dest))
-		    {
-		      found_orig_dest = 1;
-		      break;
-		    }
-		  else if (GET_CODE (SET_DEST (set)) == SUBREG
-			   && SUBREG_REG (SET_DEST (set)) == orig_dest)
-		    {
-		      found_split_dest = 1;
-		      break;
-		    }
-		}
-	      if (--i < 0)
-		break;
-	      set = XVECEXP (pat, 0, i);
-	    }
-
-	  if (insn == last)
-	    break;
-	}
-
-      if (found_split_dest)
-	{
-	  /* Search backwards from FIRST, looking for the first insn that uses
-	     the original dest.  Stop if we pass a CODE_LABEL or a JUMP_INSN.
-	     If we find an insn, and it has a REG_DEAD note, then delete the
-	     note.  */
-
-	  for (insn = first; insn; insn = PREV_INSN (insn))
-	    {
-	      if (GET_CODE (insn) == CODE_LABEL
-		  || GET_CODE (insn) == JUMP_INSN)
-		break;
-	      else if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
-		       && reg_mentioned_p (orig_dest, insn))
-		{
-		  note = find_regno_note (insn, REG_DEAD, REGNO (orig_dest));
-		  if (note)
-		    remove_note (insn, note);
-		}
-	    }
-	}
-      else if (! found_orig_dest)
-	{
-	  int i, regno;
-
-	  /* Should never reach here for a pseudo reg.  */
-	  if (REGNO (orig_dest) >= FIRST_PSEUDO_REGISTER)
-	    abort ();
-
-	  /* This can happen for a hard register, if the splitter
-	     does not bother to emit instructions which would be no-ops.
-	     We try to verify that this is the case by checking to see if
-	     the original instruction uses all of the registers that it
-	     set.  This case is OK, because deleting a no-op can not affect
-	     REG_DEAD notes on other insns.  If this is not the case, then
-	     abort.  */
-	  
-	  regno = REGNO (orig_dest);
-	  for (i = HARD_REGNO_NREGS (regno, GET_MODE (orig_dest)) - 1;
-	       i >= 0; i--)
-	    if (! refers_to_regno_p (regno + i, regno + i + 1, orig_insn,
-				     NULL_PTR))
-	      break;
-	  if (i >= 0)
-	    abort ();
-	}
-    }
-
-  /* Update reg_n_sets.  This is necessary to prevent local alloc from
-     converting REG_EQUAL notes to REG_EQUIV when splitting has modified
-     a reg from set once to set multiple times.  */
-
-  {
-    rtx x = PATTERN (orig_insn);
-    RTX_CODE code = GET_CODE (x);
-
-    if (code == SET || code == CLOBBER)
-      update_n_sets (x, -1);
-    else if (code == PARALLEL)
-      {
-	int i;
-	for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
-	  {
-	    code = GET_CODE (XVECEXP (x, 0, i));
-	    if (code == SET || code == CLOBBER)
-	      update_n_sets (XVECEXP (x, 0, i), -1);
-	  }
-      }
-
-    for (insn = first; ; insn = NEXT_INSN (insn))
-      {
-	x = PATTERN (insn);
-	code = GET_CODE (x);
-
-	if (code == SET || code == CLOBBER)
-	  update_n_sets (x, 1);
-	else if (code == PARALLEL)
-	  {
-	    int i;
-	    for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
-	      {
-		code = GET_CODE (XVECEXP (x, 0, i));
-		if (code == SET || code == CLOBBER)
-		  update_n_sets (XVECEXP (x, 0, i), 1);
-	      }
-	  }
-
-	if (insn == last)
-	  break;
-      }
-  }
-}
-
-/* The one entry point in this file.  DUMP_FILE is the dump file for
-   this pass.  */
-
-void
-schedule_insns (dump_file)
-     FILE *dump_file;
-{
-  int max_uid = MAX_INSNS_PER_SPLIT * (get_max_uid () + 1);
-  int b;
-  rtx insn;
-
-  /* Taking care of this degenerate case makes the rest of
-     this code simpler.  */
-  if (n_basic_blocks == 0)
-    return;
-
-  /* Create an insn here so that we can hang dependencies off of it later.  */
-  sched_before_next_call
-    = gen_rtx_INSN (VOIDmode, 0, NULL_RTX, NULL_RTX,
-		    NULL_RTX, 0, NULL_RTX, NULL_RTX);
-
-  /* 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;
-    }
-
-  /* We create no insns here, only reorder them, so we
-     remember how far we can cut back the stack on exit.  */
-
-  /* Allocate data for this pass.  See comments, above,
-     for what these vectors do.
-
-     We use xmalloc instead of alloca, because max_uid can be very large
-     when there is a lot of function inlining.  If we used alloca, we could
-     exceed stack limits on some hosts for some inputs.  */
-  insn_luid = (int *) xmalloc (max_uid * sizeof (int));
-  insn_priority = (int *) xmalloc (max_uid * sizeof (int));
-  insn_tick = (int *) xmalloc (max_uid * sizeof (int));
-  insn_costs = (short *) xmalloc (max_uid * sizeof (short));
-  insn_units = (short *) xmalloc (max_uid * sizeof (short));
-  insn_blockage = (unsigned int *) xmalloc (max_uid * sizeof (unsigned int));
-  insn_ref_count = (int *) xmalloc (max_uid * sizeof (int));
-
-  if (reload_completed == 0)
-    {
-      sched_reg_n_calls_crossed = (int *) alloca (max_regno * sizeof (int));
-      sched_reg_live_length = (int *) alloca (max_regno * sizeof (int));
-      bb_dead_regs = ALLOCA_REG_SET ();
-      bb_live_regs = ALLOCA_REG_SET ();
-      bzero ((char *) sched_reg_n_calls_crossed, max_regno * sizeof (int));
-      bzero ((char *) sched_reg_live_length, max_regno * sizeof (int));
-    }
-  else
-    {
-      sched_reg_n_calls_crossed = 0;
-      sched_reg_live_length = 0;
-      bb_dead_regs = 0;
-      bb_live_regs = 0;
-    }
-  init_alias_analysis ();
-
-  if (write_symbols != NO_DEBUG)
-    {
-      rtx line;
-
-      line_note = (rtx *) xmalloc (max_uid * sizeof (rtx));
-      bzero ((char *) line_note, max_uid * sizeof (rtx));
-      line_note_head = (rtx *) alloca (n_basic_blocks * sizeof (rtx));
-      bzero ((char *) line_note_head, n_basic_blocks * sizeof (rtx));
-
-      /* Determine the line-number at the start of each basic block.
-	 This must be computed and saved now, because after a basic block's
-	 predecessor has been scheduled, it is impossible to accurately
-	 determine the correct line number for the first insn of the block.  */
-	 
-      for (b = 0; b < n_basic_blocks; b++)
-	for (line = BLOCK_HEAD (b); line; line = PREV_INSN (line))
-	  if (GET_CODE (line) == NOTE && NOTE_LINE_NUMBER (line) > 0)
-	    {
-	      line_note_head[b] = line;
-	      break;
-	    }
-    }
-
-  bzero ((char *) insn_luid, max_uid * sizeof (int));
-  bzero ((char *) insn_priority, max_uid * sizeof (int));
-  bzero ((char *) insn_tick, max_uid * sizeof (int));
-  bzero ((char *) insn_costs, max_uid * sizeof (short));
-  bzero ((char *) insn_units, max_uid * sizeof (short));
-  bzero ((char *) insn_blockage, max_uid * sizeof (unsigned int));
-  bzero ((char *) insn_ref_count, max_uid * sizeof (int));
-
-  /* Schedule each basic block, block by block.  */
-
-  /* ??? Add a NOTE after the last insn of the last basic block.  It is not
-     known why this is done.  */
-  /* ??? Perhaps it's done to ensure NEXT_TAIL in schedule_block is a
-     valid insn.  */
-
-  insn = BLOCK_END (n_basic_blocks-1);
-  if (NEXT_INSN (insn) == 0
-      || (GET_CODE (insn) != NOTE
-	  && GET_CODE (insn) != CODE_LABEL
-	  /* Don't emit a NOTE if it would end up between an unconditional
-	     jump and a BARRIER.  */
-	  && ! (GET_CODE (insn) == JUMP_INSN
-		&& GET_CODE (NEXT_INSN (insn)) == BARRIER)))
-    emit_note_after (NOTE_INSN_DELETED, BLOCK_END (n_basic_blocks-1));
-
-  for (b = 0; b < n_basic_blocks; b++)
-    {
-      note_list = 0;
-
-      split_block_insns (b, reload_completed == 0 || ! flag_schedule_insns);
-
-      schedule_block (b, dump_file);
-
-#ifdef USE_C_ALLOCA
-      alloca (0);
-#endif
-    }
-
-  /* Reposition the prologue and epilogue notes in case we moved the
-     prologue/epilogue insns.  */
-  if (reload_completed)
-    reposition_prologue_and_epilogue_notes (get_insns ());
-
-  if (write_symbols != NO_DEBUG)
-    {
-      rtx line = 0;
-      rtx insn = get_insns ();
-      int active_insn = 0;
-      int notes = 0;
-
-      /* Walk the insns deleting redundant line-number notes.  Many of these
-	 are already present.  The remainder tend to occur at basic
-	 block boundaries.  */
-      for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
-	if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0)
-	  {
-	    /* If there are no active insns following, INSN is redundant.  */
-	    if (active_insn == 0)
-	      {
-		notes++;
-		NOTE_SOURCE_FILE (insn) = 0;
-		NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
-	      }
-	    /* If the line number is unchanged, LINE is redundant.  */
-	    else if (line
-		     && NOTE_LINE_NUMBER (line) == NOTE_LINE_NUMBER (insn)
-		     && NOTE_SOURCE_FILE (line) == NOTE_SOURCE_FILE (insn))
-	      {
-		notes++;
-		NOTE_SOURCE_FILE (line) = 0;
-		NOTE_LINE_NUMBER (line) = NOTE_INSN_DELETED;
-		line = insn;
-	      }
-	    else
-	      line = insn;
-	    active_insn = 0;
-	  }
-	else if (! ((GET_CODE (insn) == NOTE
-		     && NOTE_LINE_NUMBER (insn) == NOTE_INSN_DELETED)
-		    || (GET_CODE (insn) == INSN
-			&& (GET_CODE (PATTERN (insn)) == USE
-			    || GET_CODE (PATTERN (insn)) == CLOBBER))))
-	  active_insn++;
-
-      if (dump_file && notes)
-	fprintf (dump_file, ";; deleted %d line-number notes\n", notes);
-    }
-
-  if (reload_completed == 0)
-    {
-      int regno;
-      for (regno = 0; regno < max_regno; regno++)
-	if (sched_reg_live_length[regno])
-	  {
-	    if (dump_file)
-	      {
-		if (REG_LIVE_LENGTH (regno) > sched_reg_live_length[regno])
-		  fprintf (dump_file,
-			   ";; register %d life shortened from %d to %d\n",
-			   regno, REG_LIVE_LENGTH (regno),
-			   sched_reg_live_length[regno]);
-		/* Negative values are special; don't overwrite the current
-		   reg_live_length value if it is negative.  */
-		else if (REG_LIVE_LENGTH (regno) < sched_reg_live_length[regno]
-			 && REG_LIVE_LENGTH (regno) >= 0)
-		  fprintf (dump_file,
-			   ";; register %d life extended from %d to %d\n",
-			   regno, REG_LIVE_LENGTH (regno),
-			   sched_reg_live_length[regno]);
-
-		if (! REG_N_CALLS_CROSSED (regno)
-		    && sched_reg_n_calls_crossed[regno])
-		  fprintf (dump_file,
-			   ";; register %d now crosses calls\n", regno);
-		else if (REG_N_CALLS_CROSSED (regno)
-			 && ! sched_reg_n_calls_crossed[regno]
-			 && REG_BASIC_BLOCK (regno) != REG_BLOCK_GLOBAL)
-		  fprintf (dump_file,
-			   ";; register %d no longer crosses calls\n", regno);
-
-	      }
-	    /* Negative values are special; don't overwrite the current
-	       reg_live_length value if it is negative.  */
-	    if (REG_LIVE_LENGTH (regno) >= 0)
-	      REG_LIVE_LENGTH (regno) = sched_reg_live_length[regno];
-
-	    /* We can't change the value of reg_n_calls_crossed to zero for
-	       pseudos which are live in more than one block.
-
-	       This is because combine might have made an optimization which
-	       invalidated basic_block_live_at_start and reg_n_calls_crossed,
-	       but it does not update them.  If we update reg_n_calls_crossed
-	       here, the two variables are now inconsistent, and this might
-	       confuse the caller-save code into saving a register that doesn't
-	       need to be saved.  This is only a problem when we zero calls
-	       crossed for a pseudo live in multiple basic blocks.
-
-	       Alternatively, we could try to correctly update basic block live
-	       at start here in sched, but that seems complicated.  */
-	    if (sched_reg_n_calls_crossed[regno]
-		|| REG_BASIC_BLOCK (regno) != REG_BLOCK_GLOBAL)
-	      REG_N_CALLS_CROSSED (regno) = sched_reg_n_calls_crossed[regno];
-	  }
-    }
-
-  free (insn_luid);
-  free (insn_priority);
-  free (insn_tick);
-  free (insn_costs);
-  free (insn_units);
-  free (insn_blockage);
-  free (insn_ref_count);
-
-  if (write_symbols != NO_DEBUG)
-    free (line_note);
-
-  if (reload_completed == 0)
-    {
-      FREE_REG_SET (bb_dead_regs);
-      FREE_REG_SET (bb_live_regs);
-    }
-
-}
-#endif /* INSN_SCHEDULING */
diff --git a/gcc/toplev.c b/gcc/toplev.c
index 5a727c65b94e..4e1b1e1c0f5d 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -674,7 +674,6 @@ int flag_pedantic_errors = 0;
 int flag_schedule_insns = 0;
 int flag_schedule_insns_after_reload = 0;
 
-#ifdef HAIFA
 /* The following flags have effect only for scheduling before register
    allocation:
 
@@ -689,7 +688,6 @@ int flag_schedule_interblock = 1;
 int flag_schedule_speculative = 1;
 int flag_schedule_speculative_load = 0;
 int flag_schedule_speculative_load_dangerous = 0;
-#endif  /* HAIFA */
 
 /* flag_on_branch_count_reg means try to replace add-1,compare,branch tupple
    by a cheaper branch, on a count register. */
@@ -905,7 +903,6 @@ lang_independent_options f_options[] =
    "Reschedule instructions to avoid pipeline stalls"},
   {"schedule-insns2", &flag_schedule_insns_after_reload, 1,
   "Run two passes of the instruction scheduler"},
-#ifdef HAIFA
   {"sched-interblock",&flag_schedule_interblock, 1,
    "Enable scheduling across basic blocks" },
   {"sched-spec",&flag_schedule_speculative, 1,
@@ -914,7 +911,6 @@ lang_independent_options f_options[] =
    "Allow speculative motion of some loads" },
   {"sched-spec-load-dangerous",&flag_schedule_speculative_load_dangerous, 1,
    "Allow speculative motion of more loads" },
-#endif  /* HAIFA */
   {"branch-count-reg",&flag_branch_on_count_reg, 1,
    "Replace add,compare,branch with branch on count reg"},
   {"pic", &flag_pic, 1,
@@ -4570,7 +4566,7 @@ display_help ()
   printf ("  -version                Display the compiler's version\n");
   printf ("  -d[letters]             Enable dumps from specific passes of the compiler\n");
   printf ("  -dumpbase <file>        Base name to be used for dumps from specific passes\n");
-#if defined HAIFA || defined INSN_SCHEDULING
+#if defined INSN_SCHEDULING
   printf ("  -sched-verbose-<number> Set the verbosity level of the scheduler\n");
 #endif
   printf ("  --help                  Display this information\n");
@@ -5097,12 +5093,10 @@ main (argc, argv)
 	      else if (!strncmp (p, "inline-limit-", 13))
 	        inline_max_insns =
 		  read_integral_parameter (p + 13, p - 2, inline_max_insns);
-#ifdef HAIFA
 #ifdef INSN_SCHEDULING
 	      else if (!strncmp (p, "sched-verbose-",14))
 		fix_sched_param("verbose",&p[14]);
 #endif
-#endif  /* HAIFA */
 	      else if (!strncmp (p, "fixed-", 6))
 		fix_register (&p[6], 1, 1);
 	      else if (!strncmp (p, "call-used-", 10))
-- 
GitLab