diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 59eaf4862563bdd7019f005684afc473126cbbee..8c480bb0e9fb6fea16ca69c38951d17c7ab257ae 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,6 +1,11 @@
 2013-02-05  Jan Hubicka  <jh@suse.cz>
 
-	PR tree-optimization/r55789
+	PR tree-optimization/55789
+	* params.def (PARAM_EARLY_INLINER_MAX_ITERATIONS): Drop to 1.
+
+2013-02-05  Jan Hubicka  <jh@suse.cz>
+
+	PR tree-optimization/55789
 	* cgraphclones.c (cgraph_remove_node_and_inline_clones): Remove
 	the dead call anyway.
 
diff --git a/gcc/params.def b/gcc/params.def
index 055b45ab164e18880a79aba34d4c400014e41070..97d485745874f80977151bfe824cb6bc93ca3ed6 100644
--- a/gcc/params.def
+++ b/gcc/params.def
@@ -109,7 +109,7 @@ DEFPARAM (PARAM_MIN_INLINE_RECURSIVE_PROBABILITY,
 DEFPARAM (PARAM_EARLY_INLINER_MAX_ITERATIONS,
 	  "max-early-inliner-iterations",
 	  "The maximum number of nested indirect inlining performed by early inliner",
-	  10, 0, 0)
+	  1, 0, 0)
 
 /* Limit on probability of entry BB.  */
 DEFPARAM (PARAM_COMDAT_SHARING_PROBABILITY,
diff --git a/gcc/testsuite/g++.dg/ipa/inline-1.C b/gcc/testsuite/g++.dg/ipa/inline-1.C
new file mode 100644
index 0000000000000000000000000000000000000000..b3dee080be29fb88f91e4249ec855e0c3189db3e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ipa/inline-1.C
@@ -0,0 +1,36 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-ipa-inline --param max-early-inliner-iterations=1" } */
+/* { dg-add-options bind_pic_locally } */
+
+namespace std {
+  extern "C" void puts(const char *s);
+}
+
+template <class T, class E> void
+foreach (T b, T e, void (*ptr)(E))
+{
+  for (; b != e; b++)
+    ptr(*b);
+}
+
+void
+inline_me (char *x)
+{
+  std::puts(x);
+}
+
+static void
+inline_me_too (char *x)
+{
+  std::puts(x);
+}
+
+int main(int argc, char **argv)
+{
+  foreach (argv, argv + argc, inline_me);
+  foreach (argv, argv + argc, inline_me_too);
+}
+
+/* { dg-final { scan-tree-dump-times "Considering void inline_me\\(" 1 "inline"} } */
+/* { dg-final { scan-tree-dump-times "Considering void inline_me_too\\(" 1 "inline"} } */
+/* { dg-final { cleanup-tree-dump "einline" } } */
diff --git a/gcc/testsuite/g++.dg/ipa/inline-2.C b/gcc/testsuite/g++.dg/ipa/inline-2.C
new file mode 100644
index 0000000000000000000000000000000000000000..fd284a1e23dc04bbfd38f9ee42edb0518c47e1d6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ipa/inline-2.C
@@ -0,0 +1,36 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-ipa-inline --param max-early-inliner-iterations=1" } */
+/* { dg-add-options bind_pic_locally } */
+
+namespace std {
+  extern "C" void puts(const char *s);
+}
+
+template <class T, class E> void
+foreach (T b, T e, E ptr)
+{
+  for (; b != e; b++)
+    ptr(*b);
+}
+
+void
+inline_me (char *x)
+{
+  std::puts(x);
+}
+
+static void
+inline_me_too (char *x)
+{
+  std::puts(x);
+}
+
+int main(int argc, char **argv)
+{
+  foreach (argv, argv + argc, inline_me);
+  foreach (argv, argv + argc, inline_me_too);
+}
+
+/* { dg-final { scan-ipa-dump-times "Considering void inline_me\\(" 1 "inline"} } */
+/* { dg-final { scan-ipa-dump-times "Considering void inline_me_too\\(" 1 "inline"} } */
+/* { dg-final { cleanup-ipa-dump "inline" } } */
diff --git a/gcc/testsuite/g++.dg/ipa/inline-3.C b/gcc/testsuite/g++.dg/ipa/inline-3.C
new file mode 100644
index 0000000000000000000000000000000000000000..602b140971b4436cfb004fccfd6661b5ffd7e2b4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ipa/inline-3.C
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-ipa-inline --param max-early-inliner-iterations=1" } */
+/* { dg-add-options bind_pic_locally } */
+
+#include <algorithm>
+
+void foo(const char *s);
+
+void
+inline_me (char *x)
+{
+  foo(x);
+}
+
+static void
+inline_me_too (char *x)
+{
+  foo(x);
+}
+
+int main(int argc, char **argv)
+{
+  std::for_each (argv, argv + argc, inline_me);
+  std::for_each (argv, argv + argc, inline_me_too);
+}
+
+/* { dg-final { scan-ipa-dump-times "Considering void inline_me\\(" 1 "inline"} } */
+/* { dg-final { scan-ipa-dump-times "Considering void inline_me_too\\(" 1 "inline"} } */
+/* { dg-final { cleanup-tree-dump "inline" } } */
diff --git a/gcc/testsuite/g++.dg/tree-ssa/inline-1.C b/gcc/testsuite/g++.dg/tree-ssa/inline-1.C
index 95b7d0609e96c39296b33bf0ee48ec7a850ee2bc..d8682bec117143c495f48806232291b8990c8a1b 100644
--- a/gcc/testsuite/g++.dg/tree-ssa/inline-1.C
+++ b/gcc/testsuite/g++.dg/tree-ssa/inline-1.C
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-einline" } */
+/* { dg-options "-O2 -fdump-tree-einline --param max-early-inliner-iterations=3" } */
 /* { dg-add-options bind_pic_locally } */
 
 namespace std {
diff --git a/gcc/testsuite/g++.dg/tree-ssa/inline-2.C b/gcc/testsuite/g++.dg/tree-ssa/inline-2.C
index 656cba0312c907475886145e30869e21071106a1..4c8a6265d6faef67e164fece76ed348785eeb805 100644
--- a/gcc/testsuite/g++.dg/tree-ssa/inline-2.C
+++ b/gcc/testsuite/g++.dg/tree-ssa/inline-2.C
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-einline" } */
+/* { dg-options "-O2 -fdump-tree-einline --param max-early-inliner-iterations=3" } */
 /* { dg-add-options bind_pic_locally } */
 
 namespace std {
diff --git a/gcc/testsuite/g++.dg/tree-ssa/inline-3.C b/gcc/testsuite/g++.dg/tree-ssa/inline-3.C
index f01f26cafa75d38d0ac1a594c0b9370df3d271e4..512f83dd07e7ba293701249ca7a3d6cb0d999481 100644
--- a/gcc/testsuite/g++.dg/tree-ssa/inline-3.C
+++ b/gcc/testsuite/g++.dg/tree-ssa/inline-3.C
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-einline" } */
+/* { dg-options "-O2 -fdump-tree-einline --param max-early-inliner-iterations=3" } */
 /* { dg-add-options bind_pic_locally } */
 
 #include <algorithm>