[PATCH] Pack better some GCC internal data structures on 64-bit hosts

Jakub Jelinek jakub@redhat.com
Tue Mar 17 16:03:00 GMT 2009


Hi!

The following patch reorders 13 GCC internal structs a little bit to
decrease their size on 64-bit hosts.
The differences reported by pahole (dwarves package) before/after the patch
on x86_64-linux (and in most cases likely most other 64-bit hosts) are:
struct group_info
-	/* size: 104, cachelines: 2 */
-	/* sum members: 94, holes: 2, sum holes: 10 */
+	/* size: 96, cachelines: 2 */
+	/* sum members: 94, holes: 1, sum holes: 2 */
struct matrix_info
-	/* size: 120, cachelines: 2 */
-	/* sum members: 105, holes: 3, sum holes: 15 */
+	/* size: 112, cachelines: 2 */
+	/* sum members: 105, holes: 2, sum holes: 7 */
struct ivopts_data
-	/* size: 88, cachelines: 2 */
-	/* sum members: 70, holes: 3, sum holes: 11 */
-	/* padding: 7 */
+	/* size: 72, cachelines: 2 */
+	/* padding: 2 */
struct data_dependence_relation
-	/* size: 80, cachelines: 2 */
-	/* sum members: 63, holes: 2, sum holes: 10 */
-	/* padding: 7 */
+	/* size: 64, cachelines: 1 */
+	/* padding: 1 */
struct equivalence
-	/* size: 48, cachelines: 1 */
-	/* sum members: 33, holes: 2, sum holes: 11 */
-	/* padding: 4 */
+	/* size: 40, cachelines: 1 */
+	/* padding: 7 */
struct ira_allocno
-	/* size: 264, cachelines: 5 */
-	/* sum members: 244, holes: 4, sum holes: 16 */
+	/* size: 248, cachelines: 4 */
 	/* bit holes: 1, sum bit holes: 20 bits */
 	/* padding: 4 */
struct temp_slot
-	/* size: 80, cachelines: 2 */
-	/* sum members: 70, holes: 3, sum holes: 10 */
+	/* size: 72, cachelines: 2 */
+	/* sum members: 70, holes: 1, sum holes: 2 */
struct df_collection_rec
-	/* size: 64, cachelines: 1 */
-	/* sum members: 48, holes: 3, sum holes: 12 */
-	/* padding: 4 */
+	/* size: 48, cachelines: 1 */
struct loop
-	/* size: 152, cachelines: 3 */
-	/* sum members: 134, holes: 4, sum holes: 18 */
+	/* size: 136, cachelines: 3 */
+	/* sum members: 134, holes: 1, sum holes: 2 */
struct df
-	/* size: 368, cachelines: 6 */
-	/* sum members: 354, holes: 3, sum holes: 14 */
+	/* size: 352, cachelines: 6 */
+	/* padding: 1 */
struct cpp_buffer
-	/* size: 208, cachelines: 4 */
-	/* sum members: 199, holes: 2, sum holes: 9 */
+	/* size: 192, cachelines: 3 */
+	/* sum members: 183, holes: 2, sum holes: 9 */
 	/* bit holes: 1, sum bit holes: 13 bits */
-	/* paddings: 2, sum paddings: 11 */
+	/* paddings: 1, sum paddings: 4 */
struct cpp_reader
-	/* size: 1288, cachelines: 21 */
-	/* sum members: 1245, holes: 9, sum holes: 43 */
-	/* paddings: 12, sum paddings: 50 */
+	/* size: 1272, cachelines: 20 */
+	/* sum members: 1229, holes: 9, sum holes: 43 */
+	/* paddings: 11, sum paddings: 43 */
struct cpp_dir
-	/* size: 80, cachelines: 2 */
-	/* sum members: 62, holes: 2, sum holes: 11 */
-	/* padding: 7 */
+	/* size: 64, cachelines: 1 */
+	/* sum members: 62, holes: 1, sum holes: 2 */
struct cp_token
-	/* size: 24, cachelines: 1 */
-	/* sum members: 20, holes: 1, sum holes: 4 */
+	/* size: 16, cachelines: 1 */
 	/* bit holes: 1, sum bit holes: 16 bits */
