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.
ChangeLog
2012-01-23 Patrick Marlier <patrick.marl...@gmail.com>
* trans-mem.c (requires_barrier): Do not instrument thread local
variables and emit save/restore for them.
testsuite/ChangeLog
2012-01-23 Patrick Marlier <patrick.marl...@gmail.com>
* gcc.dg/tm/threadlocal-1.c: New test.
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;