if (check_flags
&& remove_useless_eaf_flags (static_chain_flags, ecf_flags, false))
return true;
- if (ecf_flags & (ECF_CONST | ECF_NOVOPS))
+ if (ecf_flags & ECF_CONST)
return ((!side_effects || !nondeterministic)
&& (ecf_flags & ECF_LOOPING_CONST_OR_PURE));
if (loads && !loads->every_base)
int flags = gimple_call_flags (call);
/* Nothing to do for non-looping cont functions. */
- if ((flags & (ECF_CONST | ECF_NOVOPS))
+ if ((flags & ECF_CONST)
&& !(flags & ECF_LOOPING_CONST_OR_PURE))
return false;
/* Merge side effects and non-determinism.
PURE/CONST flags makes functions deterministic and if there is
no LOOPING_CONST_OR_PURE they also have no side effects. */
- if (!(flags & (ECF_CONST | ECF_NOVOPS | ECF_PURE))
+ if (!(flags & (ECF_CONST | ECF_PURE))
|| (flags & ECF_LOOPING_CONST_OR_PURE))
{
if (!m_summary->side_effects && callee_summary->side_effects)
/* PURE/CONST flags makes functions deterministic and if there is
no LOOPING_CONST_OR_PURE they also have no side effects. */
- if (!(flags & (ECF_CONST | ECF_NOVOPS | ECF_PURE))
+ if (!(flags & (ECF_CONST | ECF_PURE))
|| (flags & ECF_LOOPING_CONST_OR_PURE)
|| (cfun->can_throw_non_call_exceptions
&& stmt_could_throw_p (cfun, call)))
print_gimple_stmt (dump_file, stmt, 0);
}
- if ((flags & (ECF_CONST | ECF_NOVOPS))
+ if ((flags & ECF_CONST)
&& !(flags & ECF_LOOPING_CONST_OR_PURE))
{
if (dump_file)
fprintf (dump_file,
- " - ECF_CONST | ECF_NOVOPS, ignoring all stores and all loads "
+ " - ECF_CONST, ignoring all stores and all loads "
"except for args.\n");
return;
}
if (dump_file)
fprintf (dump_file, gimple_call_internal_p (stmt)
? " - Internal call" : " - Indirect call.\n");
- process_fnspec (stmt);
+ if (flags & ECF_NOVOPS)
+ {
+ set_side_effects ();
+ set_nondeterministic ();
+ }
+ else
+ process_fnspec (stmt);
return;
}
/* We only need to handle internal calls in IPA mode. */
return changed;
}
- if (!(ecf_flags & (ECF_CONST | ECF_NOVOPS | ECF_PURE))
+ if (!(ecf_flags & (ECF_CONST | ECF_PURE))
|| (ecf_flags & ECF_LOOPING_CONST_OR_PURE)
|| nontrivial_scc)
{
struct cgraph_node *callee;
if (!callee_edge->inline_failed
- || ((flags & (ECF_CONST | ECF_NOVOPS))
+ || ((flags & ECF_CONST)
&& !(flags & ECF_LOOPING_CONST_OR_PURE)))
continue;
{
escape_summary *sum = escape_summaries->get (e);
- if (!sum || (e->indirect_info->ecf_flags
- & (ECF_CONST | ECF_NOVOPS)))
+ if (!sum || ((e->indirect_info->ecf_flags & ECF_CONST)
+ && !(e->indirect_info->ecf_flags & ECF_LOOPING_CONST_OR_PURE)))
continue;
changed |= modref_merge_call_site_flags
modref_summary_lto *callee_summary_lto = NULL;
struct cgraph_node *callee;
- if (ecf_flags & (ECF_CONST | ECF_NOVOPS)
- || !callee_edge->inline_failed)
+ if ((ecf_flags & ECF_CONST)
+ && !(ecf_flags & ECF_LOOPING_CONST_OR_PURE))
continue;
/* Get the callee and its summary. */
if (!callee_info && to_info)
{
- if (!(flags & (ECF_CONST | ECF_NOVOPS)))
+ if (!(flags & (ECF_CONST | ECF_PURE | ECF_NOVOPS)))
to_info->loads->collapse ();
if (!ignore_stores)
to_info->stores->collapse ();
/* Merge side effects and non-determinism.
PURE/CONST flags makes functions deterministic and if there is
no LOOPING_CONST_OR_PURE they also have no side effects. */
- if (!(flags & (ECF_CONST | ECF_NOVOPS | ECF_PURE))
+ if (!(flags & (ECF_CONST | ECF_PURE))
|| (flags & ECF_LOOPING_CONST_OR_PURE))
{
if (to_info)