Fix MEM_REF creation for shared stack slots

Jan Hubicka hubicka@ucw.cz
Tue May 21 07:35:00 GMT 2019


Hi,
while creating shared stack slots we create a fake void * pointer and
merge the corresponidng points-to sets.  Later ao_ref_from_mem constructs
mem_ref to feed alias oracle from. Since pointer is void we then
dereference it and keep with void_type mem_ref that does not make much sense.
It also makes oracle to punt later on 

  /* If either reference is view-converted, give up now.  */
  if (same_type_for_tbaa (TREE_TYPE (base1), TREE_TYPE (ptrtype1)) != 1
      || same_type_for_tbaa (TREE_TYPE (dbase2), TREE_TYPE (base2)) != 1)
    return true;

The patch improves access path disambiguation from:

  refs_may_alias_p: 3027850 disambiguations, 3340416 queries
  ref_maybe_used_by_call_p: 6451 disambiguations, 3053430 queries
  call_may_clobber_ref_p: 817 disambiguations, 817 queries
  aliasing_component_ref_p: 151 disambiguations, 12565 queries
  TBAA oracle: 1468434 disambiguations 3010778 queries
               550723 are in alias set 0
               614261 queries asked about the same object
               0 queries asked about the same alias set
               0 access volatile
               260983 are dependent in the DAG
               116377 are aritificially in conflict with void *

to:

Alias oracle query stats:
  refs_may_alias_p: 3029219 disambiguations, 3341410 queries
  ref_maybe_used_by_call_p: 6451 disambiguations, 3054799 queries
  call_may_clobber_ref_p: 817 disambiguations, 817 queries
  aliasing_component_ref_p: 1286 disambiguations, 18458 queries
  TBAA oracle: 1468536 disambiguations 3013214 queries
               550743 are in alias set 0
               616203 queries asked about the same object
               0 queries asked about the same alias set
               0 access volatile
               261355 are dependent in the DAG
               116377 are aritificially in conflict with void *

So about 8times of aliasing_component_refs hitrate.

Bootstrapped/regtested x86_64-linux, OK?
Honza

	* alias.c (ao_ref_from_mem): Use build_simple_mem_ref_with_type.
	* tree.c (build_simple_mem_ref_with_type_loc): Break out from ...
	(build_simple_mem_ref_loc): ... here.
	* fold-const.h (build_simple_mem_ref_with_type_loc): Declare.
	(build_simple_mem_ref_with_type): New macro.
Index: alias.c
===================================================================
--- alias.c	(revision 271379)
+++ alias.c	(working copy)
@@ -316,7 +316,8 @@ ao_ref_from_mem (ao_ref *ref, const_rtx
     {
       tree *namep = cfun->gimple_df->decls_to_pointers->get (base);
       if (namep)
-	ref->base = build_simple_mem_ref (*namep);
+	ref->base = build_simple_mem_ref_with_type
+			 (*namep, build_pointer_type (TREE_TYPE (base)));
     }
 
   ref->ref_alias_set = MEM_ALIAS_SET (mem);
Index: fold-const.h
===================================================================
--- fold-const.h	(revision 271379)
+++ fold-const.h	(working copy)
@@ -120,6 +120,9 @@ extern tree fold_indirect_ref_loc (locat
 extern tree build_simple_mem_ref_loc (location_t, tree);
 #define build_simple_mem_ref(T)\
 	build_simple_mem_ref_loc (UNKNOWN_LOCATION, T)
+extern tree build_simple_mem_ref_with_type_loc (location_t, tree, tree);
+#define build_simple_mem_ref_with_type(T, T2)\
+	build_simple_mem_ref_with_type_loc (UNKNOWN_LOCATION, T, T2)
 extern poly_offset_int mem_ref_offset (const_tree);
 extern tree build_invariant_address (tree, tree, poly_int64);
 extern tree constant_boolean_node (bool, tree);
Index: tree.c
===================================================================
--- tree.c	(revision 271402)
+++ tree.c	(working copy)
@@ -4907,14 +4907,14 @@ build5 (enum tree_code code, tree tt, tr
 }
 
 /* Build a simple MEM_REF tree with the sematics of a plain INDIRECT_REF
-   on the pointer PTR.  */
+   on the pointer PTR casted to TYPE.  */
 
 tree
-build_simple_mem_ref_loc (location_t loc, tree ptr)
+build_simple_mem_ref_with_type_loc (location_t loc, tree ptr, tree ptype)
 {
   poly_int64 offset = 0;
-  tree ptype = TREE_TYPE (ptr);
   tree tem;
+  gcc_checking_assert (POINTER_TYPE_P (ptype) && ptype != void_type_node);
   /* For convenience allow addresses that collapse to a simple base
      and offset.  */
   if (TREE_CODE (ptr) == ADDR_EXPR
@@ -4938,6 +4938,15 @@ build_simple_mem_ref_loc (location_t loc
   return tem;
 }
 
+/* Build a simple MEM_REF tree with the sematics of a plain INDIRECT_REF
+   on the pointer PTR.  */
+
+tree
+build_simple_mem_ref_loc (location_t loc, tree ptr)
+{
+  return build_simple_mem_ref_with_type_loc (loc, ptr, TREE_TYPE (ptr));
+}
+
 /* Return the constant offset of a MEM_REF or TARGET_MEM_REF tree T.  */
 
 poly_offset_int



More information about the Gcc-patches mailing list