This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Fix three issues in ipa-prop
- From: Jan Hubicka <hubicka at ucw dot cz>
- To: Jan Hubicka <hubicka at ucw dot cz>, gcc-patches at gcc dot gnu dot org
- Date: Wed, 19 Feb 2014 08:43:37 +0100
- Subject: Re: Fix three issues in ipa-prop
- Authentication-results: sourceware.org; auth=none
- References: <20140217084040 dot GB27760 at kam dot mff dot cuni dot cz> <20140217131924 dot GA28561 at virgil dot suse>
Hi,
this is patch I ended up comitting. THere was one additional problem with
ICE when param_type happens to be VOID pointer.
* ipa-prop.h (ipa_ancestor_jf_data): Update ocmment.
* ipa-prop.c (ipa_set_jf_known_type): Return early when
not devirtualizing.
(ipa_set_ancestor_jf): Set type to NULL hwen it is not preserved;
do more sanity checks.
(detect_type_change): Return true when giving up early.
(compute_complex_assign_jump_func): Fix type parameter of
ipa_set_ancestor_jf.
(compute_complex_ancestor_jump_func): Likewise.
(update_jump_functions_after_inlining): Fix updating of
ancestor function.
* ipa-cp.c (ipa_get_jf_ancestor_result): Be ready for type
to be NULL.
Index: ipa-prop.h
===================================================================
--- ipa-prop.h (revision 207870)
+++ ipa-prop.h (working copy)
@@ -130,7 +130,9 @@ struct GTY(()) ipa_ancestor_jf_data
{
/* Offset of the field representing the ancestor. */
HOST_WIDE_INT offset;
- /* Type of the result. */
+ /* Type of the result.
+ When TYPE_PRESERVED is false, TYPE is NULL, since it is only
+ relevant for the devirtualization machinery. */
tree type;
/* Number of the caller's formal parameter being passed. */
int formal_id;
Index: ipa-prop.c
===================================================================
--- ipa-prop.c (revision 207870)
+++ ipa-prop.c (working copy)
@@ -393,6 +393,9 @@ ipa_set_jf_known_type (struct ipa_jump_f
{
gcc_assert (TREE_CODE (component_type) == RECORD_TYPE
&& TYPE_BINFO (component_type));
+ if (!flag_devirtualize)
+ return;
+ gcc_assert (BINFO_VTABLE (TYPE_BINFO (component_type)));
jfunc->type = IPA_JF_KNOWN_TYPE;
jfunc->value.known_type.offset = offset,
jfunc->value.known_type.base_type = base_type;
@@ -477,10 +480,16 @@ ipa_set_ancestor_jf (struct ipa_jump_fun
tree type, int formal_id, bool agg_preserved,
bool type_preserved)
{
+ if (!flag_devirtualize)
+ type_preserved = false;
+ gcc_assert (!type_preserved
+ || (TREE_CODE (type) == RECORD_TYPE
+ && TYPE_BINFO (type)
+ && BINFO_VTABLE (TYPE_BINFO (type))));
jfunc->type = IPA_JF_ANCESTOR;
jfunc->value.ancestor.formal_id = formal_id;
jfunc->value.ancestor.offset = offset;
- jfunc->value.ancestor.type = type;
+ jfunc->value.ancestor.type = type_preserved ? type : NULL;
jfunc->value.ancestor.agg_preserved = agg_preserved;
jfunc->value.ancestor.type_preserved = type_preserved;
}
@@ -686,7 +695,7 @@ detect_type_change (tree arg, tree base,
|| TREE_CODE (comp_type) != RECORD_TYPE
|| !TYPE_BINFO (comp_type)
|| !BINFO_VTABLE (TYPE_BINFO (comp_type)))
- return false;
+ return true;
/* C++ methods are not allowed to change THIS pointer unless they
are constructors or destructors. */
@@ -1103,7 +1112,8 @@ compute_complex_assign_jump_func (struct
bool type_p = !detect_type_change (op1, base, TREE_TYPE (param_type),
call, jfunc, offset);
if (type_p || jfunc->type == IPA_JF_UNKNOWN)
- ipa_set_ancestor_jf (jfunc, offset, TREE_TYPE (op1), index,
+ ipa_set_ancestor_jf (jfunc, offset,
+ type_p ? TREE_TYPE (param_type) : NULL, index,
parm_ref_data_pass_through_p (&parms_ainfo[index],
call, ssa), type_p);
}
@@ -1236,7 +1246,7 @@ compute_complex_ancestor_jump_func (stru
type_p = !detect_type_change (obj, expr, TREE_TYPE (param_type),
call, jfunc, offset);
if (type_p || jfunc->type == IPA_JF_UNKNOWN)
- ipa_set_ancestor_jf (jfunc, offset, TREE_TYPE (obj), index,
+ ipa_set_ancestor_jf (jfunc, offset, type_p ? TREE_TYPE (param_type) : NULL, index,
parm_ref_data_pass_through_p (&parms_ainfo[index],
call, parm), type_p);
}
@@ -2391,7 +2401,7 @@ update_jump_functions_after_inlining (st
ipa_set_jf_known_type (dst,
ipa_get_jf_known_type_offset (src),
ipa_get_jf_known_type_base_type (src),
- ipa_get_jf_known_type_base_type (src));
+ ipa_get_jf_known_type_component_type (src));
else
dst->type = IPA_JF_UNKNOWN;
break;
Index: ipa-cp.c
===================================================================
--- ipa-cp.c (revision 207870)
+++ ipa-cp.c (working copy)
@@ -798,7 +798,9 @@ ipa_get_jf_ancestor_result (struct ipa_j
tree t = TREE_OPERAND (input, 0);
t = build_ref_for_offset (EXPR_LOCATION (t), t,
ipa_get_jf_ancestor_offset (jfunc),
- ipa_get_jf_ancestor_type (jfunc), NULL, false);
+ ipa_get_jf_ancestor_type (jfunc)
+ ? ipa_get_jf_ancestor_type (jfunc)
+ : ptr_type_node, NULL, false);
return build_fold_addr_expr (t);
}
else