aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2021-01-19 14:21:41 +0100
committerRichard Biener <rguenther@suse.de>2021-01-19 14:32:25 +0100
commit66dd412feeab29783fcdcf7ab36f20c5dd7b2332 (patch)
treea077959253ac3ac7378924674fb17b507347150d
parentf27cd6f42261e838677dfd0652f09cc0dfd6a42b (diff)
downloadgcc-66dd412feeab29783fcdcf7ab36f20c5dd7b2332.zip
gcc-66dd412feeab29783fcdcf7ab36f20c5dd7b2332.tar.gz
gcc-66dd412feeab29783fcdcf7ab36f20c5dd7b2332.tar.bz2
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.
-rw-r--r--gcc/ipa-modref.c12
-rw-r--r--gcc/testsuite/g++.dg/pr98330.C7
-rw-r--r--gcc/testsuite/gcc.dg/pr98330.c7
3 files changed, 21 insertions, 5 deletions
diff --git a/gcc/ipa-modref.c b/gcc/ipa-modref.c
index 74ad876..8a5669c 100644
--- a/gcc/ipa-modref.c
+++ b/gcc/ipa-modref.c
@@ -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;
diff --git a/gcc/testsuite/g++.dg/pr98330.C b/gcc/testsuite/g++.dg/pr98330.C
new file mode 100644
index 0000000..08bf77b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pr98330.C
@@ -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" }
+}
diff --git a/gcc/testsuite/gcc.dg/pr98330.c b/gcc/testsuite/gcc.dg/pr98330.c
new file mode 100644
index 0000000..bc68a6f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr98330.c
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+float f (__typeof (__builtin_pow) fn, float x)
+{
+ return fn (x, 2);
+}