aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ipa-modref.c50
-rw-r--r--gcc/ipa-modref.h11
-rw-r--r--gcc/tree-ssa-structalias.c4
3 files changed, 36 insertions, 29 deletions
diff --git a/gcc/ipa-modref.c b/gcc/ipa-modref.c
index 669dbe4..84a32ec 100644
--- a/gcc/ipa-modref.c
+++ b/gcc/ipa-modref.c
@@ -276,7 +276,8 @@ static GTY(()) fast_function_summary <modref_summary_lto *, va_gc>
modref_summary::modref_summary ()
: loads (NULL), stores (NULL), retslot_flags (0), static_chain_flags (0),
- writes_errno (false), side_effects (false)
+ writes_errno (false), side_effects (false), global_memory_read (false),
+ global_memory_written (false)
{
}
@@ -339,26 +340,6 @@ modref_summary::useful_p (int ecf_flags, bool check_flags)
return stores && !stores->every_base;
}
-/* Return true if global memory is read
- (that is loads summary contains global memory access). */
-bool
-modref_summary::global_memory_read_p ()
-{
- if (!loads)
- return true;
- return loads->global_access_p ();
-}
-
-/* Return true if global memory is written. */
-bool
-modref_summary::global_memory_written_p ()
-{
- if (!stores)
- return true;
- return stores->global_access_p ();
-}
-
-
/* Single function summary used for LTO. */
typedef modref_tree <tree> modref_records_lto;
@@ -621,6 +602,10 @@ modref_summary::dump (FILE *out)
fprintf (out, " Writes errno\n");
if (side_effects)
fprintf (out, " Side effects\n");
+ if (global_memory_read)
+ fprintf (out, " Global memory read\n");
+ if (global_memory_written)
+ fprintf (out, " Global memory written\n");
if (arg_flags.length ())
{
for (unsigned int i = 0; i < arg_flags.length (); i++)
@@ -676,6 +661,15 @@ modref_summary_lto::dump (FILE *out)
}
}
+/* Called after summary is produced and before it is used by local analysis.
+ Can be called multiple times in case summary needs to update signature. */
+void
+modref_summary::finalize ()
+{
+ global_memory_read = !loads || loads->global_access_p ();
+ global_memory_written = !stores || stores->global_access_p ();
+}
+
/* Get function summary for FUNC if it exists, return NULL otherwise. */
modref_summary *
@@ -2809,8 +2803,7 @@ analyze_function (function *f, bool ipa)
first = false;
}
}
- if (summary && !summary->global_memory_written_p () && !summary->side_effects
- && !finite_function_p ())
+ if (summary && !summary->side_effects && !finite_function_p ())
summary->side_effects = true;
if (summary_lto && !summary_lto->side_effects && !finite_function_p ())
summary_lto->side_effects = true;
@@ -2838,6 +2831,8 @@ analyze_function (function *f, bool ipa)
summaries->remove (fnode);
summary = NULL;
}
+ if (summary)
+ summary->finalize ();
if (summary_lto && !summary_lto->useful_p (ecf_flags))
{
summaries_lto->remove (fnode);
@@ -3557,6 +3552,8 @@ read_section (struct lto_file_decl_data *file_data, const char *data,
modref_read_escape_summary (&bp, e);
}
}
+ if (flag_ltrans)
+ modref_sum->finalize ();
if (dump_file)
{
fprintf (dump_file, "Read modref for %s\n",
@@ -3713,6 +3710,8 @@ update_signature (struct cgraph_node *node)
if (r_lto)
r_lto->dump (dump_file);
}
+ if (r)
+ r->finalize ();
return;
}
@@ -4914,6 +4913,11 @@ pass_ipa_modref::execute (function *)
pureconst |= modref_propagate_in_scc (component_node);
modref_propagate_flags_in_scc (component_node);
+ if (optimization_summaries)
+ for (struct cgraph_node *cur = component_node; cur;
+ cur = ((struct ipa_dfs_info *) cur->aux)->next_cycle)
+ if (modref_summary *sum = optimization_summaries->get (cur))
+ sum->finalize ();
if (dump_file)
modref_propagate_dump_scc (component_node);
}
diff --git a/gcc/ipa-modref.h b/gcc/ipa-modref.h
index 49c99f2..9a8d565 100644
--- a/gcc/ipa-modref.h
+++ b/gcc/ipa-modref.h
@@ -33,15 +33,18 @@ struct GTY(()) modref_summary
auto_vec<eaf_flags_t> GTY((skip)) arg_flags;
eaf_flags_t retslot_flags;
eaf_flags_t static_chain_flags;
- bool writes_errno;
- bool side_effects;
+ unsigned writes_errno : 1;
+ unsigned side_effects : 1;
+ /* Flags coputed by finalize method. */
+ unsigned global_memory_read : 1;
+ unsigned global_memory_written : 1;
+
modref_summary ();
~modref_summary ();
void dump (FILE *);
bool useful_p (int ecf_flags, bool check_flags = true);
- bool global_memory_read_p ();
- bool global_memory_written_p ();
+ void finalize ();
};
modref_summary *get_modref_function_summary (cgraph_node *func);
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c
index 34fd47f..6141e94 100644
--- a/gcc/tree-ssa-structalias.c
+++ b/gcc/tree-ssa-structalias.c
@@ -4262,9 +4262,9 @@ determine_global_memory_access (gcall *stmt,
&& (summary = get_modref_function_summary (node)))
{
if (writes_global_memory && *writes_global_memory)
- *writes_global_memory = summary->global_memory_written_p ();
+ *writes_global_memory = summary->global_memory_written;
if (reads_global_memory && *reads_global_memory)
- *reads_global_memory = summary->global_memory_read_p ();
+ *reads_global_memory = summary->global_memory_read;
if (reads_global_memory && uses_global_memory
&& !*reads_global_memory && node->binds_to_current_def_p ())
*uses_global_memory = false;