#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 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 stmt_ends_bb_p (const_tree);
extern bool is_ctrl_stmt (const_tree);
-extern bool is_ctrl_altering_stmt (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 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 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 (const_bitmap);
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 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 remove_empty_loops (void);
void tree_ssa_iv_optimize (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;
+
+ /* 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;