aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2008-09-06 19:10:00 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2008-09-06 17:10:00 +0000
commitb91bc3493e27d85f69ec4374db5b50656974573f (patch)
tree3bfbb5a00dd14576ae24698df640f819605cdc0d /gcc
parent7a687b22659e54dfc9a6354b08b850d63bfd14c0 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/passes.c1
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/tree-ssa/pr14703.C49
-rw-r--r--gcc/tree-ssa-live.c7
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