-	/* padding: 4 */
struct mem_attrs
-	/* size: 40, cachelines: 1 */
-	/* sum members: 32, holes: 1, sum holes: 4 */
-	/* padding: 4 */
+	/* size: 32, cachelines: 1 */

Bootstrap/regtest pending on x86_64-linux, ok for trunk if it succeeds
(or just selected individual changes)?

2009-03-17  Jakub Jelinek  <jakub@redhat.com>

	* dse.c (struct group_info): Reorder fields for 64-bit hosts.
	* matrix-reorg.c (struct matrix_info): Likewise.
	* tree-ssa-loop-ivopts.c (struct ivopts_data): Likewise.
	* rtl.h (struct mem_attrs): Likewise.
	* df.h (struct df): Likewise.
	* tree-data-ref.h (struct data_dependence_relation): Likewise.
	* ira-int.h (struct ira_allocno): Likewise.
	* df-scan.c (struct df_collection_rec): Likewise.
	* ira.c (struct equivalence): Likewise.
	* function.c (struct temp_slot): Likewise.
	* cfgloop.h (struct loop): Likewise.

	* parser.c (struct cp_token): Reorder fields for 64-bit hosts.
	(eof_token): Adjust.

	* include/cpplib.h (struct cpp_dir): Reorder fields for 64-bit hosts.

--- gcc/dse.c.jj	2009-01-02 09:32:56.000000000 +0100
+++ gcc/dse.c	2009-03-17 16:35:13.000000000 +0100
@@ -1,5 +1,5 @@
 /* RTL dead store elimination.
-   Copyright (C) 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+   Copyright (C) 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
 
    Contributed by Richard Sandiford <rsandifor@codesourcery.com>
    and Kenneth Zadeck <zadeck@naturalbridge.com>
@@ -464,6 +464,14 @@ struct group_info 
      canonical ordering of these that is not based on addresses.  */
   int id;
 
+  /* True if there are any positions that are to be processed
+     globally.  */
+  bool process_globally;
+
+  /* True if the base of this group is either the frame_pointer or
+     hard_frame_pointer.  */
+  bool frame_related;
+
   /* A mem wrapped around the base pointer for the group in order to
      do read dependency.  */
   rtx base_mem;
@@ -494,14 +502,6 @@ struct group_info 
      the positions that are occupied by stores for this group.  */
   bitmap group_kill;
 
-  /* True if there are any positions that are to be processed
-     globally.  */
-  bool process_globally;
-
-  /* True if the base of this group is either the frame_pointer or
-     hard_frame_pointer.  */
-  bool frame_related;
-
   /* The offset_map is used to map the offsets from this base into
      positions in the global bitmaps.  It is only created after all of
      the all of stores have been scanned and we know which ones we
--- gcc/matrix-reorg.c.jj	2009-03-04 20:06:31.000000000 +0100
+++ gcc/matrix-reorg.c	2009-03-17 16:18:10.000000000 +0100
@@ -1,5 +1,5 @@
 /* Matrix layout transformations.
-   Copyright (C) 2006, 2007, 2008 Free Software Foundation, Inc.
+   Copyright (C) 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
    Contributed by Razya Ladelsky <razya@il.ibm.com>
    Originally written by Revital Eres and Mustafa Hagog.
    
@@ -261,9 +261,6 @@ struct matrix_info
 
   gimple min_indirect_level_escape_stmt;
 
-  /* Is the matrix transposed.  */
-  bool is_transposed_p;
-
   /* Hold the allocation site for each level (dimension).
      We can use NUM_DIMS as the upper bound and allocate the array
      once with this number of elements and no need to use realloc and
@@ -272,6 +269,9 @@ struct matrix_info
 
   int max_malloced_level;
 
+  /* Is the matrix transposed.  */
+  bool is_transposed_p;
+
   /* The location of the allocation sites (they must be in one
      function).  */
   tree allocation_function_decl;
