aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2012-09-25 18:47:35 +0000
committerAldy Hernandez <aldyh@gcc.gnu.org>2012-09-25 18:47:35 +0000
commit91cad09b08a860dccace9d1e7050e8765b3556e9 (patch)
tree43a9f5373199441ba337103f0ee877ac4265d3c5 /gcc
parent5139232eef79c85e9dccb1c04cc5f01f6af12a6f (diff)
downloadgcc-91cad09b08a860dccace9d1e7050e8765b3556e9.zip
gcc-91cad09b08a860dccace9d1e7050e8765b3556e9.tar.gz
gcc-91cad09b08a860dccace9d1e7050e8765b3556e9.tar.bz2
re PR middle-end/53850 (ICE: in expand_call_tm, at trans-mem.c:2289 with -fgnu-tm -O3)
PR middle-end/53850 * trans-mem.c (expand_call_tm): Handle late built built-ins. From-SVN: r191742
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tm/pr53850.c15
-rw-r--r--gcc/trans-mem.c27
3 files changed, 45 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7792d9a..f09f1c8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
index 0000000..ca2c604
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tm/pr53850.c
@@ -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;
+ }
+}
diff --git a/gcc/trans-mem.c b/gcc/trans-mem.c
index 242b470..ef384ac 100644
--- a/gcc/trans-mem.c
+++ b/gcc/trans-mem.c
@@ -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);