Hi,
our handling of local flag (that define where register passing convention will 
be used)
is somewhat off. First we clear it on all functions that have call across 
partitions
and we also clear it on partial cgraph boundaries.
Fixed both,
Bootstrapped/regtested ppc64-linux, comitted.
        PR lto/57602
        * cgraph.c (verify_cgraph_node): Accept local flags from other 
partitions.
        * ipa.c (symtab_remove_unreachable_nodes): Do not clear local flag.
        (function_and_variable_visibility): Likewise.
        * trans-mem.c (ipa_tm_create_version): TM versions are not local.
Index: cgraph.c
===================================================================
*** cgraph.c    (revision 201483)
--- cgraph.c    (working copy)
*************** verify_cgraph_node (struct cgraph_node *
*** 2363,2369 ****
        error ("inline clone in same comdat group list");
        error_found = true;
      }
!   if (!node->symbol.definition && node->local.local)
      {
        error ("local symbols must be defined");
        error_found = true;
--- 2363,2369 ----
        error ("inline clone in same comdat group list");
        error_found = true;
      }
!   if (!node->symbol.definition && !node->symbol.in_other_partition && 
node->local.local)
      {
        error ("local symbols must be defined");
        error_found = true;
Index: ipa.c
===================================================================
*** ipa.c       (revision 201483)
--- ipa.c       (working copy)
*************** symtab_remove_unreachable_nodes (bool be
*** 376,382 ****
            {
              if (file)
                fprintf (file, " %s", cgraph_node_name (node));
!             cgraph_reset_node (node);
              changed = true;
            }
        }
--- 376,390 ----
            {
              if (file)
                fprintf (file, " %s", cgraph_node_name (node));
!             node->symbol.analyzed = false;
!             node->symbol.definition = false;
!             node->symbol.cpp_implicit_alias = false;
!             node->symbol.alias = false;
!             node->symbol.weakref = false;
!             if (!node->symbol.in_other_partition)
!               node->local.local = false;
!             cgraph_node_remove_callees (node);
!             ipa_remove_all_references (&node->symbol.ref_list);
              changed = true;
            }
        }
*************** function_and_variable_visibility (bool w
*** 888,894 ****
      }
    FOR_EACH_DEFINED_FUNCTION (node)
      {
!       node->local.local = cgraph_local_node_p (node);
  
        /* If we know that function can not be overwritten by a different 
semantics
         and moreover its section can not be discarded, replace all direct calls
--- 896,902 ----
      }
    FOR_EACH_DEFINED_FUNCTION (node)
      {
!       node->local.local |= cgraph_local_node_p (node);
  
        /* If we know that function can not be overwritten by a different 
semantics
         and moreover its section can not be discarded, replace all direct calls
Index: trans-mem.c
===================================================================
*** trans-mem.c (revision 201483)
--- trans-mem.c (working copy)
*************** ipa_tm_create_version (struct cgraph_nod
*** 4774,4779 ****
--- 4774,4780 ----
      DECL_COMDAT_GROUP (new_decl) = tm_mangle (DECL_COMDAT_GROUP (old_decl));
  
    new_node = cgraph_copy_node_for_versioning (old_node, new_decl, vNULL, 
NULL);
+   new_node->local.local = false;
    new_node->symbol.externally_visible = old_node->symbol.externally_visible;
    new_node->lowered = true;
    new_node->tm_clone = 1;

Reply via email to