@@ -303,7 +303,7 @@ struct matrix_info
 
   /* An array of the accesses to be flattened.
      elements are of type "struct access_site_info *".  */
-    VEC (access_site_info_p, heap) * access_l;
+  VEC (access_site_info_p, heap) * access_l;
 
   /* A map of how the dimensions will be organized at the end of 
      the analyses.  */
--- gcc/cp/parser.c.jj	2009-03-09 11:38:54.000000000 +0100
+++ gcc/cp/parser.c	2009-03-17 16:05:13.000000000 +0100
@@ -77,6 +77,8 @@ typedef struct cp_token GTY (())
      KEYWORD is RID_MAX) iff this name was looked up and found to be
      ambiguous.  An error has already been reported.  */
   BOOL_BITFIELD ambiguous_p : 1;
+  /* The location at which this token was found.  */
+  location_t location;
   /* The value associated with this token, if any.  */
   union cp_token_value {
     /* Used for CPP_NESTED_NAME_SPECIFIER and CPP_TEMPLATE_ID.  */
@@ -84,8 +86,6 @@ typedef struct cp_token GTY (())
     /* Use for all other tokens.  */
     tree GTY((tag ("0"))) value;
   } GTY((desc ("(%1.type == CPP_TEMPLATE_ID) || (%1.type == CPP_NESTED_NAME_SPECIFIER)"))) u;
-  /* The location at which this token was found.  */
-  location_t location;
 } cp_token;
 
 /* We use a stack of token pointer for saving token sets.  */
@@ -95,8 +95,7 @@ DEF_VEC_ALLOC_P (cp_token_position,heap)
 
 static cp_token eof_token =
 {
-  CPP_EOF, RID_MAX, 0, PRAGMA_NONE, false, 0, { NULL },
-  0
+  CPP_EOF, RID_MAX, 0, PRAGMA_NONE, false, 0, 0, { NULL }
 };
 
 /* The cp_lexer structure represents the C++ lexer.  It is responsible
--- gcc/tree-ssa-loop-ivopts.c.jj	2009-03-04 20:06:31.000000000 +0100
+++ gcc/tree-ssa-loop-ivopts.c	2009-03-17 16:21:38.000000000 +0100
@@ -1,6 +1,6 @@
 /* Induction variable optimizations.
-   Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Free Software
-   Foundation, Inc.
+   Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009
+   Free Software Foundation, Inc.
    
 This file is part of GCC.
    
@@ -219,15 +219,12 @@ struct ivopts_data
   /* The currently optimized loop.  */
   struct loop *current_loop;
 
-  /* Are we optimizing for speed?  */
-  bool speed;
+  /* Numbers of iterations for all exits of the current loop.  */
+  struct pointer_map_t *niters;
 
   /* Number of registers used in it.  */
   unsigned regs_used;
 
-  /* Numbers of iterations for all exits of the current loop.  */
-  struct pointer_map_t *niters;
-
   /* The size of version_info array allocated.  */
   unsigned version_info_size;
 
@@ -237,9 +234,6 @@ struct ivopts_data
   /* The bitmap of indices in version_info whose value was changed.  */
   bitmap relevant;
 
-  /* The maximum invariant id.  */
-  unsigned max_inv_id;
-
   /* The uses of induction variables.  */
   VEC(iv_use_p,heap) *iv_uses;
 
@@ -249,9 +243,15 @@ struct ivopts_data
   /* A bitmap of important candidates.  */
   bitmap important_candidates;
 
