ipa/98330 - avoid ICEing on call indirect call

The following avoids ICEing on a indirect calls with a fnspec
in modref analysis.

2021-01-19  Richard Biener  <rguenther@suse.de>

	PR ipa/98330
	* ipa-modref.c (analyze_stmt): Only record a summary for a
	direct call.

	* g++.dg/pr98330.C: New testcase.
	* gcc.dg/pr98330.c: Likewise.
This commit is contained in:
Richard Biener 2021-01-19 14:21:41 +01:00
parent f27cd6f422
commit 66dd412fee
3 changed files with 21 additions and 5 deletions

View File

@ -1247,11 +1247,13 @@ analyze_stmt (modref_summary *summary, modref_summary_lto *summary_lto,
&& (!fnspec.global_memory_read_p ()
|| !fnspec.global_memory_written_p ()))
{
fnspec_summaries->get_create
(cgraph_node::get (current_function_decl)->get_edge (stmt))
->fnspec = xstrdup (fnspec.get_str ());
if (dump_file)
fprintf (dump_file, " Recorded fnspec %s\n", fnspec.get_str ());
cgraph_edge *e = cgraph_node::get (current_function_decl)->get_edge (stmt);
if (e->callee)
{
fnspec_summaries->get_create (e)->fnspec = xstrdup (fnspec.get_str ());
if (dump_file)
fprintf (dump_file, " Recorded fnspec %s\n", fnspec.get_str ());
}
}
}
return true;

View File

@ -0,0 +1,7 @@
// { dg-do compile }
// { dg-options -O2 }
float f (float x)
{
return __builtin_pow[1] (x, 2); // { dg-warning "pointer to a function used in arithmetic" }
}

View File

@ -0,0 +1,7 @@
/* { dg-do compile } */
/* { dg-options "-O2" } */
float f (__typeof (__builtin_pow) fn, float x)
{
return fn (x, 2);
}