re PR lto/43218 ([LTO] Conflicting function types cause ICE)

2010-11-24  Richard Guenther  <rguenther@suse.de>

	PR lto/43218
	* lto-symtab.c (lto_cgraph_replace_node): Mark edges with
	conflicting function signatures as non-inlineable.

	* gcc.dg/lto/20100423-1_0.c: Enable for all LTO modes.

From-SVN: r167122
This commit is contained in:
Richard Guenther 2010-11-24 17:06:41 +00:00 committed by Richard Biener
parent 0d40d51cf5
commit ecf9b8aefc
4 changed files with 21 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2010-11-24 Richard Guenther <rguenther@suse.de>
PR lto/43218
* lto-symtab.c (lto_cgraph_replace_node): Mark edges with
conflicting function signatures as non-inlineable.
2010-11-24 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/46614

View File

@ -210,6 +210,7 @@ lto_cgraph_replace_node (struct cgraph_node *node,
{
struct cgraph_edge *e, *next;
bool no_aliases_please = false;
bool compatible_p;
if (cgraph_dump_file)
{
@ -240,10 +241,19 @@ lto_cgraph_replace_node (struct cgraph_node *node,
}
/* Redirect all incoming edges. */
compatible_p
= gimple_types_compatible_p (TREE_TYPE (TREE_TYPE (prevailing_node->decl)),
TREE_TYPE (TREE_TYPE (node->decl)), GTC_DIAG);
for (e = node->callers; e; e = next)
{
next = e->next_caller;
cgraph_redirect_edge_callee (e, prevailing_node);
/* If there is a mismatch between the supposed callee return type and
the real one do not attempt to inline this function.
??? We really need a way to match function signatures for ABI
compatibility and perform related promotions at inlining time. */
if (!compatible_p)
e->call_stmt_cannot_inline_p = 1;
}
/* Redirect incomming references. */
ipa_clone_refering (prevailing_node, NULL, &node->ref_list);

View File

@ -1,3 +1,8 @@
2010-11-24 Richard Guenther <rguenther@suse.de>
PR lto/43218
* gcc.dg/lto/20100423-1_0.c: Enable for all LTO modes.
2010-11-24 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/46614

View File

@ -1,5 +1,4 @@
/* { dg-lto-do run } */
/* { dg-lto-options {{-O2 -flto -flto-partition=none}} } */
struct bar {int x;};
extern struct bar foo(void);