PR ipa/65008
authormpolacek <mpolacek@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 26 Feb 2015 18:59:50 +0000 (18:59 +0000)
committermpolacek <mpolacek@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 26 Feb 2015 18:59:50 +0000 (18:59 +0000)
* ipa-inline.c (early_inliner): Recompute inline parameters.

* g++.dg/ipa/pr65008.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@221025 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/ipa-inline.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ipa/pr65008.C [new file with mode: 0644]

index f651903..4fa8ad6 100644 (file)
@@ -1,3 +1,8 @@
+2015-02-26  Marek Polacek  <polacek@redhat.com>
+
+       PR ipa/65008
+       * ipa-inline.c (early_inliner): Recompute inline parameters.
+
 2015-02-26  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
 
        PR target/65171
index 025f7fc..c445f0a 100644 (file)
@@ -2559,6 +2559,19 @@ early_inliner (function *fun)
        {
          timevar_push (TV_INTEGRATION);
          todo |= optimize_inline_calls (current_function_decl);
+         /* optimize_inline_calls call above might have introduced new
+            statements that don't have inline parameters computed.  */
+         for (edge = node->callees; edge; edge = edge->next_callee)
+           {
+             if (inline_edge_summary_vec.length () > (unsigned) edge->uid)
+               {
+                 struct inline_edge_summary *es = inline_edge_summary (edge);
+                 es->call_stmt_size
+                   = estimate_num_insns (edge->call_stmt, &eni_size_weights);
+                 es->call_stmt_time
+                   = estimate_num_insns (edge->call_stmt, &eni_time_weights);
+               }
+           }
          inline_update_overall_summary (node);
          inlined = false;
          timevar_pop (TV_INTEGRATION);
index c9789d9..be82a66 100644 (file)
@@ -1,3 +1,8 @@
+2015-02-26  Marek Polacek  <polacek@redhat.com>
+
+       PR ipa/65008
+       * g++.dg/ipa/pr65008.C: New test.
+
 2015-02-26  Tom de Vries  <tom@codesourcery.com>
 
        * lib/profopt.exp (profopt-target-cleanup): New proc.
diff --git a/gcc/testsuite/g++.dg/ipa/pr65008.C b/gcc/testsuite/g++.dg/ipa/pr65008.C
new file mode 100644 (file)
index 0000000..29b3a2f
--- /dev/null
@@ -0,0 +1,19 @@
+// PR ipa/65008
+// { dg-do compile }
+// { dg-options "-O2" }
+
+struct A
+{
+  A ();
+  virtual void foo () {}
+};
+
+static inline int __attribute__ ((always_inline)) call_foo (A *a)
+{
+  a->foo ();
+}
+
+A::A ()
+{
+  call_foo (this);
+}