From: Richard Earnshaw Date: Fri, 31 Jul 2009 21:56:28 +0000 (+0000) Subject: re PR tree-optimization/40914 (ipa_analyze_call_uses fails to handle ptrmemfunc_vbit_... X-Git-Tag: releases/gcc-4.5.0~4228 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6f7b8b706765f7277f9f99e947eeb114eb203b50;p=thirdparty%2Fgcc.git re PR tree-optimization/40914 (ipa_analyze_call_uses fails to handle ptrmemfunc_vbit_in_delta) PR tree-optimization/40914 * ipa-prop.c (ipa_get_ptr_load_param): New argument use_delta, if set, then check the delta field of the PMF record. (ipa_get_stmt_member_ptr_load_param): Propagate new param use_delta. (ipa_analyze_call_uses): Handle machines where the vbit for a PMF call is stored in the delta. From-SVN: r150319 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 17a3e969c9fc..411ccdd5bdac 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2009-07-31 Richard Earnshaw + + PR tree-optimization/40914 + * ipa-prop.c (ipa_get_ptr_load_param): New argument use_delta, + if set, then check the delta field of the PMF record. + (ipa_get_stmt_member_ptr_load_param): Propagate new param use_delta. + (ipa_analyze_call_uses): Handle machines where the vbit for a PMF + call is stored in the delta. + 2009-07-31 Adam Nemet * config/mips/mips.md (*clear_upper32_dext): New pattern. diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c index 1a7003295a2c..8308aa36f8f1 100644 --- a/gcc/ipa-prop.c +++ b/gcc/ipa-prop.c @@ -585,25 +585,28 @@ ipa_compute_jump_functions (struct cgraph_edge *cs) compute_cst_member_ptr_arguments (arguments->jump_functions, call); } -/* If RHS looks like a rhs of a statement loading pfn from a member pointer - formal parameter, return the parameter, otherwise return NULL. */ +/* If RHS looks like a rhs of a statement loading pfn from a member + pointer formal parameter, return the parameter, otherwise return + NULL. If USE_DELTA, then we look for a use of the delta field + rather than the pfn. */ static tree -ipa_get_member_ptr_load_param (tree rhs) +ipa_get_member_ptr_load_param (tree rhs, bool use_delta) { tree rec, fld; tree ptr_field; + tree delta_field; if (TREE_CODE (rhs) != COMPONENT_REF) return NULL_TREE; rec = TREE_OPERAND (rhs, 0); if (TREE_CODE (rec) != PARM_DECL - || !type_like_member_ptr_p (TREE_TYPE (rec), &ptr_field, NULL)) + || !type_like_member_ptr_p (TREE_TYPE (rec), &ptr_field, &delta_field)) return NULL_TREE; fld = TREE_OPERAND (rhs, 1); - if (fld == ptr_field) + if (use_delta ? (fld == delta_field) : (fld == ptr_field)) return rec; else return NULL_TREE; @@ -613,7 +616,7 @@ ipa_get_member_ptr_load_param (tree rhs) parameter, this function returns that parameter. */ static tree -ipa_get_stmt_member_ptr_load_param (gimple stmt) +ipa_get_stmt_member_ptr_load_param (gimple stmt, bool use_delta) { tree rhs; @@ -621,7 +624,7 @@ ipa_get_stmt_member_ptr_load_param (gimple stmt) return NULL_TREE; rhs = gimple_assign_rhs1 (stmt); - return ipa_get_member_ptr_load_param (rhs); + return ipa_get_member_ptr_load_param (rhs, use_delta); } /* Returns true iff T is an SSA_NAME defined by a statement. */ @@ -756,15 +759,15 @@ ipa_analyze_call_uses (struct ipa_node_params *info, gimple call) d1 = SSA_NAME_DEF_STMT (n1); d2 = SSA_NAME_DEF_STMT (n2); - if ((rec = ipa_get_stmt_member_ptr_load_param (d1))) + if ((rec = ipa_get_stmt_member_ptr_load_param (d1, false))) { - if (ipa_get_stmt_member_ptr_load_param (d2)) + if (ipa_get_stmt_member_ptr_load_param (d2, false)) return; bb = gimple_bb (d1); virt_bb = gimple_bb (d2); } - else if ((rec = ipa_get_stmt_member_ptr_load_param (d2))) + else if ((rec = ipa_get_stmt_member_ptr_load_param (d2, false))) { bb = gimple_bb (d2); virt_bb = gimple_bb (d1); @@ -817,7 +820,10 @@ ipa_analyze_call_uses (struct ipa_node_params *info, gimple call) def = SSA_NAME_DEF_STMT (cond); } - rec2 = ipa_get_stmt_member_ptr_load_param (def); + rec2 = ipa_get_stmt_member_ptr_load_param (def, + (TARGET_PTRMEMFUNC_VBIT_LOCATION + == ptrmemfunc_vbit_in_delta)); + if (rec != rec2) return;