mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-27 13:54:19 +08:00
ipa-prop.c (ipa_set_jf_known_type): Record always the main variant of the type.
* ipa-prop.c (ipa_set_jf_known_type): Record always the main variant of the type. (ipa_set_ancestor_jf) Likewise. (check_stmt_for_type_change): Check that we work on main variant. (detect_type_change): Look into main variant. (compute_known_type_jump_func): Check that main variant has BINFO. From-SVN: r212108
This commit is contained in:
parent
c7e1befad2
commit
b49407f81a
@ -1,3 +1,12 @@
|
||||
2014-06-28 Jan Hubicka <hubicka@ucw.cz>
|
||||
|
||||
* ipa-prop.c (ipa_set_jf_known_type): Record always the main variant
|
||||
of the type.
|
||||
(ipa_set_ancestor_jf) Likewise.
|
||||
(check_stmt_for_type_change): Check that we work on main variant.
|
||||
(detect_type_change): Look into main variant.
|
||||
(compute_known_type_jump_func): Check that main variant has BINFO.
|
||||
|
||||
2014-06-28 Jan Hubicka <hubicka@ucw.cz>
|
||||
|
||||
* ipa-devirt.c (set_type_binfo): New function.
|
||||
|
@ -438,6 +438,11 @@ static void
|
||||
ipa_set_jf_known_type (struct ipa_jump_func *jfunc, HOST_WIDE_INT offset,
|
||||
tree base_type, tree component_type)
|
||||
{
|
||||
/* Recording and propagating main variants increases change that types
|
||||
will match. */
|
||||
base_type = TYPE_MAIN_VARIANT (base_type);
|
||||
component_type = TYPE_MAIN_VARIANT (component_type);
|
||||
|
||||
gcc_assert (TREE_CODE (component_type) == RECORD_TYPE
|
||||
&& TYPE_BINFO (component_type));
|
||||
if (!flag_devirtualize)
|
||||
@ -529,6 +534,8 @@ ipa_set_ancestor_jf (struct ipa_jump_func *jfunc, HOST_WIDE_INT offset,
|
||||
{
|
||||
if (!flag_devirtualize)
|
||||
type_preserved = false;
|
||||
if (type)
|
||||
type = TYPE_MAIN_VARIANT (type);
|
||||
gcc_assert (!type_preserved
|
||||
|| (TREE_CODE (type) == RECORD_TYPE
|
||||
&& TYPE_BINFO (type)
|
||||
@ -712,7 +719,9 @@ check_stmt_for_type_change (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef, void *data)
|
||||
if (stmt_may_be_vtbl_ptr_store (stmt))
|
||||
{
|
||||
tree type;
|
||||
|
||||
type = extr_type_from_vtbl_ptr_store (stmt, tci);
|
||||
gcc_assert (!type || TYPE_MAIN_VARIANT (type) == type);
|
||||
if (tci->type_maybe_changed
|
||||
&& type != tci->known_current_type)
|
||||
tci->multiple_types_encountered = true;
|
||||
@ -749,10 +758,12 @@ detect_type_change (tree arg, tree base, tree comp_type, gimple call,
|
||||
/* Be sure expected_type is polymorphic. */
|
||||
|| !comp_type
|
||||
|| TREE_CODE (comp_type) != RECORD_TYPE
|
||||
|| !TYPE_BINFO (comp_type)
|
||||
|| !BINFO_VTABLE (TYPE_BINFO (comp_type)))
|
||||
|| !TYPE_BINFO (TYPE_MAIN_VARIANT (comp_type))
|
||||
|| !BINFO_VTABLE (TYPE_BINFO (TYPE_MAIN_VARIANT (comp_type))))
|
||||
return true;
|
||||
|
||||
comp_type = TYPE_MAIN_VARIANT (comp_type);
|
||||
|
||||
/* C++ methods are not allowed to change THIS pointer unless they
|
||||
are constructors or destructors. */
|
||||
if (TREE_CODE (base) == MEM_REF
|
||||
@ -1408,8 +1419,8 @@ compute_known_type_jump_func (tree op, struct ipa_jump_func *jfunc,
|
||||
/* Be sure expected_type is polymorphic. */
|
||||
|| !expected_type
|
||||
|| TREE_CODE (expected_type) != RECORD_TYPE
|
||||
|| !TYPE_BINFO (expected_type)
|
||||
|| !BINFO_VTABLE (TYPE_BINFO (expected_type)))
|
||||
|| !TYPE_BINFO (TYPE_MAIN_VARIANT (expected_type))
|
||||
|| !BINFO_VTABLE (TYPE_BINFO (TYPE_MAIN_VARIANT (expected_type))))
|
||||
return;
|
||||
|
||||
op = TREE_OPERAND (op, 0);
|
||||
|
Loading…
Reference in New Issue
Block a user