X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fgimple.h;h=d1018b70c0aa3f38f8a55a4f74683021484f7055;hb=97db846f9ccc1b5c1d2c72869937173bb7c25871;hp=e956370bcd19708b19a3b2c1cc2ffc9f5e4cbbe0;hpb=6968561bee0c5b6ef5a592182867f36c43f9e232;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/gimple.h b/gcc/gimple.h index e956370bcd1..d1018b70c0a 100644 --- a/gcc/gimple.h +++ b/gcc/gimple.h @@ -1,6 +1,6 @@ /* Gimple IR definitions. - Copyright 2007, 2008, 2009 Free Software Foundation, Inc. + Copyright 2007, 2008, 2009, 2010 Free Software Foundation, Inc. Contributed by Aldy Hernandez This file is part of GCC. @@ -29,6 +29,7 @@ along with GCC; see the file COPYING3. If not see #include "hard-reg-set.h" #include "basic-block.h" #include "tree-ssa-operands.h" +#include "tree-ssa-alias.h" DEF_VEC_P(gimple); DEF_VEC_ALLOC_P(gimple,heap); @@ -390,6 +391,25 @@ struct GTY(()) gimple_statement_with_memory_ops }; +/* Call statements that take both memory and register operands. */ + +struct GTY(()) gimple_statement_call +{ + /* [ WORD 1-8 ] */ + struct gimple_statement_with_memory_ops_base membase; + + /* [ WORD 9-12 ] */ + struct pt_solution call_used; + struct pt_solution call_clobbered; + + /* [ WORD 13 ] + Operand vector. NOTE! This must always be the last field + of this structure. In particular, this means that this + structure cannot be embedded inside another one. */ + tree GTY((length ("%h.membase.opbase.gsbase.num_ops"))) op[1]; +}; + + /* OpenMP statements (#pragma omp). */ struct GTY(()) gimple_statement_omp { @@ -584,13 +604,13 @@ struct GTY(()) gimple_omp_for_iter { /* Index variable. */ tree index; - + /* Initial value. */ tree initial; /* Final value. */ tree final; - + /* Increment. */ tree incr; }; @@ -700,7 +720,7 @@ struct GTY(()) gimple_statement_omp_single { }; -/* GIMPLE_OMP_ATOMIC_LOAD. +/* GIMPLE_OMP_ATOMIC_LOAD. Note: This is based on gimple_statement_base, not g_s_omp, because g_s_omp contains a sequence, which we don't need here. */ @@ -739,6 +759,7 @@ union GTY ((desc ("gimple_statement_structure (&%h)"))) gimple_statement_d { struct gimple_statement_with_ops GTY ((tag ("GSS_WITH_OPS"))) gsops; struct gimple_statement_with_memory_ops_base GTY ((tag ("GSS_WITH_MEM_OPS_BASE"))) gsmembase; struct gimple_statement_with_memory_ops GTY ((tag ("GSS_WITH_MEM_OPS"))) gsmem; + struct gimple_statement_call GTY ((tag ("GSS_CALL"))) gimple_call; struct gimple_statement_omp GTY ((tag ("GSS_OMP"))) omp; struct gimple_statement_bind GTY ((tag ("GSS_BIND"))) gimple_bind; struct gimple_statement_catch GTY ((tag ("GSS_CATCH"))) gimple_catch; @@ -769,6 +790,10 @@ extern size_t const gimple_ops_offset_[]; /* Map GIMPLE codes to GSS codes. */ extern enum gimple_statement_structure_enum const gss_for_code_[]; +/* This variable holds the currently expanded gimple statement for purposes + of comminucating the profile info to the builtin expanders. */ +extern gimple currently_expanding_gimple_stmt; + gimple gimple_build_return (tree); gimple gimple_build_assign_stat (tree, tree MEM_STAT_DECL); @@ -832,17 +857,20 @@ void gimple_seq_free (gimple_seq); void gimple_seq_add_seq (gimple_seq *, gimple_seq); gimple_seq gimple_seq_copy (gimple_seq); int gimple_call_flags (const_gimple); +int gimple_call_return_flags (const_gimple); +int gimple_call_arg_flags (const_gimple, unsigned); +void gimple_call_reset_alias_info (gimple); bool gimple_assign_copy_p (gimple); bool gimple_assign_ssa_name_copy_p (gimple); bool gimple_assign_single_p (gimple); bool gimple_assign_unary_nop_p (gimple); void gimple_set_bb (gimple, struct basic_block_def *); -tree gimple_fold (const_gimple); void gimple_assign_set_rhs_from_tree (gimple_stmt_iterator *, tree); void gimple_assign_set_rhs_with_ops (gimple_stmt_iterator *, enum tree_code, tree, tree); tree gimple_get_lhs (const_gimple); void gimple_set_lhs (gimple, tree); +void gimple_replace_lhs (gimple, tree); gimple gimple_copy (gimple); bool is_gimple_operand (const_tree); void gimple_set_modified (gimple, bool); @@ -860,6 +888,8 @@ unsigned get_gimple_rhs_num_ops (enum tree_code); gimple gimple_alloc_stat (enum gimple_code, unsigned MEM_STAT_DECL); const char *gimple_decl_printable_name (tree, int); tree gimple_fold_obj_type_ref (tree, tree); +tree gimple_get_relevant_ref_binfo (tree ref, tree known_binfo); +tree gimple_fold_obj_type_ref_known_binfo (HOST_WIDE_INT, tree); /* Returns true iff T is a valid GIMPLE statement. */ extern bool is_gimple_stmt (tree); @@ -916,6 +946,7 @@ extern bool is_gimple_call_addr (tree); extern tree get_call_expr_in (tree t); extern void recalculate_side_effects (tree); +extern bool compare_field_offset (tree, tree); extern tree gimple_register_type (tree); extern void print_gimple_types_stats (void); extern void free_gimple_type_tables (void); @@ -937,6 +968,7 @@ extern bool gimple_ior_addresses_taken (bitmap, gimple); extern tree create_tmp_var_raw (tree, const char *); extern tree create_tmp_var_name (const char *); extern tree create_tmp_var (tree, const char *); +extern tree create_tmp_reg (tree, const char *); extern tree get_initialized_tmp_var (tree, gimple_seq *, gimple_seq *); extern tree get_formal_tmp_var (tree, gimple_seq *); extern void declare_vars (tree, gimple, bool); @@ -981,7 +1013,7 @@ struct gimplify_ctx gimple_seq conditional_cleanups; tree exit_label; tree return_temp; - + VEC(tree,heap) *case_labels; /* The formal temporary table. Should this be persistent? */ htab_t temp_htab; @@ -1055,7 +1087,9 @@ gimple_code (const_gimple g) static inline enum gimple_statement_structure_enum gss_for_code (enum gimple_code code) { +#ifdef ENABLE_CHECKING gcc_assert ((unsigned int)code < LAST_AND_UNUSED_GIMPLE_CODE); +#endif return gss_for_code_[code]; } @@ -1097,7 +1131,7 @@ gimple_has_substatements (gimple g) return false; } } - + /* Return the basic block holding statement G. */ @@ -1622,7 +1656,9 @@ gimple_op (const_gimple gs, unsigned i) { if (gimple_has_ops (gs)) { +#ifdef ENABLE_CHECKING gcc_assert (i < gimple_num_ops (gs)); +#endif return gimple_ops (CONST_CAST_GIMPLE (gs))[i]; } else @@ -1636,7 +1672,9 @@ gimple_op_ptr (const_gimple gs, unsigned i) { if (gimple_has_ops (gs)) { +#ifdef ENABLE_CHECKING gcc_assert (i < gimple_num_ops (gs)); +#endif return gimple_ops (CONST_CAST_GIMPLE (gs)) + i; } else @@ -1700,7 +1738,6 @@ static inline void gimple_assign_set_lhs (gimple gs, tree lhs) { GIMPLE_CHECK (gs, GIMPLE_ASSIGN); - gcc_assert (is_gimple_operand (lhs)); gimple_set_op (gs, 0, lhs); if (lhs && TREE_CODE (lhs) == SSA_NAME) @@ -1735,13 +1772,6 @@ gimple_assign_set_rhs1 (gimple gs, tree rhs) { GIMPLE_CHECK (gs, GIMPLE_ASSIGN); - /* If there are 3 or more operands, the 2 operands on the RHS must be - GIMPLE values. */ - if (gimple_num_ops (gs) >= 3) - gcc_assert (is_gimple_val (rhs)); - else - gcc_assert (is_gimple_operand (rhs)); - gimple_set_op (gs, 1, rhs); } @@ -1779,9 +1809,6 @@ gimple_assign_set_rhs2 (gimple gs, tree rhs) { GIMPLE_CHECK (gs, GIMPLE_ASSIGN); - /* The 2 operands on the RHS must be GIMPLE values. */ - gcc_assert (is_gimple_val (rhs)); - gimple_set_op (gs, 2, rhs); } @@ -1895,7 +1922,6 @@ static inline void gimple_call_set_lhs (gimple gs, tree lhs) { GIMPLE_CHECK (gs, GIMPLE_CALL); - gcc_assert (!lhs || is_gimple_operand (lhs)); gimple_set_op (gs, 0, lhs); if (lhs && TREE_CODE (lhs) == SSA_NAME) SSA_NAME_DEF_STMT (lhs) = gs; @@ -1930,7 +1956,6 @@ static inline void gimple_call_set_fn (gimple gs, tree fn) { GIMPLE_CHECK (gs, GIMPLE_CALL); - gcc_assert (is_gimple_operand (fn)); gimple_set_op (gs, 1, fn); } @@ -1941,7 +1966,6 @@ static inline void gimple_call_set_fndecl (gimple gs, tree decl) { GIMPLE_CHECK (gs, GIMPLE_CALL); - gcc_assert (TREE_CODE (decl) == FUNCTION_DECL); gimple_set_op (gs, 1, build_fold_addr_expr_loc (gimple_location (gs), decl)); } @@ -1955,10 +1979,7 @@ gimple_call_fndecl (const_gimple gs) { tree addr = gimple_call_fn (gs); if (TREE_CODE (addr) == ADDR_EXPR) - { - gcc_assert (TREE_CODE (TREE_OPERAND (addr, 0)) == FUNCTION_DECL); - return TREE_OPERAND (addr, 0); - } + return TREE_OPERAND (addr, 0); return NULL_TREE; } @@ -1972,12 +1993,8 @@ gimple_call_return_type (const_gimple gs) tree type = TREE_TYPE (fn); /* See through the pointer. */ - gcc_assert (POINTER_TYPE_P (type)); type = TREE_TYPE (type); - gcc_assert (TREE_CODE (type) == FUNCTION_TYPE - || TREE_CODE (type) == METHOD_TYPE); - /* The type returned by a FUNCTION_DECL is the type of its function type. */ return TREE_TYPE (type); @@ -2009,9 +2026,7 @@ static inline void gimple_call_set_chain (gimple gs, tree chain) { GIMPLE_CHECK (gs, GIMPLE_CALL); - gcc_assert (chain == NULL - || TREE_CODE (chain) == ADDR_EXPR - || SSA_VAR_P (chain)); + gimple_set_op (gs, 2, chain); } @@ -2024,7 +2039,6 @@ gimple_call_num_args (const_gimple gs) unsigned num_ops; GIMPLE_CHECK (gs, GIMPLE_CALL); num_ops = gimple_num_ops (gs); - gcc_assert (num_ops >= 3); return num_ops - 3; } @@ -2056,7 +2070,6 @@ static inline void gimple_call_set_arg (gimple gs, unsigned index, tree arg) { GIMPLE_CHECK (gs, GIMPLE_CALL); - gcc_assert (is_gimple_operand (arg)); gimple_set_op (gs, index + 3, arg); } @@ -2214,6 +2227,28 @@ gimple_call_copy_flags (gimple dest_call, gimple orig_call) } +/* Return a pointer to the points-to solution for the set of call-used + variables of the call CALL. */ + +static inline struct pt_solution * +gimple_call_use_set (gimple call) +{ + GIMPLE_CHECK (call, GIMPLE_CALL); + return &call->gimple_call.call_used; +} + + +/* Return a pointer to the points-to solution for the set of call-used + variables of the call CALL. */ + +static inline struct pt_solution * +gimple_call_clobber_set (gimple call) +{ + GIMPLE_CHECK (call, GIMPLE_CALL); + return &call->gimple_call.call_clobbered; +} + + /* Returns true if this is a GIMPLE_ASSIGN or a GIMPLE_CALL with a non-NULL lhs. */ @@ -2242,7 +2277,6 @@ static inline void gimple_cond_set_code (gimple gs, enum tree_code code) { GIMPLE_CHECK (gs, GIMPLE_COND); - gcc_assert (TREE_CODE_CLASS (code) == tcc_comparison); gs->gsbase.subcode = code; } @@ -2273,7 +2307,6 @@ static inline void gimple_cond_set_lhs (gimple gs, tree lhs) { GIMPLE_CHECK (gs, GIMPLE_COND); - gcc_assert (is_gimple_operand (lhs)); gimple_set_op (gs, 0, lhs); } @@ -2305,7 +2338,6 @@ static inline void gimple_cond_set_rhs (gimple gs, tree rhs) { GIMPLE_CHECK (gs, GIMPLE_COND); - gcc_assert (is_gimple_operand (rhs)); gimple_set_op (gs, 1, rhs); } @@ -2328,7 +2360,6 @@ static inline void gimple_cond_set_true_label (gimple gs, tree label) { GIMPLE_CHECK (gs, GIMPLE_COND); - gcc_assert (!label || TREE_CODE (label) == LABEL_DECL); gimple_set_op (gs, 2, label); } @@ -2340,7 +2371,6 @@ static inline void gimple_cond_set_false_label (gimple gs, tree label) { GIMPLE_CHECK (gs, GIMPLE_COND); - gcc_assert (!label || TREE_CODE (label) == LABEL_DECL); gimple_set_op (gs, 3, label); } @@ -2471,7 +2501,6 @@ static inline void gimple_label_set_label (gimple gs, tree label) { GIMPLE_CHECK (gs, GIMPLE_LABEL); - gcc_assert (TREE_CODE (label) == LABEL_DECL); gimple_set_op (gs, 0, label); } @@ -2488,11 +2517,10 @@ gimple_goto_dest (const_gimple gs) /* Set DEST to be the destination of the unconditonal jump GS. */ -static inline void +static inline void gimple_goto_set_dest (gimple gs, tree dest) { GIMPLE_CHECK (gs, GIMPLE_GOTO); - gcc_assert (is_gimple_operand (dest)); gimple_set_op (gs, 0, dest); } @@ -3286,7 +3314,9 @@ static inline tree gimple_debug_bind_get_var (gimple dbg) { GIMPLE_CHECK (dbg, GIMPLE_DEBUG); +#ifdef ENABLE_CHECKING gcc_assert (gimple_debug_bind_p (dbg)); +#endif return gimple_op (dbg, 0); } @@ -3297,7 +3327,9 @@ static inline tree gimple_debug_bind_get_value (gimple dbg) { GIMPLE_CHECK (dbg, GIMPLE_DEBUG); +#ifdef ENABLE_CHECKING gcc_assert (gimple_debug_bind_p (dbg)); +#endif return gimple_op (dbg, 1); } @@ -3308,7 +3340,9 @@ static inline tree * gimple_debug_bind_get_value_ptr (gimple dbg) { GIMPLE_CHECK (dbg, GIMPLE_DEBUG); +#ifdef ENABLE_CHECKING gcc_assert (gimple_debug_bind_p (dbg)); +#endif return gimple_op_ptr (dbg, 1); } @@ -3318,7 +3352,9 @@ static inline void gimple_debug_bind_set_var (gimple dbg, tree var) { GIMPLE_CHECK (dbg, GIMPLE_DEBUG); +#ifdef ENABLE_CHECKING gcc_assert (gimple_debug_bind_p (dbg)); +#endif gimple_set_op (dbg, 0, var); } @@ -3329,7 +3365,9 @@ static inline void gimple_debug_bind_set_value (gimple dbg, tree value) { GIMPLE_CHECK (dbg, GIMPLE_DEBUG); +#ifdef ENABLE_CHECKING gcc_assert (gimple_debug_bind_p (dbg)); +#endif gimple_set_op (dbg, 1, value); } @@ -3344,7 +3382,9 @@ static inline void gimple_debug_bind_reset_value (gimple dbg) { GIMPLE_CHECK (dbg, GIMPLE_DEBUG); +#ifdef ENABLE_CHECKING gcc_assert (gimple_debug_bind_p (dbg)); +#endif gimple_set_op (dbg, 1, GIMPLE_DEBUG_BIND_NOVALUE); } @@ -3355,7 +3395,9 @@ static inline bool gimple_debug_bind_has_value_p (gimple dbg) { GIMPLE_CHECK (dbg, GIMPLE_DEBUG); +#ifdef ENABLE_CHECKING gcc_assert (gimple_debug_bind_p (dbg)); +#endif return gimple_op (dbg, 1) != GIMPLE_DEBUG_BIND_NOVALUE; } @@ -3363,7 +3405,7 @@ gimple_debug_bind_has_value_p (gimple dbg) /* Return the body for the OMP statement GS. */ -static inline gimple_seq +static inline gimple_seq gimple_omp_body (gimple gs) { return gs->omp.body; @@ -4248,7 +4290,6 @@ static inline tree * gimple_return_retval_ptr (const_gimple gs) { GIMPLE_CHECK (gs, GIMPLE_RETURN); - gcc_assert (gimple_num_ops (gs) == 1); return gimple_op_ptr (gs, 0); } @@ -4258,7 +4299,6 @@ static inline tree gimple_return_retval (const_gimple gs) { GIMPLE_CHECK (gs, GIMPLE_RETURN); - gcc_assert (gimple_num_ops (gs) == 1); return gimple_op (gs, 0); } @@ -4269,10 +4309,6 @@ static inline void gimple_return_set_retval (gimple gs, tree retval) { GIMPLE_CHECK (gs, GIMPLE_RETURN); - gcc_assert (gimple_num_ops (gs) == 1); - gcc_assert (retval == NULL_TREE - || TREE_CODE (retval) == RESULT_DECL - || is_gimple_val (retval)); gimple_set_op (gs, 0, retval); } @@ -4429,7 +4465,7 @@ gsi_start_bb (basic_block bb) { gimple_stmt_iterator i; gimple_seq seq; - + seq = bb_seq (bb); i.ptr = gimple_seq_first (seq); i.seq = seq; @@ -4580,7 +4616,7 @@ gsi_last_nondebug_bb (basic_block bb) } /* Return a pointer to the current stmt. - + NOTE: You may want to use gsi_replace on the iterator itself, as this performs additional bookkeeping that will not be done if you simply assign through a pointer returned by gsi_stmt_ptr. */ @@ -4756,4 +4792,16 @@ gimple_alloc_kind (enum gimple_code code) extern void dump_gimple_statistics (void); +/* In gimple-fold.c. */ +void gimplify_and_update_call_from_tree (gimple_stmt_iterator *, tree); +tree gimple_fold_builtin (gimple); +bool fold_stmt (gimple_stmt_iterator *); +bool fold_stmt_inplace (gimple); +tree maybe_fold_offset_to_reference (location_t, tree, tree, tree); +tree maybe_fold_offset_to_address (location_t, tree, tree, tree); +tree maybe_fold_stmt_addition (location_t, tree, tree, tree); +tree get_symbol_constant_value (tree); +bool may_propagate_address_into_dereference (tree, tree); + + #endif /* GCC_GIMPLE_H */