OSDN Git Service

This is the documentation for -### that I forgot to add when -### was
[pf3gnuchains/gcc-fork.git] / gcc / sched-int.h
index 2a7eb6a..f5a8808 100644 (file)
@@ -3,21 +3,21 @@
    Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998,
    1999, 2000, 2001 Free Software Foundation, Inc.
 
-This file is part of GNU CC.
+This file is part of GCC.
 
-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.
+GCC 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
+GCC 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
-the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+along with GCC; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 02111-1307, USA.  */
 
 /* Forward declaration.  */
@@ -53,6 +53,10 @@ struct deps
      a function of the length of these pending lists.  */
   int pending_lists_length;
 
+  /* Length of the pending memory flush list. Large functions with no
+     calls may build up extremely large lists.  */
+  int pending_flush_length;
+
   /* 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
@@ -64,19 +68,20 @@ struct deps
      too large.  */
   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.  */
+  /* A list of the last function calls we have seen.  We use a list to
+     represent last function calls from multiple predecessor blocks.
+     Used to prevent register lifetimes from expanding unnecessarily.  */
   rtx last_function_call;
 
+  /* 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.  */
+  rtx sched_before_next_call;
+
   /* Used to keep post-call psuedo/hard reg movements together with
      the call.  */
-  int in_post_call_group_p;
-
-  /* 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.  */
-  rtx sched_before_next_call;
+  bool in_post_call_group_p;
 
   /* The maximum register number for the following arrays.  Before reload
      this is max_reg_num; after reload it is FIRST_PSEUDO_REGISTER.  */
@@ -91,6 +96,8 @@ struct deps
       rtx uses;
       rtx sets;
       rtx clobbers;
+      int uses_length;
+      int clobbers_length;
     } *reg_last;
 
   /* Element N is set for each register that has any non-zero element
@@ -142,7 +149,12 @@ struct sched_info
   rtx head, tail;
 
   /* If nonzero, enables an additional sanity check in schedule_block.  */
-  int queue_must_finish_empty;
+  unsigned int queue_must_finish_empty:1;
+  /* Nonzero if we should use cselib for better alias analysis.  This
+     must be 0 if the dependency information is used after sched_analyze
+     has completed, e.g. if we're using it to initialize state for successor
+     blocks in region scheduling.  */
+  unsigned int use_cselib:1;
 };
 
 extern struct sched_info *current_sched_info;
@@ -153,7 +165,7 @@ extern struct sched_info *current_sched_info;
 struct haifa_insn_data
 {
   /* A list of insns which depend on the instruction.  Unlike LOG_LINKS,
-     it represents forward dependancies.  */
+     it represents forward dependencies.  */
   rtx depend;
 
   /* The line number note in effect for each insn.  For line number
@@ -194,10 +206,13 @@ struct haifa_insn_data
   /* Some insns (e.g. call) are not allowed to move across blocks.  */
   unsigned int cant_move : 1;
 
-  /* Set if there's DEF-USE dependance between some speculatively
+  /* Set if there's DEF-USE dependence between some speculatively
      moved load insn and this one.  */
   unsigned int fed_by_spec_load : 1;
   unsigned int is_load_insn : 1;
+
+  /* Nonzero if priority has been computed already.  */
+  unsigned int priority_known : 1;
 };
 
 extern struct haifa_insn_data *h_i_d;
@@ -209,6 +224,7 @@ extern struct haifa_insn_data *h_i_d;
 #define CANT_MOVE(insn)                (h_i_d[INSN_UID (insn)].cant_move)
 #define INSN_DEP_COUNT(INSN)   (h_i_d[INSN_UID (INSN)].dep_count)
 #define INSN_PRIORITY(INSN)    (h_i_d[INSN_UID (INSN)].priority)
+#define INSN_PRIORITY_KNOWN(INSN) (h_i_d[INSN_UID (INSN)].priority_known)
 #define INSN_COST(INSN)                (h_i_d[INSN_UID (INSN)].cost)
 #define INSN_UNIT(INSN)                (h_i_d[INSN_UID (INSN)].units)
 #define INSN_REG_WEIGHT(INSN)  (h_i_d[INSN_UID (INSN)].reg_weight)
@@ -261,7 +277,6 @@ extern void free_deps PARAMS ((struct deps *));
 extern void init_deps_global PARAMS ((void));
 extern void finish_deps_global PARAMS ((void));
 extern void compute_forward_dependences PARAMS ((rtx, rtx));
-extern int find_insn_mem_list PARAMS ((rtx, rtx, rtx, rtx));
 extern rtx find_insn_list PARAMS ((rtx, rtx));
 extern void init_dependency_caches PARAMS ((int));
 extern void free_dependency_caches PARAMS ((void));
@@ -279,6 +294,7 @@ extern void rm_other_notes PARAMS ((rtx, rtx));
 extern int insn_issue_delay PARAMS ((rtx));
 extern int set_priorities PARAMS ((rtx, rtx));
 
+extern rtx sched_emit_insn PARAMS ((rtx));
 extern void schedule_block PARAMS ((int, int));
 extern void sched_init PARAMS ((FILE *));
 extern void sched_finish PARAMS ((void));