Commit 1aa5d1c7 by Aldy Hernandez Committed by Aldy Hernandez

+ * trans-mem.c (requires_barrier): Do not instrument thread local + variables…

+ * trans-mem.c (requires_barrier): Do not instrument thread local + variables and emit save/restore for them.

+       * trans-mem.c (requires_barrier): Do not instrument thread local
+       variables and emit save/restore for them.


Co-Authored-By: Patrick Marlier <patrick.marlier@gmail.com>

From-SVN: r183476
parent c5c90089
2012-01-24 Aldy Hernandez <aldyh@redhat.com>
Patrick Marlier <patrick.marlier@gmail.com>
* trans-mem.c (requires_barrier): Do not instrument thread local
variables and emit save/restore for them.
2012-01-24 Jason Merrill <jason@redhat.com> 2012-01-24 Jason Merrill <jason@redhat.com>
PR c++/51812 PR c++/51812
......
/* { 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" } } */
/* Passes for transactional memory support. /* 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. This file is part of GCC.
...@@ -1488,7 +1488,18 @@ requires_barrier (basic_block entry_block, tree x, gimple stmt) ...@@ -1488,7 +1488,18 @@ requires_barrier (basic_block entry_block, tree x, gimple stmt)
} }
if (is_global_var (x)) if (is_global_var (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); return !TREE_READONLY (x);
}
if (/* FIXME: This condition should actually go below in the if (/* FIXME: This condition should actually go below in the
tm_log_add() call, however is_call_clobbered() depends on tm_log_add() call, however is_call_clobbered() depends on
aliasing info which is not available during aliasing info which is not available during
...@@ -1498,17 +1509,14 @@ requires_barrier (basic_block entry_block, tree x, gimple stmt) ...@@ -1498,17 +1509,14 @@ requires_barrier (basic_block entry_block, tree x, gimple stmt)
lower_sequence_tm altogether. */ lower_sequence_tm altogether. */
needs_to_live_in_memory (x)) needs_to_live_in_memory (x))
return true; return true;
else thread_local:
{ /* For local memory that doesn't escape (aka thread private memory),
/* For local memory that doesn't escape (aka thread private we can either save the value at the beginning of the transaction and
memory), we can either save the value at the beginning of restore on restart, or call a tm function to dynamically save and
the transaction and restore on restart, or call a tm restore on restart (ITM_L*). */
function to dynamically save and restore on restart
(ITM_L*). */
if (stmt) if (stmt)
tm_log_add (entry_block, orig, stmt); tm_log_add (entry_block, orig, stmt);
return false; return false;
}
default: default:
return false; return false;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment