diff options
author | Jan Hubicka <jh@suse.cz> | 2008-09-06 19:10:00 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2008-09-06 17:10:00 +0000 |
commit | b91bc3493e27d85f69ec4374db5b50656974573f (patch) | |
tree | 3bfbb5a00dd14576ae24698df640f819605cdc0d /gcc | |
parent | 7a687b22659e54dfc9a6354b08b850d63bfd14c0 (diff) | |
download | gcc-b91bc3493e27d85f69ec4374db5b50656974573f.zip gcc-b91bc3493e27d85f69ec4374db5b50656974573f.tar.gz gcc-b91bc3493e27d85f69ec4374db5b50656974573f.tar.bz2 |
re PR tree-optimization/14703 (Inadequate optimization of inline templated functions, infinite loop in ipa-reference and memory hog)
PR tree-optimization/14703
* tree-ssa-live.c (remove_unused_scope_block_p): Remove ignored declarations.
* passes.c (init_optimization_passes): Recompute inline parameters.
* g++.dg/tree-ssa-pr14703.C: New testcase.
From-SVN: r140068
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/passes.c | 1 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/tree-ssa/pr14703.C | 49 | ||||
-rw-r--r-- | gcc/tree-ssa-live.c | 7 |
5 files changed, 67 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f3a30d97..ead7b5a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2008-09-06 Jan Hubicka <jh@suse.cz> + + PR tree-optimization/14703 + * tree-ssa-live.c (remove_unused_scope_block_p): Remove ignored declarations. + * passes.c (init_optimization_passes): Recompute inline parameters. + 2008-09-06 Richard Sandiford <rdsandiford@googlemail.com> * config/mips/mips.c (mips_function_ok_for_sibcall): Check for diff --git a/gcc/passes.c b/gcc/passes.c index 36c107e..69d484b 100644 --- a/gcc/passes.c +++ b/gcc/passes.c @@ -565,6 +565,7 @@ init_optimization_passes (void) } NEXT_PASS (pass_release_ssa_names); NEXT_PASS (pass_rebuild_cgraph_edges); + NEXT_PASS (pass_inline_parameters); } NEXT_PASS (pass_ipa_increase_alignment); NEXT_PASS (pass_ipa_matrix_reorg); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index aaeb46c..3185f30 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2008-09-06 Jan Hubicka <jh@suse.cz> + + * g++.dg/tree-ssa-pr14703.C: New testcase. + 2008-09-06 Tobias Burnus <burnus@net-b.de> PR fortran/36153 diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr14703.C b/gcc/testsuite/g++.dg/tree-ssa/pr14703.C new file mode 100644 index 0000000..5870527 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr14703.C @@ -0,0 +1,49 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized -fno-ipa-reference" } */ +#include <iostream> + +namespace { +template <unsigned long long L> class fib { + public: + static const unsigned long long value = fib<L - 1>::value + fib<L - 2>::value; +}; + +template <> class fib<0> { + public: + static const unsigned long long value = 1; +}; + +template <> class fib<1> { + public: + static const unsigned long long value = 1; +}; + +template<unsigned long long L> inline unsigned long long fibconst() +{ + return fibconst<L - 1>() + fibconst<L - 2>(); +} + +template <> inline unsigned long long fibconst<0>() +{ + return 1ull; +} + +template <> inline unsigned long long fibconst<1>() +{ + return 1ull; +} + +template <> inline unsigned long long fibconst<2>() +{ + return 2ull; +} + +} + +int main() +{ + ::std::cerr << "fib<90>::value == " << fib<90>::value << "\n"; + ::std::cerr << "fibcst<90>() == " << fibconst<90>() << "\n"; +} +// { dg-final { scan-tree-dump-not "fibconst" "optimized" } } +// { dg-final { cleanup-tree-dump "optimized" } } diff --git a/gcc/tree-ssa-live.c b/gcc/tree-ssa-live.c index fa3834d..859c0c7 100644 --- a/gcc/tree-ssa-live.c +++ b/gcc/tree-ssa-live.c @@ -489,6 +489,13 @@ remove_unused_scope_block_p (tree scope) if (TREE_CODE (*t) == FUNCTION_DECL) unused = false; + /* Remove everything we don't generate debug info for. */ + else if (DECL_IGNORED_P (*t)) + { + *t = TREE_CHAIN (*t); + next = t; + } + /* When we are outputting debug info, we usually want to output info about optimized-out variables in the scope blocks. Exception are the scope blocks not containing any instructions |