aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTorvald Riegel <triegel@redhat.com>2011-12-12 12:04:46 +0000
committerTorvald Riegel <torvald@gcc.gnu.org>2011-12-12 12:04:46 +0000
commitfeca8f5a964a16efbe7c9ca22cd8c2539e0f00e9 (patch)
tree01c3a64df50b4d63d221525ca12332c822cb18b8
parent033eaf8501b9611c04430e4f1bf458435fdd1171 (diff)
downloadgcc-feca8f5a964a16efbe7c9ca22cd8c2539e0f00e9.zip
gcc-feca8f5a964a16efbe7c9ca22cd8c2539e0f00e9.tar.gz
gcc-feca8f5a964a16efbe7c9ca22cd8c2539e0f00e9.tar.bz2
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
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/c-c++-common/tm/20111206.c53
-rw-r--r--gcc/tree-ssa-tail-merge.c8
4 files changed, 70 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9e0e3f06..eed29f0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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-
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 1d78adf..e6f64a7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
diff --git a/gcc/testsuite/c-c++-common/tm/20111206.c b/gcc/testsuite/c-c++-common/tm/20111206.c
new file mode 100644
index 0000000..74a5519
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/tm/20111206.c
@@ -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;
+ }
+ }
+ }
+}
diff --git a/gcc/tree-ssa-tail-merge.c b/gcc/tree-ssa-tail-merge.c
index a501b07..7452266 100644
--- a/gcc/tree-ssa-tail-merge.c
+++ b/gcc/tree-ssa-tail-merge.c
@@ -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)
{