+  /* The maximum invariant id.  */
+  unsigned max_inv_id;
+
   /* Whether to consider just related and important candidates when replacing a
      use.  */
   bool consider_all_candidates;
+
+  /* Are we optimizing for speed?  */
+  bool speed;
 };
 
 /* An assignment of iv candidates to uses.  */
--- gcc/rtl.h.jj	2009-02-20 15:55:21.000000000 +0100
+++ gcc/rtl.h	2009-03-17 16:05:13.000000000 +0100
@@ -141,10 +141,10 @@ typedef struct
    stricter alignment; OFFSET is the offset of the MEM within that object.  */
 typedef struct mem_attrs GTY(())
 {
-  alias_set_type alias;		/* Memory alias set.  */
   tree expr;			/* expr corresponding to MEM.  */
   rtx offset;			/* Offset from start of DECL, as CONST_INT.  */
   rtx size;			/* Size in bytes, as a CONST_INT.  */
+  alias_set_type alias;		/* Memory alias set.  */
   unsigned int align;		/* Alignment of MEM in bits.  */
 } mem_attrs;
 
--- gcc/df.h.jj	2008-12-19 10:19:36.000000000 +0100
+++ gcc/df.h	2009-03-17 16:05:13.000000000 +0100
@@ -1,6 +1,6 @@
 /* Form lists of pseudo register references for autoinc optimization
    for GNU compiler.  This is part of flow optimization.
-   Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008
+   Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008, 2009
    Free Software Foundation, Inc.
    Originally contributed by Michael P. Hayes 
              (m.hayes@elec.canterbury.ac.nz, mhayes@redhat.com)
@@ -535,7 +535,6 @@ struct df
 
   struct dataflow *problems_in_order[DF_LAST_PROBLEM_PLUS1]; 
   struct dataflow *problems_by_index[DF_LAST_PROBLEM_PLUS1]; 
-  int num_problems_defined;
 
   /* If not NULL, this subset of blocks of the program to be
      considered for analysis.  At certain times, this will contain all
@@ -543,14 +542,6 @@ struct df
      of if we are analyzing a subset.  See analyze_subset.  */ 
   bitmap blocks_to_analyze;
 
-  /* If this is true, then only a subset of the blocks of the program
-     is considered to compute the solutions of dataflow problems.  */
-  bool analyze_subset;
-
-  /* True if someone added or deleted something from regs_ever_live so
-     that the entry and exit blocks need be reprocessed.  */
-  bool redo_entry_and_exit;
-
   /* The following information is really the problem data for the
      scanning instance but it is used too often by the other problems
      to keep getting it from there.  */
@@ -568,6 +559,9 @@ struct df
 
   struct df_insn_info **insns;   /* Insn table, indexed by insn UID.  */
   unsigned int insns_size;       /* Size of insn table.  */
+
+  int num_problems_defined;
+
   bitmap hardware_regs_used;     /* The set of hardware registers used.  */
   /* The set of hard regs that are in the artificial uses at the end
      of a regular basic block.  */
@@ -609,7 +603,15 @@ struct df
   unsigned int ref_order;
 
   /* Problem specific control information.  */
-  enum df_changeable_flags changeable_flags;
+  ENUM_BITFIELD (df_changeable_flags) changeable_flags : 8;
+
+  /* If this is true, then only a subset of the blocks of the program
+     is considered to compute the solutions of dataflow problems.  */
+  bool analyze_subset;
+
+  /* True if someone added or deleted something from regs_ever_live so
+     that the entry and exit blocks need be reprocessed.  */
+  bool redo_entry_and_exit;
 };
 
 #define DF_SCAN_BB_INFO(BB) (df_scan_get_bb_info((BB)->index))
--- gcc/tree-data-ref.h.jj	2009-01-13 18:32:17.000000000 +0100
+++ gcc/tree-data-ref.h	2009-03-17 16:25:50.000000000 +0100
@@ -291,14 +291,6 @@ struct data_dependence_relation
   struct data_reference *a;
   struct data_reference *b;
 
