diff options
author | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-11-12 15:23:33 +0000 |
---|---|---|
committer | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-11-12 15:23:33 +0000 |
commit | 9456798d72d0e81a2a553287f436dcb05cff175a (patch) | |
tree | 1e80106d0c4f828b72deb6e782c20d788c0dd818 /gcc/ipa-pure-const.c | |
parent | e89aee4174fe58eaba553027558144a0f423960c (diff) | |
download | gcc-9456798d72d0e81a2a553287f436dcb05cff175a.tar.gz |
[./]
2013-11-12 Basile Starynkevitch <basile@starynkevitch.net>
{{merge with trunk GCC 4.9 svn rev 204695; previous trunk merge
was 202773; very unstable...}}
[gcc/]
2013-11-11 Basile Starynkevitch <basile@starynkevitch.net>
{{merge with trunk GCC 4.9 svn rev 204695; very unstable}}
* melt-runtime.h (MELT_VERSION_STRING): Bump to "1.0.1+".
* melt-run.proto.h: Update copyright years.
include tree-cfg.h instead of tree-flow.h for GCC 4.9.
* melt-runtime.cc: Include tree-cfg.h not tree-flow.h for GCC 4.9.
(meltgc_walk_gimple_seq): Fatal error with GCC 4.9 since the
walk_use_def_chains function disappeared from GCC...
* melt/xtramelt-ana-gimple.melt (walk_gimple_seq)
(walk_gimple_seq_unique_tree): issue some #warning-s for GCC 4.9
because walk_use_def_chains function disappeared from GCC...
* melt/xtramelt-probe.melt (probe_docmd): Issue an error since
currently the MELT probe is not usable with GCC 4.9....
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/melt-branch@204705 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ipa-pure-const.c')
-rw-r--r-- | gcc/ipa-pure-const.c | 161 |
1 files changed, 104 insertions, 57 deletions
diff --git a/gcc/ipa-pure-const.c b/gcc/ipa-pure-const.c index 55b679d98a2..50bf500b172 100644 --- a/gcc/ipa-pure-const.c +++ b/gcc/ipa-pure-const.c @@ -36,15 +36,15 @@ along with GCC; see the file COPYING3. If not see #include "coretypes.h" #include "tm.h" #include "tree.h" -#include "tree-ssa.h" +#include "gimple.h" +#include "tree-cfg.h" +#include "tree-ssa-loop-niter.h" #include "tree-inline.h" #include "tree-pass.h" #include "langhooks.h" #include "pointer-set.h" #include "ggc.h" #include "ipa-utils.h" -#include "gimple.h" -#include "cgraph.h" #include "flags.h" #include "diagnostic.h" #include "gimple-pretty-print.h" @@ -179,7 +179,7 @@ warn_function_const (tree decl, bool known_finite) known_finite, warned_about, "const"); } -void +static void warn_function_noreturn (tree decl) { static struct pointer_set_t *warned_about; @@ -190,15 +190,6 @@ warn_function_noreturn (tree decl) true, warned_about, "noreturn"); } -/* Init the function state. */ - -static void -finish_state (void) -{ - funct_state_vec.release (); -} - - /* Return true if we have a function state for NODE. */ static inline bool @@ -725,7 +716,7 @@ check_stmt (gimple_stmt_iterator *gsip, funct_state local, bool ipa) static funct_state analyze_function (struct cgraph_node *fn, bool ipa) { - tree decl = fn->symbol.decl; + tree decl = fn->decl; funct_state l; basic_block this_block; @@ -736,10 +727,10 @@ analyze_function (struct cgraph_node *fn, bool ipa) l->looping = false; l->can_throw = false; state_from_flags (&l->state_previously_known, &l->looping_previously_known, - flags_from_decl_or_type (fn->symbol.decl), + flags_from_decl_or_type (fn->decl), cgraph_node_cannot_return (fn)); - if (fn->thunk.thunk_p || fn->symbol.alias) + if (fn->thunk.thunk_p || fn->alias) { /* Thunk gets propagated through, so nothing interesting happens. */ gcc_assert (ipa); @@ -759,7 +750,7 @@ analyze_function (struct cgraph_node *fn, bool ipa) gimple_stmt_iterator gsi; struct walk_stmt_info wi; - memset (&wi, 0, sizeof(wi)); + memset (&wi, 0, sizeof (wi)); for (gsi = gsi_start_bb (this_block); !gsi_end_p (gsi); gsi_next (&gsi)) @@ -952,7 +943,7 @@ pure_const_write_summary (void) lsei_next_function_in_partition (&lsei)) { node = lsei_cgraph_node (lsei); - if (node->symbol.definition && has_function_state (node)) + if (node->definition && has_function_state (node)) count++; } @@ -963,7 +954,7 @@ pure_const_write_summary (void) lsei_next_function_in_partition (&lsei)) { node = lsei_cgraph_node (lsei); - if (node->symbol.definition && has_function_state (node)) + if (node->definition && has_function_state (node)) { struct bitpack_d bp; funct_state fs; @@ -973,7 +964,7 @@ pure_const_write_summary (void) fs = get_function_state (node); encoder = ob->decl_state->symtab_node_encoder; - node_ref = lto_symtab_encoder_encode (encoder, (symtab_node)node); + node_ref = lto_symtab_encoder_encode (encoder, node); streamer_write_uhwi_stream (ob->main_stream, node_ref); /* Note that flags will need to be read in the opposite @@ -1042,10 +1033,10 @@ pure_const_read_summary (void) fs->can_throw = bp_unpack_value (&bp, 1); if (dump_file) { - int flags = flags_from_decl_or_type (node->symbol.decl); + int flags = flags_from_decl_or_type (node->decl); fprintf (dump_file, "Read info for %s/%i ", cgraph_node_name (node), - node->symbol.order); + node->order); if (flags & ECF_CONST) fprintf (dump_file, " const"); if (flags & ECF_PURE) @@ -1126,7 +1117,7 @@ propagate_pure_const (void) int count = 0; node = order[i]; - if (node->symbol.alias) + if (node->alias) continue; if (dump_file && (dump_flags & TDF_DETAILS)) @@ -1145,7 +1136,7 @@ propagate_pure_const (void) if (dump_file && (dump_flags & TDF_DETAILS)) fprintf (dump_file, " Visiting %s/%i state:%s looping %i\n", cgraph_node_name (w), - w->symbol.order, + w->order, pure_const_names[w_l->pure_const_state], w_l->looping); @@ -1192,7 +1183,7 @@ propagate_pure_const (void) fprintf (dump_file, " Call to %s/%i", cgraph_node_name (e->callee), - e->callee->symbol.order); + e->callee->order); } if (avail > AVAIL_OVERWRITABLE) { @@ -1221,11 +1212,11 @@ propagate_pure_const (void) } } else if (special_builtin_state (&edge_state, &edge_looping, - y->symbol.decl)) + y->decl)) ; else state_from_flags (&edge_state, &edge_looping, - flags_from_decl_or_type (y->symbol.decl), + flags_from_decl_or_type (y->decl), cgraph_edge_cannot_lead_to_return (e)); /* Merge the results with what we already know. */ @@ -1264,7 +1255,7 @@ propagate_pure_const (void) break; /* And finally all loads and stores. */ - for (i = 0; ipa_ref_list_reference_iterate (&w->symbol.ref_list, i, ref); i++) + for (i = 0; ipa_ref_list_reference_iterate (&w->ref_list, i, ref); i++) { enum pure_const_state_e ref_state = IPA_CONST; bool ref_looping = false; @@ -1272,7 +1263,7 @@ propagate_pure_const (void) { case IPA_REF_LOAD: /* readonly reads are safe. */ - if (TREE_READONLY (ipa_ref_varpool_node (ref)->symbol.decl)) + if (TREE_READONLY (ipa_ref_varpool_node (ref)->decl)) break; if (dump_file && (dump_flags & TDF_DETAILS)) fprintf (dump_file, " nonreadonly global var read\n"); @@ -1296,7 +1287,7 @@ propagate_pure_const (void) if (pure_const_state == IPA_NEITHER) break; } - w_info = (struct ipa_dfs_info *) w->symbol.aux; + w_info = (struct ipa_dfs_info *) w->aux; w = w_info->next_cycle; } if (dump_file && (dump_flags & TDF_DETAILS)) @@ -1331,9 +1322,9 @@ propagate_pure_const (void) switch (this_state) { case IPA_CONST: - if (!TREE_READONLY (w->symbol.decl)) + if (!TREE_READONLY (w->decl)) { - warn_function_const (w->symbol.decl, !this_looping); + warn_function_const (w->decl, !this_looping); if (dump_file) fprintf (dump_file, "Function found to be %sconst: %s\n", this_looping ? "looping " : "", @@ -1343,9 +1334,9 @@ propagate_pure_const (void) break; case IPA_PURE: - if (!DECL_PURE_P (w->symbol.decl)) + if (!DECL_PURE_P (w->decl)) { - warn_function_pure (w->symbol.decl, !this_looping); + warn_function_pure (w->decl, !this_looping); if (dump_file) fprintf (dump_file, "Function found to be %spure: %s\n", this_looping ? "looping " : "", @@ -1357,7 +1348,7 @@ propagate_pure_const (void) default: break; } - w_info = (struct ipa_dfs_info *) w->symbol.aux; + w_info = (struct ipa_dfs_info *) w->aux; w = w_info->next_cycle; } } @@ -1396,7 +1387,7 @@ propagate_nothrow (void) bool can_throw = false; node = order[i]; - if (node->symbol.alias) + if (node->alias) continue; /* Find the worst state for any node in the cycle. */ @@ -1424,11 +1415,11 @@ propagate_nothrow (void) if (can_throw) break; - if (y_l->can_throw && !TREE_NOTHROW (w->symbol.decl) + if (y_l->can_throw && !TREE_NOTHROW (w->decl) && e->can_throw_external) can_throw = true; } - else if (e->can_throw_external && !TREE_NOTHROW (y->symbol.decl)) + else if (e->can_throw_external && !TREE_NOTHROW (y->decl)) can_throw = true; } for (ie = node->indirect_calls; ie; ie = ie->next_callee) @@ -1437,7 +1428,7 @@ propagate_nothrow (void) can_throw = true; break; } - w_info = (struct ipa_dfs_info *) w->symbol.aux; + w_info = (struct ipa_dfs_info *) w->aux; w = w_info->next_cycle; } @@ -1447,16 +1438,16 @@ propagate_nothrow (void) while (w) { funct_state w_l = get_function_state (w); - if (!can_throw && !TREE_NOTHROW (w->symbol.decl)) + if (!can_throw && !TREE_NOTHROW (w->decl)) { cgraph_set_nothrow_flag (w, true); if (dump_file) fprintf (dump_file, "Function found to be nothrow: %s\n", cgraph_node_name (w)); } - else if (can_throw && !TREE_NOTHROW (w->symbol.decl)) + else if (can_throw && !TREE_NOTHROW (w->decl)) w_l->can_throw = true; - w_info = (struct ipa_dfs_info *) w->symbol.aux; + w_info = (struct ipa_dfs_info *) w->aux; w = w_info->next_cycle; } } @@ -1488,7 +1479,6 @@ propagate (void) if (has_function_state (node)) free (get_function_state (node)); funct_state_vec.release (); - finish_state (); return 0; } @@ -1520,17 +1510,17 @@ const pass_data pass_data_ipa_pure_const = class pass_ipa_pure_const : public ipa_opt_pass_d { public: - pass_ipa_pure_const(gcc::context *ctxt) - : ipa_opt_pass_d(pass_data_ipa_pure_const, ctxt, - pure_const_generate_summary, /* generate_summary */ - pure_const_write_summary, /* write_summary */ - pure_const_read_summary, /* read_summary */ - NULL, /* write_optimization_summary */ - NULL, /* read_optimization_summary */ - NULL, /* stmt_fixup */ - 0, /* function_transform_todo_flags_start */ - NULL, /* function_transform */ - NULL) /* variable_transform */ + pass_ipa_pure_const (gcc::context *ctxt) + : ipa_opt_pass_d (pass_data_ipa_pure_const, ctxt, + pure_const_generate_summary, /* generate_summary */ + pure_const_write_summary, /* write_summary */ + pure_const_read_summary, /* read_summary */ + NULL, /* write_optimization_summary */ + NULL, /* read_optimization_summary */ + NULL, /* stmt_fixup */ + 0, /* function_transform_todo_flags_start */ + NULL, /* function_transform */ + NULL) /* variable_transform */ {} /* opt_pass methods: */ @@ -1704,12 +1694,12 @@ const pass_data pass_data_local_pure_const = class pass_local_pure_const : public gimple_opt_pass { public: - pass_local_pure_const(gcc::context *ctxt) - : gimple_opt_pass(pass_data_local_pure_const, ctxt) + pass_local_pure_const (gcc::context *ctxt) + : gimple_opt_pass (pass_data_local_pure_const, ctxt) {} /* opt_pass methods: */ - opt_pass * clone () { return new pass_local_pure_const (ctxt_); } + opt_pass * clone () { return new pass_local_pure_const (m_ctxt); } bool gate () { return gate_pure_const (); } unsigned int execute () { return local_pure_const (); } @@ -1722,3 +1712,60 @@ make_pass_local_pure_const (gcc::context *ctxt) { return new pass_local_pure_const (ctxt); } + +/* Emit noreturn warnings. */ + +static unsigned int +execute_warn_function_noreturn (void) +{ + if (!TREE_THIS_VOLATILE (current_function_decl) + && EDGE_COUNT (EXIT_BLOCK_PTR->preds) == 0) + warn_function_noreturn (current_function_decl); + return 0; +} + +static bool +gate_warn_function_noreturn (void) +{ + return warn_suggest_attribute_noreturn; +} + +namespace { + +const pass_data pass_data_warn_function_noreturn = +{ + GIMPLE_PASS, /* type */ + "*warn_function_noreturn", /* name */ + OPTGROUP_NONE, /* optinfo_flags */ + true, /* has_gate */ + true, /* has_execute */ + TV_NONE, /* tv_id */ + PROP_cfg, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + 0, /* todo_flags_finish */ +}; + +class pass_warn_function_noreturn : public gimple_opt_pass +{ +public: + pass_warn_function_noreturn (gcc::context *ctxt) + : gimple_opt_pass (pass_data_warn_function_noreturn, ctxt) + {} + + /* opt_pass methods: */ + bool gate () { return gate_warn_function_noreturn (); } + unsigned int execute () { return execute_warn_function_noreturn (); } + +}; // class pass_warn_function_noreturn + +} // anon namespace + +gimple_opt_pass * +make_pass_warn_function_noreturn (gcc::context *ctxt) +{ + return new pass_warn_function_noreturn (ctxt); +} + + |