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_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;
|
||||
|
7
gcc/testsuite/g++.dg/pr98330.C
Normal file
7
gcc/testsuite/g++.dg/pr98330.C
Normal 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" }
|
||||
}
|
7
gcc/testsuite/gcc.dg/pr98330.c
Normal file
7
gcc/testsuite/gcc.dg/pr98330.c
Normal file
@ -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
Block a user