-  /* When the dependence relation is affine, it can be represented by
-     a distance vector.  */
-  bool affine_p;
-
-  /* Set to true when the dependence relation is on the same data
-     access.  */
-  bool self_reference_p;
-
   /* A "yes/no/maybe" field for the dependence relation:
      
      - when "ARE_DEPENDENT == NULL_TREE", there exist a dependence
@@ -320,18 +312,26 @@ struct data_dependence_relation
   /* The analyzed loop nest.  */
   VEC (loop_p, heap) *loop_nest;
 
-  /* An index in loop_nest for the innermost loop that varies for
-     this data dependence relation.  */
-  unsigned inner_loop;
-
   /* The classic direction vector.  */
   VEC (lambda_vector, heap) *dir_vects;
 
   /* The classic distance vector.  */
   VEC (lambda_vector, heap) *dist_vects;
 
+  /* An index in loop_nest for the innermost loop that varies for
+     this data dependence relation.  */
+  unsigned inner_loop;
+
   /* Is the dependence reversed with respect to the lexicographic order?  */
   bool reversed_p;
+
+  /* When the dependence relation is affine, it can be represented by
+     a distance vector.  */
+  bool affine_p;
+
+  /* Set to true when the dependence relation is on the same data
+     access.  */
+  bool self_reference_p;
 };
 
 typedef struct data_dependence_relation *ddr_p;
--- gcc/ira-int.h.jj	2009-03-16 21:30:41.000000000 +0100
+++ gcc/ira-int.h	2009-03-17 16:05:13.000000000 +0100
@@ -240,8 +240,6 @@ struct ira_allocno
   /* Mode of the allocno which is the mode of the corresponding
      pseudo-register.  */
   enum machine_mode mode;
-  /* Final rtx representation of the allocno.  */
-  rtx reg;
   /* Hard register assigned to given allocno.  Negative value means
      that memory was allocated to the allocno.  During the reload,
      spilled allocno has value equal to the corresponding stack slot
@@ -249,6 +247,8 @@ struct ira_allocno
      reload (at this point pseudo-register has only one allocno) which
      did not get stack slot yet.  */
   int hard_regno;
+  /* Final rtx representation of the allocno.  */
+  rtx reg;
   /* Allocnos with the same regno are linked by the following member.
      Allocnos corresponding to inner loops are first in the list (it
      corresponds to depth-first traverse of the loops).  */
@@ -312,33 +312,29 @@ struct ira_allocno
      correspondingly minimal and maximal conflict ids of allocnos with
      which given allocno can conflict.  */
   int min, max;
-  /* The unique member value represents given allocno in conflict bit
-     vectors.  */
-  int conflict_id;
   /* Vector of accumulated conflicting allocnos with NULL end marker
      (if CONFLICT_VEC_P is true) or conflict bit vector otherwise.
      Only allocnos with the same cover class are in the vector or in
      the bit vector.  */
   void *conflict_allocno_array;
+  /* The unique member value represents given allocno in conflict bit
+     vectors.  */
+  int conflict_id;
   /* Allocated size of the previous array.  */
   unsigned int conflict_allocno_array_size;
-  /* Number of accumulated conflicts in the vector of conflicting
-     allocnos.  */
-  int conflict_allocnos_num;
   /* Initial and accumulated hard registers conflicting with this
      allocno and as a consequences can not be assigned to the allocno.
      All non-allocatable hard regs and hard regs of cover classes
      different from given allocno one are included in the sets.  */
   HARD_REG_SET conflict_hard_regs, total_conflict_hard_regs;
+  /* Number of accumulated conflicts in the vector of conflicting
+     allocnos.  */
+  int conflict_allocnos_num;
   /* Accumulated frequency of calls which given allocno
      intersects.  */
   int call_freq;
   /* Accumulated number of the intersected calls.  */
   int calls_crossed_num;
