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]

Re: [PATCH, trunk, pretty-ipa] Minor ipa-prop.c cleanups


Hi, 

On Wed, May 13, 2009 at 11:49:59AM +0200, Richard Guenther wrote:
> 2009/5/13 Martin Jambor <mjambor@suse.cz>:
> > Hi,
> >
> > the following two patches cleanup ipa-prop.c a bit.  The first one
> > makes parameter modification detection use
> > walk_stmt_load_store_addr_ops and makes file use mor appropriate
> > gimple access functions.  I'd like to commit this to both trunk and
> > pretty-ipa.
> >
> > It makes modification analysis explicitely not work on parameters that
> > have SSA_NAMES but this analysis was always intended for aggregates
> > only (in fact, ATM it is used only for C++ member pointers).  In order
> > to reflect this I have changed a testcase.
> >
> > The second patch is also a cleanup of the same sort but applies only
> > to pretty-ipa at the moment.
> >
> > I bootstrapped and tested the first patch on x86-64-linux (trunk
> > rev. 147391, pretty-ipa rev. 147391).  So, OK for both?
> >
> > Thanks,
> >
> > Martin
> >
> >
> >
> > 2009-05-12  Martin Jambor  <mjambor@suse.cz>
> >
> >        * ipa-prop.c (ipa_check_stmt_modifications): Removed.
> >        (visit_store_addr_for_mod_analysis): New function.
> >        (ipa_detect_param_modifications): Use walk_stmt_load_store_addr_ops.
> >        (determine_cst_member_ptr): Use gimple_assign_single_p.
> >        (ipa_get_stmt_member_ptr_load_param): Use gimple_assign_single_p.
> >        (ipa_analyze_call_uses): Use !gimple_assign_rhs2 rather than number of
> >        operands.  Don't check number of operands of a NOP_EXPR.
> >
> >
> >


> > @@ -817,7 +790,7 @@ ipa_analyze_call_uses (struct ipa_node_p
> >     return;
> >
> >   def = SSA_NAME_DEF_STMT (cond);
> > -  if (!is_gimple_assign (def) || gimple_num_ops (def) != 3
> > +  if (!is_gimple_assign (def) || !gimple_assign_rhs2 (def)
> 
> !is_gimple_assign (def)
> || gimple_assign_rhs_class (def) != GIMPLE_BINARY_RHS
> 
> (or, if you like, add gimple_assign_binary_p to gimple.[ch] similar to
> gimple_assign_single_p)
> 
> >       || gimple_assign_rhs_code (def) != BIT_AND_EXPR
> 
> Note that with this checking rhs2 for non-NULL or the rhs class for
> GIMPLE_BINARY_RHS is redundant - simply checking is_gimple_assign
> before is enough.
> 
> >       || !integer_onep (gimple_assign_rhs2 (def)))
> >     return;
> > @@ -828,8 +801,7 @@ ipa_analyze_call_uses (struct ipa_node_p
> >
> >   def = SSA_NAME_DEF_STMT (cond);
> >
> > -  if (is_gimple_assign (def) && gimple_num_ops (def) == 2
> > -      && gimple_assign_rhs_code (def) == NOP_EXPR)
> > +  if (is_gimple_assign (def) && gimple_assign_rhs_code (def) == NOP_EXPR)
> 
> && CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def))
> 
> instead of checking for NOP_EXPR.
> 
> Both patches are ok with these changes.

OK, I have just committed the  patch below to trunk as revision 147645
(after a re-bootstrap and re-testing)  and to also pretty-ipa with the
second patch unchanged as revision  147646 (also after a new bootstrap
and testing).

Thanks,

Martin

2009-05-18  Martin Jambor  <mjambor@suse.cz>

	* ipa-prop.c (ipa_check_stmt_modifications): Removed.
	(visit_store_addr_for_mod_analysis): New function.
	(ipa_detect_param_modifications): Use walk_stmt_load_store_addr_ops.
	(determine_cst_member_ptr): Use gimple_assign_single_p.
	(ipa_get_stmt_member_ptr_load_param): Use gimple_assign_single_p.
	(ipa_analyze_call_uses): Use !gimple_assign_rhs2 rather than number of
	operands.  Don't check number of operands of a NOP_EXPR.



Index: icln/gcc/ipa-prop.c
===================================================================
--- icln.orig/gcc/ipa-prop.c
+++ icln/gcc/ipa-prop.c
@@ -172,48 +172,30 @@ ipa_initialize_node_params (struct cgrap
     }
 }
 
-/* Check STMT to detect whether a formal parameter is directly modified within
-   STMT, the appropriate entry is updated in the modified flags of INFO.
-   Directly means that this function does not check for modifications through
-   pointers or escaping addresses because all TREE_ADDRESSABLE parameters are
-   considered modified anyway.  */
+/* Callback of walk_stmt_load_store_addr_ops for the visit_store and visit_addr
+   parameters.  If OP is a parameter declaration, mark it as modified in the
+   info structure passed in DATA.  */
 
