diff mbox

PR other/51165: add new adress_escapes predicate

Message ID 4F14342D.8080400@redhat.com
State New
Headers show

Commit Message

Aldy Hernandez Jan. 16, 2012, 2:29 p.m. UTC
As discussed in the PR, the problem here is that we are using 
ptr_deref_may_alias_global_p() to determine if a dereferenced address 
escapes, whereas we were previously using the now non existent 
is_call_clobbered.  The function ptr_deref_may_alias_global_p() does not 
understand SSA_NAMEs, whereas is_call_clobbered did.

Richi suggested using may_be_aliased() for DECLs.

The patch below abstracts an address_escapes_p() predicate for more 
generic use into the aliasing code.  Using this instead of 
ptr_deref_may_alias_global_p() fixes all 4 TM memory optimization 
regressions.  TM logging is now back in business.

Is this what you had in mind?  OK for trunk?
PR other/51165
	* tree-ssa-alias.h: (address_escapes_p): Declare it.
	* tree-ssa-alias.c (address_escapes_p): New.
	* trans-mem.c (thread_private_new_memory): Use it.
	(requires_barrier): Use it.

Comments

Richard Biener Jan. 16, 2012, 2:42 p.m. UTC | #1
On Mon, Jan 16, 2012 at 3:29 PM, Aldy Hernandez <aldyh@redhat.com> wrote:
> As discussed in the PR, the problem here is that we are using
> ptr_deref_may_alias_global_p() to determine if a dereferenced address
> escapes, whereas we were previously using the now non existent
> is_call_clobbered.  The function ptr_deref_may_alias_global_p() does not
> understand SSA_NAMEs, whereas is_call_clobbered did.
>
> Richi suggested using may_be_aliased() for DECLs.
>
> The patch below abstracts an address_escapes_p() predicate for more generic
> use into the aliasing code.  Using this instead of
> ptr_deref_may_alias_global_p() fixes all 4 TM memory optimization
> regressions.  TM logging is now back in business.
>
> Is this what you had in mind?  OK for trunk?

Not really - you handle both ptr and *ptr in the same predicate and
call both "address escaped".  What I suggested was sth like

/* Return true, if the memory access X may alias with a global variable.  */

bool
access_may_refer_to_global_p (tree x)
{
  x = get_base_address (x);
  if (DECL_P (x))
    return is_global_var (x);
  else if (TREE_CODE (x) == MEM_REF
             || TREE_CODE (x) == TARGET_MEM_REF)
    return ptr_deref_may_alias_global_p (TREE_OPERAND (x, 0));
  return true;
}

Richard.
diff mbox

Patch

Index: testsuite/gcc.dg/tm/memopt-3.c
===================================================================
--- testsuite/gcc.dg/tm/memopt-3.c	(revision 183072)
+++ testsuite/gcc.dg/tm/memopt-3.c	(working copy)
@@ -16,5 +16,5 @@  int f()
   return lala.x[0];
 }
 
-/* { dg-final { scan-tree-dump-times "logging: lala.x\\\[i_1\\\]" 1 "tmmark" { xfail *-*-* }  } } */
+/* { dg-final { scan-tree-dump-times "logging: lala.x\\\[i_1\\\]" 1 "tmmark" } } */
 /* { dg-final { cleanup-tree-dump "tmmark" } } */
Index: testsuite/gcc.dg/tm/memopt-5.c
===================================================================
--- testsuite/gcc.dg/tm/memopt-5.c	(revision 183072)
+++ testsuite/gcc.dg/tm/memopt-5.c	(working copy)
@@ -19,5 +19,5 @@  int f()
   return lala.x[i];
 }
 
-/* { dg-final { scan-tree-dump-times "ITM_LU\[0-9\] \\\(&lala.x\\\[55\\\]" 1 "tmedge" { xfail *-*-* } } } */
+/* { dg-final { scan-tree-dump-times "ITM_LU\[0-9\] \\\(&lala.x\\\[55\\\]" 1 "tmedge" } } */
 /* { dg-final { cleanup-tree-dump "tmedge" } } */