-  /* Non NULL if we remove restoring value from given allocno to
-     MEM_OPTIMIZED_DEST at loop exit (see ira-emit.c) because the
-     allocno value is not changed inside the loop.  */
-  ira_allocno_t mem_optimized_dest;
   /* TRUE if the allocno assigned to memory was a destination of
      removed move (see ira-emit.c) at loop exit because the value of
      the corresponding pseudo-register is not changed inside the
@@ -383,6 +379,10 @@ struct ira_allocno
      vector where a bit with given index represents allocno with the
      same number.  */
   unsigned int conflict_vec_p : 1;
+  /* Non NULL if we remove restoring value from given allocno to
+     MEM_OPTIMIZED_DEST at loop exit (see ira-emit.c) because the
+     allocno value is not changed inside the loop.  */
+  ira_allocno_t mem_optimized_dest;
   /* Array of usage costs (accumulated and the one updated during
      coloring) for each hard register of the allocno cover class.  The
      member value can be NULL if all costs are the same and equal to
--- gcc/df-scan.c.jj	2009-01-13 21:48:29.000000000 +0100
+++ gcc/df-scan.c	2009-03-17 16:05:13.000000000 +0100
@@ -1,6 +1,6 @@
 /* Scanning of rtl for dataflow analysis.
    Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
-   2008  Free Software Foundation, Inc.
+   2008, 2009  Free Software Foundation, Inc.
    Originally contributed by Michael P. Hayes 
              (m.hayes@elec.canterbury.ac.nz, mhayes@redhat.com)
    Major rewrite contributed by Danny Berlin (dberlin@dberlin.org)
@@ -85,12 +85,12 @@ static HARD_REG_SET elim_reg_set;
 struct df_collection_rec
 {
   df_ref * def_vec;
-  unsigned int next_def;
   df_ref * use_vec;
+  unsigned int next_def;
   unsigned int next_use;
   df_ref * eq_use_vec;
-  unsigned int next_eq_use;
   struct df_mw_hardreg **mw_vec;
+  unsigned int next_eq_use;
   unsigned int next_mw;
 };
 
--- gcc/ira.c.jj	2009-02-20 15:54:45.000000000 +0100
+++ gcc/ira.c	2009-03-17 16:05:13.000000000 +0100
@@ -1864,21 +1864,21 @@ mark_elimination (int from, int to)
 
 struct equivalence
 {
-  /* Set when an attempt should be made to replace a register
-     with the associated src_p entry.  */
-  char replace;
   /* Set when a REG_EQUIV note is found or created.  Use to
      keep track of what memory accesses might be created later,
      e.g. by reload.  */
   rtx replacement;
   rtx *src_p;
+  /* The list of each instruction which initializes this register.  */
+  rtx init_insns;
   /* Loop depth is used to recognize equivalences which appear
      to be present within the same loop (or in an inner loop).  */
   int loop_depth;
-  /* The list of each instruction which initializes this register.  */
-  rtx init_insns;
   /* Nonzero if this had a preexisting REG_EQUIV note.  */
   int is_arg_equivalence;
+  /* Set when an attempt should be made to replace a register
+     with the associated src_p entry.  */
+  char replace;
 };
 
 /* reg_equiv[N] (where N is a pseudo reg number) is the equivalence
--- gcc/function.c.jj	2009-03-09 11:38:55.000000000 +0100
+++ gcc/function.c	2009-03-17 16:32:43.000000000 +0100
@@ -458,8 +458,6 @@ struct temp_slot GTY(())
   struct temp_slot *prev;
   /* The rtx to used to reference the slot.  */
   rtx slot;
-  /* The alignment (in bits) of the slot.  */
-  unsigned int align;
   /* The size, in units, of the slot.  */
   HOST_WIDE_INT size;
   /* The type of the object in the slot, or zero if it doesn't correspond
@@ -467,6 +465,8 @@ struct temp_slot GTY(())
      It can be reused if objects of the type of the new slot will always
      conflict with objects of the type of the old slot.  */
   tree type;
