diff mbox

ipa-prop WRT type variants

Message ID 20140628183110.GC2531@kam.mff.cuni.cz
State New
Headers show

Commit Message

Jan Hubicka June 28, 2014, 6:31 p.m. UTC
Hi,
this patch does similar change to ipa-prop as I did to ipa-devirt; it makes sure that
all the types in jump functions are main variants that reduces diversity in LTO streaming
and makes us less likely to hit incomplete types.

It also makes sure that the type change detection works on main variant because pointer
equality is used there for types.

Bootstrapped/regtested x86_64-linux, comitted.

	* 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.
diff mbox

Patch

Index: ipa-prop.c
===================================================================
--- ipa-prop.c	(revision 212098)
+++ ipa-prop.c	(working copy)
@@ -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_fun
 {
   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 +720,9 @@  check_stmt_for_type_change (ao_ref *ao A
   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 +759,12 @@  detect_type_change (tree arg, tree base,
       /* 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 +1420,8 @@  compute_known_type_jump_func (tree op, s
       /* 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);