]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/53850 (ICE: in expand_call_tm, at trans-mem.c:2289 with -fgnu-tm...
authorAldy Hernandez <aldyh@redhat.com>
Tue, 25 Sep 2012 18:47:35 +0000 (18:47 +0000)
committerAldy Hernandez <aldyh@gcc.gnu.org>
Tue, 25 Sep 2012 18:47:35 +0000 (18:47 +0000)
PR middle-end/53850
* trans-mem.c (expand_call_tm): Handle late built built-ins.

From-SVN: r191742

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

index 7792d9a96382672422219d5c0cb4e187a49e6a7d..f09f1c84f220583822810a691319140e1b5a196c 100644 (file)
@@ -1,3 +1,8 @@
+2012-09-25  Aldy Hernandez  <aldyh@redhat.com>
+
+       PR middle-end/53850
+       * trans-mem.c (expand_call_tm): Handle late built built-ins.
+
 2012-09-25  Georg-Johann Lay  <avr@gjlay.de>
 
        PR other/54701
diff --git a/gcc/testsuite/gcc.dg/tm/pr53850.c b/gcc/testsuite/gcc.dg/tm/pr53850.c
new file mode 100644 (file)
index 0000000..ca2c604
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-fgnu-tm -O3" } */
+
+unsigned char pp[100];
+
+void
+foo (void)
+{
+  int i;
+  __transaction_atomic
+  {
+    for (i = 0; i < 100; ++i)
+      pp[i] = 0x33;
+  }
+}
index 242b470a54e6ec24f7a7f20aefa5776eea15b0b9..ef384acd7dc5784e4f0dde5794ec29b01df99819 100644 (file)
@@ -2296,8 +2296,31 @@ expand_call_tm (struct tm_region *region,
     }
 
   node = cgraph_get_node (fn_decl);
-  /* All calls should have cgraph here. */
-  gcc_assert (node);
+  /* All calls should have cgraph here.  */
+  if (!node)
+    {
+      /* We can have a nodeless call here if some pass after IPA-tm
+        added uninstrumented calls.  For example, loop distribution
+        can transform certain loop constructs into __builtin_mem*
+        calls.  In this case, see if we have a suitable TM
+        replacement and fill in the gaps.  */
+      gcc_assert (DECL_BUILT_IN_CLASS (fn_decl) == BUILT_IN_NORMAL);
+      enum built_in_function code = DECL_FUNCTION_CODE (fn_decl);
+      gcc_assert (code == BUILT_IN_MEMCPY
+                 || code == BUILT_IN_MEMMOVE
+                 || code == BUILT_IN_MEMSET);
+
+      tree repl = find_tm_replacement_function (fn_decl);
+      if (repl)
+       {
+         gimple_call_set_fndecl (stmt, repl);
+         update_stmt (stmt);
+         node = cgraph_create_node (repl);
+         node->local.tm_may_enter_irr = false;
+         return expand_call_tm (region, gsi);
+       }
+      gcc_unreachable ();
+    }
   if (node->local.tm_may_enter_irr)
     transaction_subcode_ior (region, GTMA_MAY_ENTER_IRREVOCABLE);