+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.
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)
{
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)
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;
/* 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
/* 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);