{
public:
/* Mark NAME as relevant for analysis. */
- void analyze_ssa_name (tree name);
+ void analyze_ssa_name (tree name, bool deferred = false);
/* Dataflow slover. */
void propagate ();
/* Return flags computed earlier for NAME. */
are processed later) */
void
-modref_eaf_analysis::analyze_ssa_name (tree name)
+modref_eaf_analysis::analyze_ssa_name (tree name, bool deferred)
{
imm_use_iterator ui;
gimple *use_stmt;
int index = SSA_NAME_VERSION (name);
- /* See if value is already computed. */
- if (m_lattice[index].known || m_lattice[index].do_dataflow)
- return;
- if (m_lattice[index].open)
+ if (!deferred)
{
- if (dump_file)
- fprintf (dump_file,
- "%*sCycle in SSA graph\n",
- m_depth * 4, "");
- return;
- }
- /* Recursion guard. */
- m_lattice[index].init ();
- if (m_depth == param_modref_max_depth)
- {
- if (dump_file)
- fprintf (dump_file,
- "%*sMax recursion depth reached; postponing\n",
- m_depth * 4, "");
- m_deferred_names.safe_push (name);
- return;
+ /* See if value is already computed. */
+ if (m_lattice[index].known || m_lattice[index].do_dataflow)
+ return;
+ if (m_lattice[index].open)
+ {
+ if (dump_file)
+ fprintf (dump_file,
+ "%*sCycle in SSA graph\n",
+ m_depth * 4, "");
+ return;
+ }
+ /* Recursion guard. */
+ m_lattice[index].init ();
+ if (m_depth == param_modref_max_depth)
+ {
+ if (dump_file)
+ fprintf (dump_file,
+ "%*sMax recursion depth reached; postponing\n",
+ m_depth * 4, "");
+ m_deferred_names.safe_push (name);
+ return;
+ }
}
if (dump_file)
while (m_deferred_names.length ())
{
tree name = m_deferred_names.pop ();
- m_lattice[SSA_NAME_VERSION (name)].open = false;
if (dump_file)
fprintf (dump_file, "Analyzing deferred SSA name\n");
- analyze_ssa_name (name);
+ analyze_ssa_name (name, true);
}
if (!m_names_to_propagate.length ())