Prevent sharing of commit calls among transactions.
authorTorvald Riegel <triegel@redhat.com>
Mon, 12 Dec 2011 12:04:46 +0000 (12:04 +0000)
committerTorvald Riegel <torvald@gcc.gnu.org>
Mon, 12 Dec 2011 12:04:46 +0000 (12:04 +0000)
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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/tm/20111206.c [new file with mode: 0644]
gcc/tree-ssa-tail-merge.c

index 9e0e3f0..eed29f0 100644 (file)
@@ -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-
index 1d78adf..e6f64a7 100644 (file)
@@ -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 (file)
index 0000000..74a5519
--- /dev/null
@@ -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;
+         }
+       }
+    }
+}
index a501b07..7452266 100644 (file)
@@ -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)
        {