+  /* The alignment (in bits) of the slot.  */
+  unsigned int align;
   /* Nonzero if this temporary is currently in use.  */
   char in_use;
   /* Nonzero if this temporary has its address taken.  */
--- gcc/cfgloop.h.jj	2009-02-20 15:06:59.000000000 +0100
+++ gcc/cfgloop.h	2009-03-17 16:05:13.000000000 +0100
@@ -1,6 +1,6 @@
 /* Natural loop functions
    Copyright (C) 1987, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-   2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+   2005, 2006, 2007, 2008, 2009  Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -105,6 +105,9 @@ struct loop GTY ((chain_next ("%h.next")
   /* Index into loops array.  */
   int num;
 
+  /* Number of loop insns.  */
+  unsigned ninsns;
+
   /* Basic block of loop header.  */
   struct basic_block_def *header;
 
@@ -114,9 +117,6 @@ struct loop GTY ((chain_next ("%h.next")
   /* For loop unrolling/peeling decision.  */
   struct lpt_decision lpt_decision;
 
-  /* Number of loop insns.  */
-  unsigned ninsns;
-
   /* Average number of executed insns per iteration.  */
   unsigned av_ninsns;
 
@@ -142,19 +142,20 @@ struct loop GTY ((chain_next ("%h.next")
      information in this field.  */
   tree nb_iterations;
 
-  /* An integer estimation of the number of iterations.  Estimate_state
-     describes what is the state of the estimation.  */
-  enum loop_estimation estimate_state;
-
   /* An integer guaranteed to bound the number of iterations of the loop
      from above.  */
-  bool any_upper_bound;
   double_int nb_iterations_upper_bound;
 
   /* An integer giving the expected number of iterations of the loop.  */
-  bool any_estimate;
   double_int nb_iterations_estimate;
 
+  bool any_upper_bound;
+  bool any_estimate;
+
+  /* An integer estimation of the number of iterations.  Estimate_state
+     describes what is the state of the estimation.  */
+  enum loop_estimation estimate_state;
+
   /* Upper bound on number of iterations of a loop.  */
   struct nb_iter_bound *bounds;
 
--- libcpp/include/cpplib.h.jj	2008-11-13 15:08:47.000000000 +0100
+++ libcpp/include/cpplib.h	2009-03-17 16:02:21.000000000 +0100
@@ -1,6 +1,6 @@
 /* Definitions for CPP library.
    Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
-   2004, 2005, 2007, 2008
+   2004, 2005, 2007, 2008, 2009
    Free Software Foundation, Inc.
    Written by Per Bothner, 1994-95.
 
@@ -516,14 +516,17 @@ struct cpp_dir
   char *name;
   unsigned int len;
 
-  /* The canonicalized NAME as determined by lrealpath.  This field 
-     is only used by hosts that lack reliable inode numbers.  */
-  char *canonical_name;
-
   /* One if a system header, two if a system header that has extern
      "C" guards for C++.  */
   unsigned char sysp;
 
+  /* Is this a user-supplied directory? */
+  bool user_supplied_p;
+
+  /* The canonicalized NAME as determined by lrealpath.  This field 
+     is only used by hosts that lack reliable inode numbers.  */
+  char *canonical_name;
+
   /* Mapping of file names for this directory for MS-DOS and related
      platforms.  A NULL-terminated array of (from, to) pairs.  */
   const char **name_map;
@@ -538,9 +541,6 @@ struct cpp_dir
      directories in the search path.  */
   ino_t ino;
   dev_t dev;
-
-  /* Is this a user-supplied directory? */
-  bool user_supplied_p;
 };
 
 /* Name under which this program was invoked.  */

	Jakub



More information about the Gcc-patches mailing list