This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PR tree-optimization/51680 (indirect inlining in templates)


Hi,
this patch fixes second part of problem in PR51680 and moves it out of regression land.
The PR is still valid about fact that we should inline process_fun_at even when it is
called many times because further inlining of add1 simplifies it enough. Unfortunately
I don't think this can be easilly done in 4.7 timeframe. For 4.8 we can use Maxim's code
to produce benefits for inliner to bypass the limits in such cases.

Bootstrapped/regtested x86_64-linux, comitted.
Honza

/* { dg-do compile } */
/* { dg-options "-O2 -fdump-ipa-inline"  } */
   extern void process (float);

   template<typename Fun, typename T>
   void process_fun_at (const Fun &fun, T x)
   {
     process (fun (x));
   }

   static float add1 (float x)
   {
     return x + 1;
   }

   void test (float i)
   {
     process_fun_at (add1, i);
   }
/* { dg-final { scan-ipa-dump-times "Inlined into" 2 "inline"  } } */
/* { dg-final { cleanup-ipa-dump "inline" } } */
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 182993)
+++ ChangeLog	(working copy)
@@ -1,5 +1,11 @@
 2012-01-08  Jan Hubicka  <jh@suse.cz>
 
+	PR tree-optimize/51680
+	* ipa-inline-analyss.c (evaluate_properties_for_edge): Fix conditoin on when
+	known_vals needs to be computed; cleanup.
+
+2012-01-08  Jan Hubicka  <jh@suse.cz>
+
 	PR tree-optimize/51694
 	* ipa-cp.c (ipa_get_indirect_edge_target): Add bounds checks.
 
Index: ipa-inline-analysis.c
===================================================================
--- ipa-inline-analysis.c	(revision 182992)
+++ ipa-inline-analysis.c	(working copy)
@@ -718,7 +718,7 @@ evaluate_properties_for_edge (struct cgr
 {
   struct cgraph_node *callee = cgraph_function_or_thunk_node (e->callee, NULL);
   struct inline_summary *info = inline_summary (callee);
-  int i;
+  VEC (tree, heap) *known_vals = NULL;
 
   if (clause_ptr)
     *clause_ptr = inline_p ? 0 : 1 << predicate_not_inlined_condition;
@@ -728,13 +728,13 @@ evaluate_properties_for_edge (struct cgr
     *known_binfos_ptr = NULL;
 
   if (ipa_node_params_vector
+      && !e->call_stmt_cannot_inline_p
       && ((clause_ptr && info->conds) || known_vals_ptr || known_binfos_ptr))
     {
       struct ipa_node_params *parms_info;
       struct ipa_edge_args *args = IPA_EDGE_REF (e);
       struct inline_edge_summary *es = inline_edge_summary (e);
       int i, count = ipa_get_cs_argument_count (args);
-      VEC (tree, heap) *known_vals = NULL;
 
       if (e->caller->global.inlined_to)
         parms_info = IPA_NODE_REF (e->caller->global.inlined_to);
@@ -752,9 +752,9 @@ evaluate_properties_for_edge (struct cgr
 					   ipa_get_ith_jump_func (args, i));
 	  if (cst)
 	    {
-	      if (info->conds && TREE_CODE (cst) != TREE_BINFO)
+	      if (known_vals && TREE_CODE (cst) != TREE_BINFO)
 		VEC_replace (tree, known_vals, i, cst);
-	      else if (known_binfos_ptr != NULL)
+	      else if (known_binfos_ptr != NULL && TREE_CODE (cst) == TREE_BINFO)
 		VEC_replace (tree, *known_binfos_ptr, i, cst);
 	    }
 	  else if (inline_p
@@ -763,20 +763,16 @@ evaluate_properties_for_edge (struct cgr
 				  i)->change_prob)
 	    VEC_replace (tree, known_vals, i, error_mark_node);
 	}
-
-      if (clause_ptr && info->conds)
-	*clause_ptr = evaluate_conditions_for_known_args (callee, inline_p,
-							  known_vals);
-
-      if (known_vals_ptr)
-	*known_vals_ptr = known_vals;
-      else
-	VEC_free (tree, heap, known_vals);
     }
 
-  if (clause_ptr && !info->conds)
-    for (i = 0; i < (int)VEC_length (condition, info->conds); i++)
-      *clause_ptr |= 1 << (i + predicate_first_dynamic_condition);
+  if (clause_ptr)
+    *clause_ptr = evaluate_conditions_for_known_args (callee, inline_p,
+						      known_vals);
+
+  if (known_vals_ptr)
+    *known_vals_ptr = known_vals;
+  else
+    VEC_free (tree, heap, known_vals);
 }
 
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]