/* Struct-reorg optimization.
   Copyright (C) 2002, 2003-2007, 2008, 2009 Free Software Foundation, Inc.
   Contributed by Olga Golovanevsky <olga@il.ibm.com>

This file is part of GCC.

GCC is free software; you can redistribute it and/or modify
under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.

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 GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */

#ifndef IPA_STRUCT_REORG_H
#define IPA_STRUCT_REORG_H

/* This file contains data structures and interfaces required
   for struct-reorg optimizations.  */

/* An access site of the structure field.
   We consider an access to be of the following form:

   D.2166_21 = i.6_20 * 8;
   D.2167_22 = (struct str_t *) D.2166_21;
   D.2168_24 = D.2167_22 + p.5_23;
   D.2169_25 = D.2168_24->b;
*/

struct field_access_site
{
  /* Statement in which the access site occurs.  */
  gimple stmt;           /* D.2169_25 = D.2168_24->b;  */
  tree comp_ref;         /* D.2168_24->b  */
  tree field_decl;       /* b */
  tree ref;              /* D.2168_24  */
  tree num;              /* i.6_20  */
  tree offset;           /* D2167_22  */
  tree base;             /* p.5_23  */
  gimple ref_def_stmt;   /* D.2168_24 = D.2167_22 + p.5_23;  */
  gimple cast_stmt;      /* D.2167_22 = (struct str_t *) D.2166_21;
                            This statement is not always present.  */
};

/* A non-field structure access site.  */
struct access_site
{
  /* A statement in which the access site occurs.  */
  gimple stmt;
  /* A list of structure variables in the access site.  */
  VEC (tree, heap) *vars;
};

/* A field of the structure.  */
struct field_entry
{
  /* A field index.  */
  int index;
  /* Number of times the field is accessed (according to profiling).  */
  gcov_type count;
  tree decl;
  /* A type of a new structure this field belongs to.  */
  tree field_mapping;
  htab_t acc_sites;
};

/* This structure represents a result of the structure peeling.
   The original structure is decomposed into substructures, or clusters.  */
struct field_cluster
{
  /* A bitmap of field indices. The set bit indicates that the field
     corresponding to it is a part of this cluster.  */
  sbitmap fields_in_cluster;
  struct field_cluster *sibling;
};

/* An information about an individual structure type (RECORD_TYPE) required
   by struct-reorg optimizations to perform a transformation.  */
struct data_structure
{

  /* A main variant of the structure type.  */
  tree decl;

  /* Number of fields in the structure.  */
  int num_fields;

  /* A structure access count collected through profiling.  */
  gcov_type count;

  /* An array of the structure fields, indexed by field ID.  */
  struct field_entry *fields;

  /* Non-field accesses of the structure.  */
  htab_t accs;

  /* A data structure representing a reorganization decision.  */
  struct field_cluster *struct_clustering;

  /* New types to replace the original structure type.  */
  VEC(tree, heap) *new_types;
};

typedef struct data_structure * d_str;

#endif /* IPA_STRUCT_REORG_H */
