Fix internal error during inlining after ICF pass

The problem is that the ICF pass identifies two functions, one of which has
a static chain while the other does not.  The fix is simply to prevent this
identification from occurring.

gcc/
	PR ipa/113996
	* ipa-icf.cc (sem_function::get_hash): Hash DECL_STATIC_CHAIN.
	(sem_function::equals_wpa): Compare it.
	(sem_function::equals_private): Likewise.

gcc/testsuite/
	* gnat.dg/lto27.adb: New test.
This commit is contained in:
Eric Botcazou
2024-09-30 21:04:18 +02:00
parent 9c14f9a9c1
commit 65073a5b90
2 changed files with 27 additions and 2 deletions

View File

@@ -304,6 +304,7 @@ sem_function::get_hash (void)
(TREE_OPTIMIZATION (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (decl))));
hstate.add_flag (DECL_CXX_CONSTRUCTOR_P (decl));
hstate.add_flag (DECL_CXX_DESTRUCTOR_P (decl));
hstate.add_flag (DECL_STATIC_CHAIN (decl));
set_hash (hstate.end ());
}
@@ -655,7 +656,10 @@ sem_function::equals_wpa (sem_item *item,
}
if (list1 || list2)
return return_false_with_msg ("Mismatched number of parameters");
return return_false_with_msg ("mismatched number of parameters");
if (DECL_STATIC_CHAIN (decl) != DECL_STATIC_CHAIN (item->decl))
return return_false_with_msg ("static chain mismatch");
if (node->num_references () != item->node->num_references ())
return return_false_with_msg ("different number of references");
@@ -876,7 +880,10 @@ sem_function::equals_private (sem_item *item)
return return_false ();
}
if (arg1 || arg2)
return return_false_with_msg ("Mismatched number of arguments");
return return_false_with_msg ("mismatched number of arguments");
if (DECL_STATIC_CHAIN (decl) != DECL_STATIC_CHAIN (m_compared_func->decl))
return return_false_with_msg ("static chain mismatch");
if (!dyn_cast <cgraph_node *> (node)->has_gimple_body_p ())
return true;

View File

@@ -0,0 +1,18 @@
-- { dg-do link }
-- { dg-options "-O2 -gnatp -flto" { target lto } }
with Ada.Containers.Hashed_Maps;
with Ada.Strings.Hash;
procedure Lto27 is
subtype Node_Name is String (1 .. 4);
package Node_Maps is new Ada.Containers.Hashed_Maps
(Key_Type => Node_Name,
Element_Type => Integer,
Hash => Ada.Strings.Hash,
Equivalent_Keys => "=");
begin
null;
end;