This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[trans-mem] Do not instrument thread locals


Hi,

I found that all thread local variables are instrumented with _ITM_W/R* calls whereas they should not be shared with other threads. This patch takes care of thread locals into requires_barrier and also adds the local save/restore for them. This patch also includes a testcase.

I did not fill any PR since I have already a patch for it but tell me if I have to.

Tested on x86_64-unknown-linux-gnu, ok for trunk?
Thanks.
--
Patrick Marlier.

Attachment: threadlocal.changelog
Description: Text document

Index: testsuite/gcc.dg/tm/threadlocal-1.c
===================================================================
--- testsuite/gcc.dg/tm/threadlocal-1.c	(revision 0)
+++ testsuite/gcc.dg/tm/threadlocal-1.c	(revision 0)
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-fgnu-tm -O -fdump-tree-tmedge" } */
+__thread int notshared = 0;
+int shared = 0;
+
+int main()
+{
+  __transaction_atomic
+    {
+      notshared++;
+      shared++;
+    }
+  return notshared + shared;
+}
+/* { dg-final { scan-tree-dump-times "tm_save.\[0-9_\]+ = notshared" 1 "tmedge" } } */
+/* { dg-final { scan-tree-dump-times "notshared = tm_save" 1 "tmedge" } } */
+/* { dg-final { cleanup-tree-dump "tmedge" } } */
Index: trans-mem.c
===================================================================
--- trans-mem.c	(revision 183448)
+++ trans-mem.c	(working copy)
@@ -1,5 +1,5 @@
 /* Passes for transactional memory support.
-   Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+   Copyright (C) 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
 
    This file is part of GCC.
 
@@ -1488,7 +1488,18 @@ requires_barrier (basic_block entry_block, tree x,
 	}
 
       if (is_global_var (x))
-	return !TREE_READONLY (x);
+	{
+	  if (DECL_THREAD_LOCAL_P (x))
+	    goto thread_local;
+	  if (DECL_HAS_VALUE_EXPR_P (x))
+	    {
+	      tree value = get_base_address (DECL_VALUE_EXPR (x));
+
+	      if (value && DECL_P (value) && DECL_THREAD_LOCAL_P (value))
+		goto thread_local;
+	    }
+	  return !TREE_READONLY (x);
+	}
       if (/* FIXME: This condition should actually go below in the
 	     tm_log_add() call, however is_call_clobbered() depends on
 	     aliasing info which is not available during
@@ -1498,17 +1509,14 @@ requires_barrier (basic_block entry_block, tree x,
 	     lower_sequence_tm altogether.  */
 	  needs_to_live_in_memory (x))
 	return true;
-      else
-	{
-	  /* For local memory that doesn't escape (aka thread private
-	     memory), we can either save the value at the beginning of
-	     the transaction and restore on restart, or call a tm
-	     function to dynamically save and restore on restart
-	     (ITM_L*).  */
-	  if (stmt)
-	    tm_log_add (entry_block, orig, stmt);
-	  return false;
-	}
+    thread_local:
+      /* For local memory that doesn't escape (aka thread private memory), 
+	 we can either save the value at the beginning of the transaction and
+	 restore on restart, or call a tm function to dynamically save and
+	 restore on restart (ITM_L*). */
+      if (stmt)
+	tm_log_add (entry_block, orig, stmt);
+      return false;
 
     default:
       return false;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]