diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d6cd5690686..7dfe5f49b32 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-11-24 Richard Guenther + + PR lto/43218 + * lto-symtab.c (lto_cgraph_replace_node): Mark edges with + conflicting function signatures as non-inlineable. + 2010-11-24 Jakub Jelinek PR rtl-optimization/46614 diff --git a/gcc/lto-symtab.c b/gcc/lto-symtab.c index b83c75e9da7..4484d93f0a2 100644 --- a/gcc/lto-symtab.c +++ b/gcc/lto-symtab.c @@ -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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index feae590deca..475df8f7bf5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-11-24 Richard Guenther + + PR lto/43218 + * gcc.dg/lto/20100423-1_0.c: Enable for all LTO modes. + 2010-11-24 Jakub Jelinek PR rtl-optimization/46614 diff --git a/gcc/testsuite/gcc.dg/lto/20100423-1_0.c b/gcc/testsuite/gcc.dg/lto/20100423-1_0.c index eb931651500..1963c1fee17 100644 --- a/gcc/testsuite/gcc.dg/lto/20100423-1_0.c +++ b/gcc/testsuite/gcc.dg/lto/20100423-1_0.c @@ -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);