Hi,
this patch adds a missing call to edge duplication hooks in
cgraph_edge::make_callback.

In PR125121, we get an ICE in ipa-sra when compiling with -fno-ipa-cp,
because the analysis in ipa-prop runs after sra generates its summaries.
Because of the missing call to the hooks, the summaries required by sra
don't get copied over for the newly added callback edges, leading to
segfaults.  This patch adds the call to the hooks to remedy this.  It
also changes some of the initialization logic for summaries for callback
edges to make it a little more consistent.

Bootstrapped and regtested x86-linux without issues.  Also bootstrapped
and regtested with RUNTESTFLAGS="--target_board=unix/-fno-ipa-cp" to
check for different problems of the same nature, none found.

OK for master and 16 backport?

Best regards,
Josef

        PR 125121

gcc/ChangeLog:

        * cgraph.cc (cgraph_edge::make_callback): Add missing call to
        duplication hooks.
        * ipa-prop.cc (init_callback_edge_summary): Remove function.
        (ipa_compute_jump_functions_for_edge): Remove call to
        init_callback_edge_summary, fix comment.
        (ipa_edge_args_sum_t::duplicate): Fix the initialization of jump
        functions vector for callback edges.

gcc/testsuite/ChangeLog:

        * c-c++-common/gomp/pr125121.c: New test.

Signed-off-by: Josef Melcr <[email protected]>
---
 gcc/cgraph.cc                              |  1 +
 gcc/ipa-prop.cc                            | 26 ++++++++++------------
 gcc/testsuite/c-c++-common/gomp/pr125121.c | 11 +++++++++
 3 files changed, 24 insertions(+), 14 deletions(-)
 create mode 100644 gcc/testsuite/c-c++-common/gomp/pr125121.c

diff --git a/gcc/cgraph.cc b/gcc/cgraph.cc
index 13ea9c34629..4b22cad9f11 100644
--- a/gcc/cgraph.cc
+++ b/gcc/cgraph.cc
@@ -1383,6 +1383,7 @@ cgraph_edge::make_callback (cgraph_node *n2, unsigned int 
callback_id)
   else
     e2->can_throw_external = can_throw_external;
   e2->lto_stmt_uid = lto_stmt_uid;
+  symtab->call_edge_duplication_hooks (this, e2);
   n2->mark_address_taken ();
   return e2;
 }
diff --git a/gcc/ipa-prop.cc b/gcc/ipa-prop.cc
index 625a2b25969..dbd26f9453c 100644
--- a/gcc/ipa-prop.cc
+++ b/gcc/ipa-prop.cc
@@ -2480,18 +2480,6 @@ skip_a_safe_conversion_op (tree t)
   return t;
 }
 
-/* Initializes ipa_edge_args summary of CBE given its callback-carrying edge.
-   This primarily means allocating the correct amount of jump functions.  */
-
-static inline void
-init_callback_edge_summary (struct cgraph_edge *cbe, tree attr)
-{
-  ipa_edge_args *cb_args = ipa_edge_args_sum->get_create (cbe);
-  size_t jf_vec_length = callback_num_args(attr);
-  vec_safe_grow_cleared (cb_args->jump_functions,
-                        jf_vec_length, true);
-}
-
 /* Compute jump function for all arguments of callsite CS and insert the
    information in the jump_functions array in the ipa_edge_args corresponding
    to this callsite.  */
@@ -2631,7 +2619,7 @@ ipa_compute_jump_functions_for_edge (struct 
ipa_func_body_info *fbi,
                    }
 
                  /* If a callback attribute describing this pointer is found,
-                          create a callback edge to the pointee function to
+                    create a callback edge to the pointee function to
                     allow for further optimizations.  */
                  if (callback_attr)
                    {
@@ -2640,7 +2628,6 @@ ipa_compute_jump_functions_for_edge (struct 
ipa_func_body_info *fbi,
                      unsigned callback_id = n;
                      cgraph_edge *cbe
                        = cs->make_callback (kernel_node, callback_id);
-                     init_callback_edge_summary (cbe, callback_attr);
                      callback_edges.safe_push (cbe);
                    }
                }
@@ -5151,6 +5138,17 @@ ipa_edge_args_sum_t::duplicate (cgraph_edge *src, 
cgraph_edge *dst,
       new_args->jump_functions = NULL;
       return;
     }
+
+  if (src->has_callback && dst->callback)
+    {
+      tree attr = callback_fetch_attr_by_edge (dst, src);
+      unsigned arg_count = callback_num_args (attr);
+      vec_safe_grow_cleared (new_args->jump_functions, arg_count, true);
+      /* Duplication of jump functions is handled separately for callback
+        pairs.  */
+      return;
+    }
+
   vec_safe_grow_cleared (new_args->jump_functions,
                         old_args->jump_functions->length (), true);
 
diff --git a/gcc/testsuite/c-c++-common/gomp/pr125121.c 
b/gcc/testsuite/c-c++-common/gomp/pr125121.c
new file mode 100644
index 00000000000..0aceb6e5165
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/gomp/pr125121.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fno-ipa-cp" } */
+
+void
+a ()
+{
+#pragma omp parallel sections
+  {
+    ;
+  }
+}
-- 
2.54.0

Reply via email to