+ * 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
This commit is contained in:
parent
c5c90089e6
commit
1aa5d1c74a
|
@ -1,3 +1,9 @@
|
||||||
|
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
|
||||||
|
|
|
@ -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" } } */
|
|
@ -1,5 +1,5 @@
|
||||||
/* 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)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_global_var (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
|
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)
|
||||||
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
|
if (stmt)
|
||||||
(ITM_L*). */
|
tm_log_add (entry_block, orig, stmt);
|
||||||
if (stmt)
|
return false;
|
||||||
tm_log_add (entry_block, orig, stmt);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Reference in New Issue