diff options
author | Aldy Hernandez <aldyh@redhat.com> | 2012-09-25 18:47:35 +0000 |
---|---|---|
committer | Aldy Hernandez <aldyh@gcc.gnu.org> | 2012-09-25 18:47:35 +0000 |
commit | 91cad09b08a860dccace9d1e7050e8765b3556e9 (patch) | |
tree | 43a9f5373199441ba337103f0ee877ac4265d3c5 /gcc | |
parent | 5139232eef79c85e9dccb1c04cc5f01f6af12a6f (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tm/pr53850.c | 15 | ||||
-rw-r--r-- | gcc/trans-mem.c | 27 |
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); |