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>
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.
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;
......
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