From: aldyh Date: Tue, 24 Jan 2012 13:38:10 +0000 (+0000) Subject: + * trans-mem.c (requires_barrier): Do not instrument thread local X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=5db3f9d5d43a9b6ced368624b52fcd2d31e57c8a + * trans-mem.c (requires_barrier): Do not instrument thread local + variables and emit save/restore for them. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@183476 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ebbb8d04dff..4fb5057eb6a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-01-24 Aldy Hernandez + Patrick Marlier + + * trans-mem.c (requires_barrier): Do not instrument thread local + variables and emit save/restore for them. + 2012-01-24 Jason Merrill PR c++/51812 diff --git a/gcc/testsuite/gcc.dg/tm/threadlocal-1.c b/gcc/testsuite/gcc.dg/tm/threadlocal-1.c new file mode 100644 index 00000000000..83a90fffb6c --- /dev/null +++ b/gcc/testsuite/gcc.dg/tm/threadlocal-1.c @@ -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" } } */ diff --git a/gcc/trans-mem.c b/gcc/trans-mem.c index de7a913be66..06b1d8112bd 100644 --- a/gcc/trans-mem.c +++ b/gcc/trans-mem.c @@ -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, gimple stmt) } 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, gimple stmt) 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;