From 153516ca4ec45c233156530be225dafb3a3e8b0e Mon Sep 17 00:00:00 2001 From: rguenth Date: Wed, 19 May 2010 13:14:37 +0000 Subject: [PATCH] 2010-05-19 Richard Guenther Backport from mainline: 2010-04-26 Richard Guenther PR lto/43455 * tree-inline.c (tree_can_inline_p): Also check compatibility of return types. * gcc.dg/lto/20100423-1_0.c: New testcase. * gcc.dg/lto/20100423-1_1.c: Likewise. 2010-04-23 Richard Guenther PR lto/42653 * tree.c (free_lang_data_in_decl): Do not reset DECL_CONTEXT of FUNCTION_DECLs. * g++.dg/lto/20100423-1_0.C: New testcase. 2010-04-26 Richard Guenther PR lto/42425 * tree.c (free_lang_data_in_type): Do not free TYPE_CONTEXT if emitting debug information and it is either a function or a namespace decl. * g++.dg/lto/20100423-2_0.C: New testcase. 2010-04-26 Richard Guenther PR lto/43080 * gimple.c (gimple_decl_printable_name): Deal gracefully with a NULL DECL_NAME. * g++.dg/lto/20100423-3_0.C: New testcase. 2010-04-30 Richard Guenther PR lto/43946 * passes.c (init_optimization_passes): Move pass_ipa_free_lang_data first after all lowering passes. * gcc.dg/lto/20100430-1_0.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_5-branch@159564 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 34 +++++++++++++++++++++++++++++ gcc/gimple.c | 3 ++- gcc/passes.c | 2 +- gcc/testsuite/ChangeLog | 29 +++++++++++++++++++++++++ gcc/testsuite/g++.dg/lto/20100423-1_0.C | 38 +++++++++++++++++++++++++++++++++ gcc/testsuite/g++.dg/lto/20100423-2_0.C | 14 ++++++++++++ gcc/testsuite/g++.dg/lto/20100423-3_0.C | 14 ++++++++++++ gcc/testsuite/gcc.dg/lto/20100423-1_0.c | 11 ++++++++++ gcc/testsuite/gcc.dg/lto/20100423-1_1.c | 7 ++++++ gcc/testsuite/gcc.dg/lto/20100430-1_0.c | 14 ++++++++++++ gcc/tree-inline.c | 12 +++++++++-- gcc/tree.c | 10 +++++++-- 12 files changed, 182 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/g++.dg/lto/20100423-1_0.C create mode 100644 gcc/testsuite/g++.dg/lto/20100423-2_0.C create mode 100644 gcc/testsuite/g++.dg/lto/20100423-3_0.C create mode 100644 gcc/testsuite/gcc.dg/lto/20100423-1_0.c create mode 100644 gcc/testsuite/gcc.dg/lto/20100423-1_1.c create mode 100644 gcc/testsuite/gcc.dg/lto/20100430-1_0.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 28e2c86446d..e706a1e317f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,37 @@ +2010-05-19 Richard Guenther + + Backport from mainline: + 2010-04-26 Richard Guenther + + PR lto/43455 + * tree-inline.c (tree_can_inline_p): Also check compatibility + of return types. + + 2010-04-23 Richard Guenther + + PR lto/42653 + * tree.c (free_lang_data_in_decl): Do not reset DECL_CONTEXT + of FUNCTION_DECLs. + + 2010-04-26 Richard Guenther + + PR lto/42425 + * tree.c (free_lang_data_in_type): Do not free TYPE_CONTEXT + if emitting debug information and it is either a function + or a namespace decl. + + 2010-04-26 Richard Guenther + + PR lto/43080 + * gimple.c (gimple_decl_printable_name): Deal gracefully + with a NULL DECL_NAME. + + 2010-04-30 Richard Guenther + + PR lto/43946 + * passes.c (init_optimization_passes): Move pass_ipa_free_lang_data + first after all lowering passes. + 2010-05-18 Steven Bosscher PR lto/44184 diff --git a/gcc/gimple.c b/gcc/gimple.c index 9c9a9ab7dad..e055f885e2e 100644 --- a/gcc/gimple.c +++ b/gcc/gimple.c @@ -4563,7 +4563,8 @@ gimple_ior_addresses_taken (bitmap addresses_taken, gimple stmt) const char * gimple_decl_printable_name (tree decl, int verbosity) { - gcc_assert (decl && DECL_NAME (decl)); + if (!DECL_NAME (decl)) + return NULL; if (DECL_ASSEMBLER_NAME_SET_P (decl)) { diff --git a/gcc/passes.c b/gcc/passes.c index 33d52affc77..a3fa1f90c70 100644 --- a/gcc/passes.c +++ b/gcc/passes.c @@ -742,6 +742,7 @@ init_optimization_passes (void) /* Interprocedural optimization passes. */ p = &all_small_ipa_passes; + NEXT_PASS (pass_ipa_free_lang_data); NEXT_PASS (pass_ipa_function_and_variable_visibility); NEXT_PASS (pass_ipa_early_inline); { @@ -750,7 +751,6 @@ init_optimization_passes (void) NEXT_PASS (pass_inline_parameters); NEXT_PASS (pass_rebuild_cgraph_edges); } - NEXT_PASS (pass_ipa_free_lang_data); NEXT_PASS (pass_early_local_passes); { struct opt_pass **p = &pass_early_local_passes.pass.sub; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 942fe79ade5..a4bd72ec3cf 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,32 @@ +2010-05-19 Richard Guenther + + Backport from mainline + 2010-04-26 Richard Guenther + + PR lto/43455 + * gcc.dg/lto/20100423-1_0.c: New testcase. + * gcc.dg/lto/20100423-1_1.c: Likewise. + + 2010-04-23 Richard Guenther + + PR lto/42653 + * g++.dg/lto/20100423-1_0.C: New testcase. + + 2010-04-26 Richard Guenther + + PR lto/42425 + * g++.dg/lto/20100423-2_0.C: New testcase. + + 2010-04-26 Richard Guenther + + PR lto/43080 + * g++.dg/lto/20100423-3_0.C: New testcase. + + 2010-04-30 Richard Guenther + + PR lto/43946 + * gcc.dg/lto/20100430-1_0.c: New testcase. + 2010-05-19 Tobias Burnus PR fortran/43591 diff --git a/gcc/testsuite/g++.dg/lto/20100423-1_0.C b/gcc/testsuite/g++.dg/lto/20100423-1_0.C new file mode 100644 index 00000000000..f6a741dad8a --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20100423-1_0.C @@ -0,0 +1,38 @@ +// { dg-lto-do assemble } +// { dg-lto-options {{-g -flto}} } + +namespace llvm +{ + class Function; + class MachineCodeInfo; + class ExecutionEngine + { + }; + class JIT : public ExecutionEngine + { + void runJITOnFunction (Function * F, MachineCodeInfo * MCI = 0); + }; + class JITEventListener + { + public: + JITEventListener () + { + } + virtual ~JITEventListener (); + }; +} + +using namespace llvm; +void +JIT::runJITOnFunction (Function * F, MachineCodeInfo * MCI) +{ + class MCIListener:public JITEventListener + { + MachineCodeInfo *const MCI; + public: + MCIListener (MachineCodeInfo * mci):MCI (mci) + { + } + }; +} + diff --git a/gcc/testsuite/g++.dg/lto/20100423-2_0.C b/gcc/testsuite/g++.dg/lto/20100423-2_0.C new file mode 100644 index 00000000000..2ab6bdc56ef --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20100423-2_0.C @@ -0,0 +1,14 @@ +// { dg-lto-do assemble } +// { dg-lto-options {{-flto -g}} } + +struct A +{ + virtual ~A(); +}; + +void foo() +{ + struct B : A {}; + B b; +} + diff --git a/gcc/testsuite/g++.dg/lto/20100423-3_0.C b/gcc/testsuite/g++.dg/lto/20100423-3_0.C new file mode 100644 index 00000000000..49564a586b4 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20100423-3_0.C @@ -0,0 +1,14 @@ +// { dg-lto-do assemble } +// { dg-lto-options {{-flto -g}} } + +inline int foo() +{ + static union { int i; }; + return i; +} + +void bar() +{ + foo(); +} + diff --git a/gcc/testsuite/gcc.dg/lto/20100423-1_0.c b/gcc/testsuite/gcc.dg/lto/20100423-1_0.c new file mode 100644 index 00000000000..58456d43b69 --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/20100423-1_0.c @@ -0,0 +1,11 @@ +/* { dg-lto-do run } */ +/* { dg-lto-options {{-O2 -flto}} } */ + +struct bar {int x;}; +extern struct bar foo(void); +int main() +{ + struct bar x=foo(); + return 0; +} + diff --git a/gcc/testsuite/gcc.dg/lto/20100423-1_1.c b/gcc/testsuite/gcc.dg/lto/20100423-1_1.c new file mode 100644 index 00000000000..8b159d2cb6f --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/20100423-1_1.c @@ -0,0 +1,7 @@ +typedef struct{int x;} bar; +bar foo (void) +{ + bar x; + return x; +} + diff --git a/gcc/testsuite/gcc.dg/lto/20100430-1_0.c b/gcc/testsuite/gcc.dg/lto/20100430-1_0.c new file mode 100644 index 00000000000..d2e79c62914 --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/20100430-1_0.c @@ -0,0 +1,14 @@ +/* { dg-lto-do link } */ +/* { dg-lto-options {{-O2 -fprofile-arcs -flto -r -nostdlib}} } */ + +void +expand_stmt_with_iterators_1 (void) +{ + extern void expand_expr_stmt (void); + expand_expr_stmt (); +} +void +iterator_expand (void) +{ + expand_stmt_with_iterators_1 (); +} diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 6369fd036e8..d7c7991fbee 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -5079,7 +5079,7 @@ tree_can_inline_p (struct cgraph_edge *e) return false; } #endif - tree caller, callee; + tree caller, callee, lhs; caller = e->caller->decl; callee = e->callee->decl; @@ -5105,8 +5105,16 @@ tree_can_inline_p (struct cgraph_edge *e) return false; } + /* Do not inline calls where we cannot triviall work around mismatches + in argument or return types. */ if (e->call_stmt - && !gimple_check_call_args (e->call_stmt)) + && ((DECL_RESULT (callee) + && !DECL_BY_REFERENCE (DECL_RESULT (callee)) + && (lhs = gimple_call_lhs (e->call_stmt)) != NULL_TREE + && !useless_type_conversion_p (TREE_TYPE (DECL_RESULT (callee)), + TREE_TYPE (lhs)) + && !fold_convertible_p (TREE_TYPE (DECL_RESULT (callee)), lhs)) + || !gimple_check_call_args (e->call_stmt))) { e->inline_failed = CIF_MISMATCHED_ARGUMENTS; gimple_call_set_cannot_inline (e->call_stmt, true); diff --git a/gcc/tree.c b/gcc/tree.c index 648e2148ad0..ad0b7a72579 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -4265,7 +4265,12 @@ free_lang_data_in_type (tree type) TYPE_LANG_SLOT_1 (type) = NULL_TREE; } - TYPE_CONTEXT (type) = NULL_TREE; + if (debug_info_level < DINFO_LEVEL_TERSE + || (TYPE_CONTEXT (type) + && TREE_CODE (TYPE_CONTEXT (type)) != FUNCTION_DECL + && TREE_CODE (TYPE_CONTEXT (type)) != NAMESPACE_DECL)) + TYPE_CONTEXT (type) = NULL_TREE; + if (debug_info_level < DINFO_LEVEL_TERSE) TYPE_STUB_DECL (type) = NULL_TREE; } @@ -4368,7 +4373,8 @@ free_lang_data_in_decl (tree decl) /* Ignore any intervening types, because we are going to clear their TYPE_CONTEXT fields. */ - if (TREE_CODE (decl) != FIELD_DECL) + if (TREE_CODE (decl) != FIELD_DECL + && TREE_CODE (decl) != FUNCTION_DECL) DECL_CONTEXT (decl) = decl_function_context (decl); if (DECL_CONTEXT (decl) -- 2.11.4.GIT