diff options
author | aldyh <aldyh@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-02-28 23:24:57 +0000 |
---|---|---|
committer | aldyh <aldyh@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-02-28 23:24:57 +0000 |
commit | 208cd3e60b9c8bda8dd85bb2f1f299dd3e69a640 (patch) | |
tree | 3e48d788bc0281b1899735d4533cc0c8f9beed18 /gcc | |
parent | 44b00fb560f5ac23a99c38c3a45b59ea15bef4a1 (diff) | |
download | gcc-208cd3e60b9c8bda8dd85bb2f1f299dd3e69a640.tar.gz |
PR 47905
* trans-mem.c (ipa_tm_propagate_irr): Do not propagate to blocks
outside of a TM region.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/transactional-memory@170578 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog.tm | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tm/pr47905.c | 14 | ||||
-rw-r--r-- | gcc/trans-mem.c | 6 |
3 files changed, 24 insertions, 2 deletions
diff --git a/gcc/ChangeLog.tm b/gcc/ChangeLog.tm index 5be365821bb..71f136b3c54 100644 --- a/gcc/ChangeLog.tm +++ b/gcc/ChangeLog.tm @@ -1,3 +1,9 @@ +2011-02-28 Aldy Hernandez <aldyh@redhat.com> + + PR 47905 + * trans-mem.c (ipa_tm_propagate_irr): Do not propagate to blocks + outside of a TM region. + 2011-02-21 Aldy Hernandez <aldyh@redhat.com> PR 47746 diff --git a/gcc/testsuite/gcc.dg/tm/pr47905.c b/gcc/testsuite/gcc.dg/tm/pr47905.c new file mode 100644 index 00000000000..fac82db2847 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tm/pr47905.c @@ -0,0 +1,14 @@ +/* { dg-do compile } + { dg-options "-fgnu-tm" } */ + +void funcA(); +void funcB(); + +void *thread() +{ + __transaction [[relaxed]] + { + funcA(); + }; + funcB(); +} diff --git a/gcc/trans-mem.c b/gcc/trans-mem.c index aa3f4e27631..9e685710a8d 100644 --- a/gcc/trans-mem.c +++ b/gcc/trans-mem.c @@ -3752,8 +3752,10 @@ ipa_tm_propagate_irr (basic_block entry_block, bitmap new_irr, bitmap old_irr, son; son = next_dom_son (CDI_DOMINATORS, son)) { - /* Make sure a block isn't already in old_irr. */ - if (!old_irr || !bitmap_bit_p (old_irr, son->index)) + /* Make sure block is actually in a TM region, and it + isn't already in old_irr. */ + if ((!old_irr || !bitmap_bit_p (old_irr, son->index)) + && bitmap_bit_p (bb_in_TM_region, son->index)) bitmap_set_bit (new_irr, son->index); } } |