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:
parent
f27cd6f422
commit
66dd412fee
|
@ -1247,11 +1247,13 @@ analyze_stmt (modref_summary *summary, modref_summary_lto *summary_lto,
|
||||||
&& (!fnspec.global_memory_read_p ()
|
&& (!fnspec.global_memory_read_p ()
|
||||||
|| !fnspec.global_memory_written_p ()))
|
|| !fnspec.global_memory_written_p ()))
|
||||||
{
|
{
|
||||||
fnspec_summaries->get_create
|
cgraph_edge *e = cgraph_node::get (current_function_decl)->get_edge (stmt);
|
||||||
(cgraph_node::get (current_function_decl)->get_edge (stmt))
|
if (e->callee)
|
||||||
->fnspec = xstrdup (fnspec.get_str ());
|
{
|
||||||
if (dump_file)
|
fnspec_summaries->get_create (e)->fnspec = xstrdup (fnspec.get_str ());
|
||||||
fprintf (dump_file, " Recorded fnspec %s\n", fnspec.get_str ());
|
if (dump_file)
|
||||||
|
fprintf (dump_file, " Recorded fnspec %s\n", fnspec.get_str ());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -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" }
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
/* { dg-do compile } */
|
||||||
|
/* { dg-options "-O2" } */
|
||||||
|
|
||||||
|
float f (__typeof (__builtin_pow) fn, float x)
|
||||||
|
{
|
||||||
|
return fn (x, 2);
|
||||||
|
}
|
Loading…
Reference in New Issue