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)
+the Free Software Foundation; either version 3, or (at your option)
any later version.
GCC is distributed in the hope that it will be useful,
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 COPYING. If not, write to
-the Free Software Foundation, 51 Franklin Street, Fifth Floor,
-Boston, MA 02110-1301, USA. */
+along with GCC; see the file COPYING3. If not see
+<http://www.gnu.org/licenses/>. */
#ifndef _TREE_FLOW_H
#define _TREE_FLOW_H 1
#endif
struct static_var_ann_d;
+/* The reasons a variable may escape a function. */
+enum escape_type
+{
+ NO_ESCAPE = 0, /* Doesn't escape. */
+ ESCAPE_STORED_IN_GLOBAL = 1 << 0,
+ ESCAPE_TO_ASM = 1 << 1, /* Passed by address to an assembly
+ statement. */
+ ESCAPE_TO_CALL = 1 << 2, /* Escapes to a function call. */
+ ESCAPE_BAD_CAST = 1 << 3, /* Cast from pointer to integer */
+ ESCAPE_TO_RETURN = 1 << 4, /* Returned from function. */
+ ESCAPE_TO_PURE_CONST = 1 << 5, /* Escapes to a pure or constant
+ function call. */
+ ESCAPE_IS_GLOBAL = 1 << 6, /* Is a global variable. */
+ ESCAPE_IS_PARM = 1 << 7, /* Is an incoming function argument. */
+ ESCAPE_UNKNOWN = 1 << 8 /* We believe it escapes for
+ some reason not enumerated
+ above. */
+};
+
/* Memory reference statistics for individual memory symbols,
collected during alias analysis. */
struct mem_sym_stats_d GTY(())
struct gimple_df GTY(())
{
/* Array of all variables referenced in the function. */
- htab_t GTY((param_is (struct int_tree_map))) referenced_vars;
+ htab_t GTY((param_is (union tree_node))) referenced_vars;
/* A list of all the noreturn calls passed to modify_stmt.
cleanup_control_flow uses it to detect cases where a mid-block
means that the first reference to this variable in the function is a
USE or a VUSE. In those cases, the SSA renamer creates an SSA name
for this variable with an empty defining statement. */
- htab_t GTY((param_is (struct int_tree_map))) default_defs;
+ htab_t GTY((param_is (union tree_node))) default_defs;
/* 'true' after aliases have been computed (see compute_may_aliases). */
unsigned int aliases_computed_p : 1;
/* Nonzero if this pointer points to NULL. */
unsigned int pt_null : 1;
+ /* Mask of reasons this pointer's value escapes the function */
+ ENUM_BITFIELD (escape_type) escape_mask : 9;
+
/* Set of variables that this pointer may point to. */
bitmap pt_vars;
pointer will be represented by this memory tag, instead of the type
tag computed by TBAA. */
tree name_mem_tag;
-
- /* Mask of reasons this pointer's value escapes the function */
- unsigned int escape_mask;
};
};
-struct subvar;
-typedef struct subvar *subvar_t;
-
-/* This structure represents a fake sub-variable for a structure field. */
-struct subvar GTY(())
-{
- /* Fake variable. */
- tree var;
-
- /* Next subvar for this structure. */
- subvar_t next;
-};
+typedef VEC(tree,gc) *subvar_t;
struct var_ann_d GTY(())
{
unsigned is_heapvar : 1;
/* True if the variable is call clobbered. */
- unsigned int call_clobbered : 1;
+ unsigned call_clobbered : 1;
/* This field describes several "no alias" attributes that some
symbols are known to have. See the enum's definition for more
information on each attribute. */
ENUM_BITFIELD (noalias_state) noalias_state : 2;
+ /* Mask of values saying the reasons why this variable has escaped
+ the function. */
+ ENUM_BITFIELD (escape_type) escape_mask : 9;
+
/* Memory partition tag assigned to this symbol. */
tree mpt;
current version of this variable (an SSA_NAME). */
tree current_def;
- /* If this variable is a structure, this fields holds a list of
- symbols representing each of the fields of the structure. */
- subvar_t subvars;
-
- /* Mask of values saying the reasons why this variable has escaped
- the function. */
- unsigned int escape_mask;
+ /* If this variable is a structure, this fields holds an array
+ of symbols representing each of the fields of the structure. */
+ VEC(tree,gc) *subvars;
};
/* Container for variable annotation used by hashtable for annotations for
/* Nonzero if the statement makes references to volatile storage. */
unsigned has_volatile_ops : 1;
-
- /* Nonzero if the statement makes a function call that may clobber global
- and local addressable variables. */
- unsigned makes_clobbering_call : 1;
};
union tree_ann_d GTY((desc ("ann_type ((tree_ann_t)&%h)")))
static inline void update_stmt (tree);
static inline bool stmt_modified_p (tree);
static inline bitmap may_aliases (const_tree);
-static inline int get_lineno (tree);
-static inline const char *get_filename (tree);
-static inline bool is_exec_stmt (const_tree);
-static inline bool is_label_stmt (const_tree);
+static inline int get_lineno (const_tree);
static inline bitmap addresses_taken (tree);
/*---------------------------------------------------------------------------
};
/* Accessors for basic block annotations. */
-static inline tree phi_nodes (basic_block);
+static inline tree phi_nodes (const_basic_block);
static inline void set_phi_nodes (basic_block, tree);
/*---------------------------------------------------------------------------
extern unsigned int int_tree_map_hash (const void *);
extern int int_tree_map_eq (const void *, const void *);
+extern unsigned int uid_decl_map_hash (const void *);
+extern int uid_decl_map_eq (const void *, const void *);
+
typedef struct
{
htab_iterator hti;
extern struct omp_region *new_omp_region (basic_block, enum tree_code,
struct omp_region *);
extern void free_omp_regions (void);
+void omp_expand_local (basic_block);
+extern tree find_omp_clause (tree, enum tree_code);
+tree copy_var_decl (tree, tree, tree);
/*---------------------------------------------------------------------------
Function prototypes
#define PENDING_STMT(e) ((e)->insns.t)
extern void delete_tree_cfg_annotations (void);
-extern bool stmt_ends_bb_p (tree);
-extern bool is_ctrl_stmt (tree);
-extern bool is_ctrl_altering_stmt (tree);
-extern bool computed_goto_p (tree);
-extern bool simple_goto_p (tree);
-extern bool tree_can_make_abnormal_goto (tree);
+extern bool stmt_ends_bb_p (const_tree);
+extern bool is_ctrl_stmt (const_tree);
+extern bool is_ctrl_altering_stmt (const_tree);
+extern bool computed_goto_p (const_tree);
+extern bool simple_goto_p (const_tree);
+extern bool tree_can_make_abnormal_goto (const_tree);
extern basic_block single_noncomplex_succ (basic_block bb);
extern void tree_dump_bb (basic_block, FILE *, int);
extern void debug_tree_bb (basic_block);
extern void dump_tree_cfg (FILE *, int);
extern void debug_tree_cfg (int);
extern void dump_cfg_stats (FILE *);
+extern void dot_cfg (void);
extern void debug_cfg_stats (void);
-extern void debug_loop_ir (void);
-extern void print_loop_ir (FILE *);
+extern void debug_loops (int);
+extern void debug_loop (struct loop *, int);
+extern void debug_loop_num (unsigned, int);
+extern void print_loops (FILE *, int);
+extern void print_loops_bb (FILE *, basic_block, int, int);
extern void cleanup_dead_labels (void);
extern void group_case_labels (void);
extern tree first_stmt (basic_block);
extern void notice_special_calls (tree);
extern void clear_special_calls (void);
extern void verify_stmts (void);
+extern void verify_gimple (void);
+extern void verify_gimple_1 (tree);
extern tree tree_block_label (basic_block);
extern void extract_true_false_edges_from_block (basic_block, edge *, edge *);
extern bool tree_duplicate_sese_region (edge, edge, basic_block *, unsigned,
basic_block *);
+extern bool tree_duplicate_sese_tail (edge, edge, basic_block *, unsigned,
+ basic_block *);
extern void add_phi_args_after_copy_bb (basic_block);
-extern void add_phi_args_after_copy (basic_block *, unsigned);
+extern void add_phi_args_after_copy (basic_block *, unsigned, edge);
extern bool tree_purge_dead_abnormal_call_edges (basic_block);
extern bool tree_purge_dead_eh_edges (basic_block);
-extern bool tree_purge_all_dead_eh_edges (bitmap);
+extern bool tree_purge_all_dead_eh_edges (const_bitmap);
extern tree gimplify_val (block_stmt_iterator *, tree, tree);
extern tree gimplify_build1 (block_stmt_iterator *, enum tree_code,
tree, tree);
extern basic_block move_sese_region_to_fn (struct function *, basic_block,
basic_block);
void remove_edge_and_dominated_blocks (edge);
+void mark_virtual_ops_in_bb (basic_block);
/* In tree-cfgcleanup.c */
extern bitmap cfgcleanup_altered_bbs;
extern bool cleanup_tree_cfg (void);
-extern bool cleanup_tree_cfg_loop (void);
/* In tree-pretty-print.c. */
extern void dump_generic_bb (FILE *, basic_block, int, int);
extern tree make_rename_temp (tree, const char *);
extern void set_default_def (tree, tree);
extern tree gimple_default_def (struct function *, tree);
-extern struct mem_sym_stats_d *mem_sym_stats (struct function *, tree);
+extern bool stmt_references_abnormal_ssa_name (tree);
+extern bool refs_may_alias_p (tree, tree);
+extern tree get_single_def_stmt (tree);
+extern tree get_single_def_stmt_from_phi (tree, tree);
+extern tree get_single_def_stmt_with_phi (tree, tree);
/* In tree-phinodes.c */
extern void reserve_phi_args_for_new_edge (basic_block);
/* In gimple-low.c */
extern void record_vars_into (tree, tree);
extern void record_vars (tree);
-extern bool block_may_fallthru (tree);
+extern bool block_may_fallthru (const_tree);
/* In tree-ssa-alias.c */
+extern unsigned int compute_may_aliases (void);
extern void dump_may_aliases_for (FILE *, tree);
extern void debug_may_aliases_for (tree);
extern void dump_alias_info (FILE *);
extern void debug_mem_ref_stats (void);
extern void debug_memory_partitions (void);
extern void debug_mem_sym_stats (tree var);
+extern void dump_mem_sym_stats_for_var (FILE *, tree);
extern void debug_all_mem_sym_stats (void);
/* Call-back function for walk_use_def_chains(). At each reaching
/* In tree-ssa-alias-warnings.c */
extern void strict_aliasing_warning_backend (void);
+
/* In tree-ssa.c */
+
+/* Mapping for redirected edges. */
+struct _edge_var_map GTY(())
+{
+ tree result; /* PHI result. */
+ tree def; /* PHI arg definition. */
+};
+typedef struct _edge_var_map edge_var_map;
+
+DEF_VEC_O(edge_var_map);
+DEF_VEC_ALLOC_O(edge_var_map, heap);
+
+/* A vector of var maps. */
+typedef VEC(edge_var_map, heap) *edge_var_map_vector;
+
+extern void redirect_edge_var_map_add (edge, tree, tree);
+extern void redirect_edge_var_map_clear (edge);
+extern void redirect_edge_var_map_dup (edge, edge);
+extern edge_var_map_vector redirect_edge_var_map_vector (edge);
+extern void redirect_edge_var_map_destroy (void);
+
+
extern void init_tree_ssa (void);
extern edge ssa_redirect_edge (edge, basic_block);
extern void flush_pending_stmts (edge);
extern void delete_tree_ssa (void);
extern void walk_use_def_chains (tree, walk_use_def_chains_fn, void *, bool);
extern bool stmt_references_memory_p (tree);
+extern bool ssa_undefined_value_p (tree);
+
/* In tree-into-ssa.c */
void update_ssa (unsigned);
/* In tree-ssa-ccp.c */
bool fold_stmt (tree *);
bool fold_stmt_inplace (tree);
-tree widen_bitfield (tree, tree, tree);
+tree get_symbol_constant_value (tree);
+tree fold_const_aggregate_ref (tree);
/* In tree-vrp.c */
tree vrp_evaluate_conditional (tree, tree);
/* In tree-vectorizer.c */
unsigned vectorize_loops (void);
-extern bool vect_can_force_dr_alignment_p (tree, unsigned int);
+extern bool vect_can_force_dr_alignment_p (const_tree, unsigned int);
extern tree get_vectype_for_scalar_type (tree);
/* In tree-ssa-phiopt.c */
unsigned int tree_ssa_prefetch_arrays (void);
unsigned int remove_empty_loops (void);
void tree_ssa_iv_optimize (void);
-void tree_predictive_commoning (void);
+unsigned tree_predictive_commoning (void);
+bool parallelize_loops (void);
bool number_of_iterations_exit (struct loop *, edge,
struct tree_niter_desc *niter, bool);
bool nowrap_type_p (tree);
enum ev_direction {EV_DIR_GROWS, EV_DIR_DECREASES, EV_DIR_UNKNOWN};
-enum ev_direction scev_direction (tree);
+enum ev_direction scev_direction (const_tree);
void free_numbers_of_iterations_estimates (void);
void free_numbers_of_iterations_estimates_loop (struct loop *);
bool for_each_index (tree *, bool (*) (tree, tree *, void *), void *);
void create_iv (tree, tree, tree, struct loop *, block_stmt_iterator *, bool,
tree *, tree *);
-void split_loop_exit_edge (edge);
-unsigned force_expr_to_var_cost (tree);
+basic_block split_loop_exit_edge (edge);
void standard_iv_increment_position (struct loop *, block_stmt_iterator *,
bool *);
basic_block ip_end_pos (struct loop *);
unsigned int, sbitmap,
edge, VEC (edge, heap) **,
int);
+struct loop *slpeel_tree_duplicate_loop_to_edge_cfg (struct loop *, edge);
+void rename_variables_in_loop (struct loop *);
struct loop *tree_ssa_loop_version (struct loop *, tree,
basic_block *);
tree expand_simple_operations (tree);
extern enum move_pos movement_possibility (tree);
char *get_lsm_tmp_name (tree, unsigned);
-/* The reasons a variable may escape a function. */
-enum escape_type
-{
- NO_ESCAPE = 0, /* Doesn't escape. */
- ESCAPE_STORED_IN_GLOBAL = 1 << 1,
- ESCAPE_TO_ASM = 1 << 2, /* Passed by address to an assembly
- statement. */
- ESCAPE_TO_CALL = 1 << 3, /* Escapes to a function call. */
- ESCAPE_BAD_CAST = 1 << 4, /* Cast from pointer to integer */
- ESCAPE_TO_RETURN = 1 << 5, /* Returned from function. */
- ESCAPE_TO_PURE_CONST = 1 << 6, /* Escapes to a pure or constant
- function call. */
- ESCAPE_IS_GLOBAL = 1 << 7, /* Is a global variable. */
- ESCAPE_IS_PARM = 1 << 8, /* Is an incoming function argument. */
- ESCAPE_UNKNOWN = 1 << 9 /* We believe it escapes for
- some reason not enumerated
- above. */
-};
-
/* In tree-flow-inline.h */
static inline bool is_call_clobbered (const_tree);
static inline void mark_call_clobbered (tree, unsigned int);
extern void make_eh_edges (tree);
extern bool tree_could_trap_p (tree);
extern bool tree_could_throw_p (tree);
-extern bool tree_can_throw_internal (tree);
+extern bool tree_can_throw_internal (const_tree);
extern bool tree_can_throw_external (tree);
-extern int lookup_stmt_eh_region (tree);
+extern int lookup_stmt_eh_region (const_tree);
extern void add_stmt_to_eh_region (tree, int);
extern bool remove_stmt_from_eh_region (tree);
extern bool maybe_clean_or_replace_eh_stmt (tree, tree);
tree force_gimple_operand (tree, tree *, bool, tree);
tree force_gimple_operand_bsi (block_stmt_iterator *, tree, bool, tree,
bool, enum bsi_iterator_update);
+tree gimple_fold_indirect_ref (tree);
/* In tree-ssa-structalias.c */
bool find_what_p_points_to (tree);
void get_address_description (tree, struct mem_address *);
tree maybe_fold_tmr (tree);
-/* This structure is simply used during pushing fields onto the fieldstack
- to track the offset of the field, since bitpos_of_field gives it relative
- to its immediate containing type, and we want it relative to the ultimate
- containing object. */
+/* This structure is used during pushing fields onto the fieldstack
+ to track the offset of the field, since bitpos_of_field gives it
+ relative to its immediate containing type, and we want it relative
+ to the ultimate containing object. */
struct fieldoff
{
+ /* Type of the field. */
tree type;
+
+ /* Size, in bits, of the field. */
tree size;
+
+ /* Field. */
tree decl;
+
+ /* Offset from the base of the base containing object to this field. */
HOST_WIDE_INT offset;
- HOST_WIDE_INT alias_set;
+
+ /* Alias set for the field. */
+ alias_set_type alias_set;
+
+ /* True, if this offset can be a base for further component accesses. */
+ unsigned base_for_components : 1;
};
typedef struct fieldoff fieldoff_s;