2
0
mirror of git://gcc.gnu.org/git/gcc.git synced 2025-03-24 13:01:13 +08:00

Prevent sharing of commit calls among transactions.

gcc/
	* tree-ssa-tail-merge.c (gimple_equal_p): Don't treat transaction
	commits as equal.

	gcc/testsuite/
	* c-c++-common/tm/20111206.c: New test.

From-SVN: r182231
This commit is contained in:
Torvald Riegel 2011-12-12 12:04:46 +00:00 committed by Torvald Riegel
parent 033eaf8501
commit feca8f5a96
4 changed files with 70 additions and 0 deletions

@ -1,3 +1,8 @@
2011-12-12 Torvald Riegel <triegel@redhat.com>
* tree-ssa-tail-merge.c (gimple_equal_p): Don't treat transaction
commits as equal.
2011-12-12 Iain Sandoe <iains@gcc.gnu.org>
* config/darwin-sections.def (zobj_const_data_section): Fix over-

@ -1,3 +1,7 @@
2011-12-12 Torvald Riegel <triegel@redhat.com>
* c-c++-common/tm/20111206.c: New test.
2011-12-12 Richard Guenther <rguenther@suse.de>
PR lto/51262

@ -0,0 +1,53 @@
/* { dg-do compile } */
/* { dg-options "-fgnu-tm -O2" } */
/* This test case triggered block sharing between the two transactions. */
void func1 (void) __attribute__ ((transaction_callable, used));
long func2 (void) __attribute__ ((transaction_callable, used));
unsigned long rand (void);
void client_run (void)
{
long types[100];
long i;
for (i = 0; i < 100; i++)
{
long action = rand ();
switch (action)
{
case 0:
{
__transaction_relaxed
{
long bill = func2 ();
if (bill >= 0)
{
func1 ();
}
}
break;
}
case 1:
{
long n;
__transaction_relaxed
{
for (n = 0; n < 100; n++)
{
long t = types[n];
switch (t)
{
case 0:
func1 ();
break;
}
}
}
break;
}
}
}
}

@ -1051,6 +1051,14 @@ gimple_equal_p (same_succ same_succ, gimple s1, gimple s2)
if (!gimple_call_same_target_p (s1, s2))
return false;
/* Eventually, we'll significantly complicate the CFG by adding
back edges to properly model the effects of transaction restart.
For the bulk of optimization this does not matter, but what we
cannot recover from is tail merging blocks between two separate
transactions. Avoid that by making commit not match. */
if (gimple_call_builtin_p (s1, BUILT_IN_TM_COMMIT))
return false;
equal = true;
for (i = 0; i < gimple_call_num_args (s1); ++i)
{