-static void
-ipa_check_stmt_modifications (struct ipa_node_params *info, gimple stmt)
+static bool
+visit_store_addr_for_mod_analysis (gimple stmt ATTRIBUTE_UNUSED,
+				   tree op, void *data)
 {
-  int j;
-  int index;
-  tree lhs;
+  struct ipa_node_params *info = (struct ipa_node_params *) data;
 
-  switch (gimple_code (stmt))
+  if (TREE_CODE (op) == PARM_DECL)
     {
-    case GIMPLE_ASSIGN:
-      lhs = gimple_assign_lhs (stmt);
-
-      while (handled_component_p (lhs))
-	lhs = TREE_OPERAND (lhs, 0);
-      if (TREE_CODE (lhs) == SSA_NAME)
-	lhs = SSA_NAME_VAR (lhs);
-      index = ipa_get_param_decl_index (info, lhs);
-      if (index >= 0)
-	info->params[index].modified = true;
-      break;
-
-    case GIMPLE_ASM:
-      /* Asm code could modify any of the parameters.  */
-      for (j = 0; j < ipa_get_param_count (info); j++)
-	info->params[j].modified = true;
-      break;
-
-    default:
-      break;
+      int index = ipa_get_param_decl_index (info, op);
+      gcc_assert (index >= 0);
+      info->params[index].modified = true;
     }
+
+  return false;
 }
 
 /* Compute which formal parameters of function associated with NODE are locally
-   modified.  Parameters may be modified in NODE if they are TREE_ADDRESSABLE,
-   if they appear on the left hand side of an assignment or if there is an
-   ASM_EXPR in the function.  */
+   modified or their address is taken.  Note that this does not apply on
+   parameters with SSA names but those can and should be analyzed
+   differently.  */
 
 void
 ipa_detect_param_modifications (struct cgraph_node *node)
@@ -222,27 +204,17 @@ ipa_detect_param_modifications (struct c
   basic_block bb;
   struct function *func;
   gimple_stmt_iterator gsi;
-  gimple stmt;
   struct ipa_node_params *info = IPA_NODE_REF (node);
-  int i, count;
 
   if (ipa_get_param_count (info) == 0 || info->modification_analysis_done)
     return;
 
   func = DECL_STRUCT_FUNCTION (decl);
   FOR_EACH_BB_FN (bb, func)
-    {
-      for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
-	{
-	  stmt = gsi_stmt (gsi);
-	  ipa_check_stmt_modifications (info, stmt);
-	}
-    }
-
-  count = ipa_get_param_count (info);
-  for (i = 0; i < count; i++)
-    if (TREE_ADDRESSABLE (ipa_get_param (info, i)))
-      info->params[i].modified = true;
+    for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
+      walk_stmt_load_store_addr_ops (gsi_stmt (gsi), info, NULL,
+				     visit_store_addr_for_mod_analysis,
+				     visit_store_addr_for_mod_analysis);
 
   info->modification_analysis_done = 1;
 }
@@ -498,7 +470,7 @@ determine_cst_member_ptr (gimple call, t
       gimple stmt = gsi_stmt (gsi);
       tree lhs, rhs, fld;
 
-      if (!is_gimple_assign (stmt) || gimple_num_ops (stmt) != 2)
+      if (!gimple_assign_single_p (stmt))
 	return;
 
       lhs = gimple_assign_lhs (stmt);
@@ -637,7 +609,7 @@ ipa_get_stmt_member_ptr_load_param (gimp
 {
   tree rhs;
 
-  if (!is_gimple_assign (stmt) || gimple_num_ops (stmt) != 2)
+  if (!gimple_assign_single_p (stmt))
     return NULL_TREE;
 
   rhs = gimple_assign_rhs1 (stmt);
@@ -817,7 +789,7 @@ ipa_analyze_call_uses (struct ipa_node_p
     return;
 
   def = SSA_NAME_DEF_STMT (cond);
-  if (!is_gimple_assign (def) || gimple_num_ops (def) != 3
+  if (!is_gimple_assign (def)
       || gimple_assign_rhs_code (def) != BIT_AND_EXPR
       || !integer_onep (gimple_assign_rhs2 (def)))
     return;
@@ -828,8 +800,8 @@ ipa_analyze_call_uses (struct ipa_node_p
 
   def = SSA_NAME_DEF_STMT (cond);
 
-  if (is_gimple_assign (def) && gimple_num_ops (def) == 2
-      && gimple_assign_rhs_code (def) == NOP_EXPR)
+  if (is_gimple_assign (def)
+      && CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def)))
     {
       cond = gimple_assign_rhs1 (def);
       if (!ipa_is_ssa_with_stmt_def (cond))
Index: icln/gcc/testsuite/gcc.dg/ipa/modif-1.c
===================================================================
--- icln.orig/gcc/testsuite/gcc.dg/ipa/modif-1.c
+++ icln/gcc/testsuite/gcc.dg/ipa/modif-1.c
@@ -15,12 +15,11 @@ void func4 (int *pi);
 
 void the_test (struct whatever u, struct whatever v,
 	       struct whatever w, struct whatever x,
-	       int i, int j, int k, int l)
+	       int i, int k, int l)
 {
   struct whatever *pw = &w;
   int *pk = &k;
 
-  j = l+3;
   v.first = 9;
 
   func1 (u);
@@ -28,7 +27,6 @@ void the_test (struct whatever u, struct
   func2 (pw);
   func2 (&x);
   func3 (i);
-  func3 (j);
   func4 (pk);
   func4 (&l);
 }
@@ -40,5 +38,4 @@ void the_test (struct whatever u, struct
 /* { dg-final { scan-ipa-dump-not "param 4\[^\\n\]*modified" "inline" } } */
 /* { dg-final { scan-ipa-dump "param 5\[^\\n\]*modified" "inline" } } */
 /* { dg-final { scan-ipa-dump "param 6\[^\\n\]*modified" "inline" } } */
-/* { dg-final { scan-ipa-dump "param 7\[^\\n\]*modified" "inline" } } */
 /* { dg-final { cleanup-ipa-dump "inline" } } */


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