summaryrefslogtreecommitdiff
path: root/gcc/ipa-prop.c
diff options
context:
space:
mode:
authorrearnsha <rearnsha@138bc75d-0d04-0410-961f-82ee72b054a4>2009-07-31 21:56:28 +0000
committerrearnsha <rearnsha@138bc75d-0d04-0410-961f-82ee72b054a4>2009-07-31 21:56:28 +0000
commit66cca8a06df7cad0a6752cd884e155f9c1cc7a02 (patch)
tree68f566bfb773dc970b4f8ea9e3051157d5ecacbd /gcc/ipa-prop.c
parent50e3523708a2388603c52ed6d11d9f455f17b5f6 (diff)
downloadgcc-66cca8a06df7cad0a6752cd884e155f9c1cc7a02.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@150319 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ipa-prop.c')
-rw-r--r--gcc/ipa-prop.c28
1 files changed, 17 insertions, 11 deletions
diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c
index 1a7003295a2..8308aa36f8f 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;