From 8b75fc9ba6acfe2e950442b0e0d03d20c3ac7c5b Mon Sep 17 00:00:00 2001 From: Martin Jambor Date: Mon, 18 May 2009 01:33:35 +0200 Subject: [PATCH] ipa-prop.c (ipa_check_stmt_modifications): Removed. 2009-05-18 Martin Jambor * 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. * testsuite/gcc.dg/ipa/modif-1.c: Do not check for unmodified int parameter. From-SVN: r147645 --- gcc/ChangeLog | 10 ++++ gcc/ipa-prop.c | 78 ++++++++++-------------------- gcc/testsuite/ChangeLog | 4 ++ gcc/testsuite/gcc.dg/ipa/modif-1.c | 5 +- 4 files changed, 40 insertions(+), 57 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9b189f02057..1aa8d0114e6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2009-05-18 Martin Jambor + + * 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. + 2009-05-18 Eric Fisher * doc/tree-ssa.texi (SSA Operands): Fix a mistake. diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c index f4fa37d5a05..90889137208 100644 --- a/gcc/ipa-prop.c +++ b/gcc/ipa-prop.c @@ -172,48 +172,30 @@ ipa_initialize_node_params (struct cgraph_node *node) } } -/* 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 cgraph_node *node) 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; } @@ -482,7 +454,7 @@ determine_cst_member_ptr (gimple call, tree arg, tree method_field, 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); @@ -617,7 +589,7 @@ ipa_get_stmt_member_ptr_load_param (gimple stmt) { 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); @@ -797,7 +769,7 @@ ipa_analyze_call_uses (struct ipa_node_params *info, gimple call) 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; @@ -808,8 +780,8 @@ ipa_analyze_call_uses (struct ipa_node_params *info, gimple call) 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)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 883f041b45f..545fb82aacf 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2009-05-18 Martin Jambor + + * gcc.dg/ipa/modif-1.c: Do not check for unmodified int parameter. + 2009-05-17 H.J. Lu PR c/40172 diff --git a/gcc/testsuite/gcc.dg/ipa/modif-1.c b/gcc/testsuite/gcc.dg/ipa/modif-1.c index bc1706c5650..db6915a9d9e 100644 --- a/gcc/testsuite/gcc.dg/ipa/modif-1.c +++ b/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 whatever v, func2 (pw); func2 (&x); func3 (i); - func3 (j); func4 (pk); func4 (&l); } @@ -40,5 +38,4 @@ void the_test (struct whatever u, struct whatever v, /* { 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" } } */