ipa/98330 - avoid ICEing on call indirect call
authorRichard Biener <rguenther@suse.de>
Tue, 19 Jan 2021 13:21:41 +0000 (14:21 +0100)
committerRichard Biener <rguenther@suse.de>
Tue, 19 Jan 2021 13:32:25 +0000 (14:32 +0100)
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.

gcc/ipa-modref.c
gcc/testsuite/g++.dg/pr98330.C [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr98330.c [new file with mode: 0644]

index 74ad876cf581ec211041a2e83c8f0235f9dfcec8..8a5669c7f9bf8e948306a2c34724c9032ba877db 100644 (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;
diff --git a/gcc/testsuite/g++.dg/pr98330.C b/gcc/testsuite/g++.dg/pr98330.C
new file mode 100644 (file)
index 0000000..08bf77b
--- /dev/null
@@ -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 (file)
index 0000000..bc68a6f
--- /dev/null
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+float f (__typeof (__builtin_pow) fn, float x)
+{
+  return fn (x, 2);
+}