Hi All,
This is a fix for the failures I introduced with my FMV series.
Appologies for the regression in the first place. I was regression testing
pretty thoroughly when working on that series so I am confused how this was
never caught. As far as I can tell, the code as written would never have worked.
Perhaps I got something wrong in a rebase.
Either way, the fix seems pretty lightweight.
Regression tested on aarch64-linux-gnu and x86_64-linux-gnu.
Ok for master?
KR,
Alfie
-- >8 --
Fix the reachability checks for FMV nodes which were put in the wrong
place and fix the definition value for a dispatched symbol to match
that of the default node.
PR target/124167
gcc/ChangeLog
* attribs.cc (make_dispatcher_decl): Change node->definition
to inherit from the node its called on.
* ipa.cc (remote_unreachable_nodes): Move FMV logic out of
(!in_boundary_p) if block.
---
gcc/attribs.cc | 6 +++++-
gcc/ipa.cc | 19 +++++++++----------
2 files changed, 14 insertions(+), 11 deletions(-)
diff --git a/gcc/attribs.cc b/gcc/attribs.cc
index c63d13d7e55..99f2fd75531 100644
--- a/gcc/attribs.cc
+++ b/gcc/attribs.cc
@@ -1230,7 +1230,11 @@ make_dispatcher_decl (const tree decl)
/* Set flags on the cgraph_node for the new decl. */
cgraph_node *func_node = cgraph_node::get_create (func_decl);
func_node->dispatcher_function = true;
- func_node->definition = true;
+ /* For targets with TARGET_HAS_FMV_TARGET_ATTRIBUTE, the resolver is created
+ unconditionally if any versioned nodes are present.
+ For !TARGET_HAS_FMV_TARGET_ATTRIBUTE, the dispatcher is only defined when
+ the default node is defined. */
+ func_node->definition = node->definition || TARGET_HAS_FMV_TARGET_ATTRIBUTE;
cgraph_function_version_info *func_v
= func_node->insert_new_function_version ();
diff --git a/gcc/ipa.cc b/gcc/ipa.cc
index ca939c9c118..d1a0bb8ce1d 100644
--- a/gcc/ipa.cc
+++ b/gcc/ipa.cc
@@ -441,16 +441,6 @@ symbol_table::remove_unreachable_nodes (FILE *file)
}
}
- /* A reference to the default node implies use of all the other
- versions (they get used in the function resolver made later
- in multiple_target.cc) */
- cgraph_function_version_info *node_v = cnode->function_version ();
- if (node_v && is_function_default_version (node->decl))
- for (cgraph_function_version_info *fvi = node_v->next;
- fvi;
- fvi = fvi->next)
- enqueue_node (fvi->this_node, &first, &reachable);
-
for (e = cnode->callees; e; e = e->next_callee)
{
symtab_node *body = e->callee->function_symbol ();
@@ -494,6 +484,15 @@ symbol_table::remove_unreachable_nodes (FILE *file)
else if (cnode->thunk)
enqueue_node (cnode->callees->callee, &first, &reachable);
+ /* A reference to the default node implies use of all the other
+ versions (they get used in the function resolver made later
+ in multiple_target.cc) */
+ cgraph_function_version_info *node_v = cnode->function_version ();
+ if (node_v && is_function_default_version (node->decl))
+ for (cgraph_function_version_info *fvi = node_v->next; fvi;
+ fvi = fvi->next)
+ enqueue_node (fvi->this_node, &first, &reachable);
+
/* If any reachable function has simd clones, mark them as
reachable as well. */
if (cnode->simd_clones)
--
2.34.1