]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/54362 (COND_EXPR not understood by either alias or ITM)
authorAndrew Pinski <apinski@cavium.com>
Tue, 11 Sep 2012 04:21:00 +0000 (04:21 +0000)
committerAndrew Pinski <pinskia@gcc.gnu.org>
Tue, 11 Sep 2012 04:21:00 +0000 (21:21 -0700)
2012-09-10  Andrew Pinski  <apinski@cavium.com>

PR tree-opt/54362
* trans-mem.c (thread_private_new_memory): Handle COND_EXPR also.

2012-09-10  Andrew Pinski  <apinski@cavium.com>

PR tree-opt/c54362
* gcc.dg/tm/memopt-16.c: New testcase.

From-SVN: r191172

gcc/ChangeLog
gcc/testsuite/gcc.dg/tm/memopt-16.c [new file with mode: 0644]
gcc/trans-mem.c

index 681007b8ea4b17ff4c16905b5463b0b99debafa7..2b11aa5e51b6cc4d065c2ee2ee94ebb74bc25100 100644 (file)
@@ -1,3 +1,8 @@
+2012-09-10  Andrew Pinski  <apinski@cavium.com>
+
+       PR tree-opt/54362
+       * trans-mem.c (thread_private_new_memory): Handle COND_EXPR also.
+
 2012-09-10  Maxim Kuvyrkov  <maxim@codesourcery.com>
 
        * config/m68k/m68k.c (m68k_sched_dfa_post_advance_cycle): Support
diff --git a/gcc/testsuite/gcc.dg/tm/memopt-16.c b/gcc/testsuite/gcc.dg/tm/memopt-16.c
new file mode 100644 (file)
index 0000000..c230240
--- /dev/null
@@ -0,0 +1,43 @@
+/* { dg-do compile } */
+/* { dg-options "-fgnu-tm -O3 -fdump-tree-tmmark" } */
+/* Like memopt-12.c but the phi is inside a look which causes
+   it to be converted into a COND_EXPR.  */
+
+extern int test(void) __attribute__((transaction_safe));
+extern void *malloc (__SIZE_TYPE__) __attribute__((malloc,transaction_safe));
+
+struct large { int foo[500]; };
+
+int f(int j)
+{
+  int *p1, *p2, *p3;
+
+  p1 = malloc (sizeof (*p1)*5000);
+  __transaction_atomic {
+    _Bool t;
+    int i = 1;
+    *p1 = 0;
+
+    p2 = malloc (sizeof (*p2)*6000);
+    *p2 = 1;
+    t = test();
+
+    for (i = 0;i < j;i++)
+    {
+
+    /* p3 = PHI (p1, p2) */
+    if (t)
+      p3 = p1;
+    else
+      p3 = p2;
+
+    /* Since both p1 and p2 are thread-private, we can inherit the
+       logging already done.  No ITM_W* instrumentation necessary.  */
+    *p3 = 555;
+    }
+  }
+  return p3[something()];
+}
+
+/* { dg-final { scan-tree-dump-times "ITM_WU" 0 "tmmark" } } */
+/* { dg-final { cleanup-tree-dump "tmmark" } } */
index edb678e8c1e4000b56592b57e9004c281bf8ed1e..e71efff70652f9c542a86a4dae1fed8127ff65d0 100644 (file)
@@ -1379,6 +1379,19 @@ thread_private_new_memory (basic_block entry_block, tree x)
          /* x = (cast*) foo ==> foo */
          else if (code == VIEW_CONVERT_EXPR || code == NOP_EXPR)
            x = gimple_assign_rhs1 (stmt);
+         /* x = c ? op1 : op2 == > op1 or op2 just like a PHI */
+         else if (code == COND_EXPR)
+           {
+             tree op1 = gimple_assign_rhs2 (stmt);
+             tree op2 = gimple_assign_rhs3 (stmt);
+             enum thread_memory_type mem;
+             retval = thread_private_new_memory (entry_block, op1);
+             if (retval == mem_non_local)
+               goto new_memory_ret;
+             mem = thread_private_new_memory (entry_block, op2);
+             retval = MIN (retval, mem);
+             goto new_memory_ret;
+           }
          else
            {
              retval = mem_non_local;