+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-
+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
--- /dev/null
+/* { 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;
+ }
+ }
+ }
+}
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)
{