This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH, trunk, pretty-ipa] Minor ipa-prop.c cleanups
- From: Martin Jambor <mjambor at suse dot cz>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Cc: Jan Hubicka <hubicka at ucw dot cz>
- Date: Wed, 13 May 2009 11:09:01 +0200
- Subject: [PATCH, trunk, pretty-ipa] Minor ipa-prop.c cleanups
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.
Index: icln/gcc/ipa-prop.c
===================================================================
--- icln.orig/gcc/ipa-prop.c
+++ icln/gcc/ipa-prop.c
@@ -172,48 +172,31 @@ 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. */
+ ASM_EXPR in the function. 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 +205,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 +471,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 +610,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 +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)
|| gimple_assign_rhs_code (def) != BIT_AND_EXPR
|| !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)
{
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" } } */
2009-05-12 Martin Jambor <mjambor@suse.cz>
* ipa-prop.c (get_ssa_def_if_simple): Use while loop rather than an if,
use gimple_assign_single_p.
Index: icln/gcc/ipa-prop.c
===================================================================
--- icln.orig/gcc/ipa-prop.c
+++ icln/gcc/ipa-prop.c
@@ -434,11 +434,11 @@ fill_member_ptr_cst_jump_function (struc
static inline tree
get_ssa_def_if_simple (tree rhs)
{
- if (TREE_CODE (rhs) == SSA_NAME && !SSA_NAME_IS_DEFAULT_DEF (rhs))
+ while (TREE_CODE (rhs) == SSA_NAME && !SSA_NAME_IS_DEFAULT_DEF (rhs))
{
gimple def_stmt = SSA_NAME_DEF_STMT (rhs);
- if (is_gimple_assign (def_stmt) && gimple_num_ops (def_stmt) == 2)
+ if (gimple_assign_single_p (def_stmt))
rhs = gimple_assign_rhs1 (def_stmt);
}
return rhs;