diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7792d9a96382672422219d5c0cb4e187a49e6a7d..f09f1c84f220583822810a691319140e1b5a196c 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 0000000000000000000000000000000000000000..ca2c6043bbbe7c594bfd89a3559f027f4336fc8f --- /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 242b470a54e6ec24f7a7f20aefa5776eea15b0b9..ef384acd7dc5784e4f0dde5794ec29b01df99819 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);