Index: testsuite/gcc.dg/tm/memopt-7.c
===================================================================
--- testsuite/gcc.dg/tm/memopt-7.c	(revision 183072)
+++ testsuite/gcc.dg/tm/memopt-7.c	(working copy)
@@ -17,6 +17,6 @@  int f()
   return lala.x[asdf];
 }
 
-/* { dg-final { scan-tree-dump-times "tm_save.\[0-9_\]+ = lala" 1 "tmedge" { xfail *-*-* } } } */
-/* { dg-final { scan-tree-dump-times "lala = tm_save" 1 "tmedge" { xfail *-*-* } } } */
+/* { dg-final { scan-tree-dump-times "tm_save.\[0-9_\]+ = lala" 1 "tmedge" } } */
+/* { dg-final { scan-tree-dump-times "lala = tm_save" 1 "tmedge" } } */
 /* { dg-final { cleanup-tree-dump "tmedge" } } */
Index: testsuite/gcc.dg/tm/memopt-4.c
===================================================================
--- testsuite/gcc.dg/tm/memopt-4.c	(revision 183072)
+++ testsuite/gcc.dg/tm/memopt-4.c	(working copy)
@@ -19,6 +19,6 @@  int f()
   return lala.x[i];
 }
 
-/* { dg-final { scan-tree-dump-times "tm_save.\[0-9_\]+ = lala.x\\\[55\\\]" 1 "tmedge" { xfail *-*-* } } } */
-/* { dg-final { scan-tree-dump-times "lala.x\\\[55\\\] = tm_save" 1 "tmedge" { xfail *-*-* } } } */
+/* { dg-final { scan-tree-dump-times "tm_save.\[0-9_\]+ = lala.x\\\[55\\\]" 1 "tmedge" } } */
+/* { dg-final { scan-tree-dump-times "lala.x\\\[55\\\] = tm_save" 1 "tmedge" } } */
 /* { dg-final { cleanup-tree-dump "tmedge" } } */
Index: tree-ssa-alias.c
===================================================================
--- tree-ssa-alias.c	(revision 183072)
+++ tree-ssa-alias.c	(working copy)
@@ -332,6 +332,20 @@  ptr_deref_may_alias_ref_p_1 (tree ptr, a
   return true;
 }
 
+/* Returns true if an address escapes the current function.  */
+bool
+address_escapes_p (tree x)
+{
+  x = get_base_address (x);
+  if (TREE_CODE (x) == SSA_NAME)
+    return ptr_deref_may_alias_global_p (x);
+  if (TREE_CODE (x) == MEM_REF)
+    return ptr_deref_may_alias_global_p (TREE_OPERAND (x, 0));
+  if (DECL_P (x))
+    return may_be_aliased (x);
+  return false;
+}
+
 
 /* Dump alias information on FILE.  */
 
Index: tree-ssa-alias.h
===================================================================
--- tree-ssa-alias.h	(revision 183072)
+++ tree-ssa-alias.h	(working copy)
@@ -99,6 +99,7 @@  extern tree ao_ref_base (ao_ref *);
 extern alias_set_type ao_ref_alias_set (ao_ref *);
 extern bool ptr_deref_may_alias_global_p (tree);
 extern bool ptr_derefs_may_alias_p (tree, tree);
+extern bool address_escapes_p (tree);
 extern bool refs_may_alias_p (tree, tree);
 extern bool refs_may_alias_p_1 (ao_ref *, ao_ref *, bool);
 extern bool refs_anti_dependent_p (tree, tree);
Index: trans-mem.c
===================================================================
--- trans-mem.c	(revision 183072)
+++ trans-mem.c	(working copy)
@@ -1347,7 +1347,7 @@  thread_private_new_memory (basic_block e
   /* Search DEF chain to find the original definition of this address.  */
   do
     {
-      if (ptr_deref_may_alias_global_p (x))
+      if (address_escapes_p (x))
 	{
 	  /* Address escapes.  This is not thread-private.  */
 	  retval = mem_non_local;
@@ -1497,8 +1497,7 @@  requires_barrier (basic_block entry_bloc
 	     to needs_to_live_in_memory until we eliminate
 	     lower_sequence_tm altogether.  */
 	  needs_to_live_in_memory (x)
-	  /* X escapes.  */
-	  || ptr_deref_may_alias_global_p (x))
+	  || address_escapes_p (x))
 	return true;
       else
 	{