diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f030101656c2..fef8cfe7f99d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2016-01-26 Richard Henderson + + PR middle-end/60908 + * trans-mem.c (tm_region_init): Mark entry block as visited. + 2016-01-26 David Malcolm PR other/69006 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 18aa8af737fe..3e40014eeb0b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2016-01-26 Richard Henderson + + * gcc.dg/tm/pr60908.c: New test. + 2016-01-26 David Malcolm PR other/69006 diff --git a/gcc/testsuite/gcc.dg/tm/pr60908.c b/gcc/testsuite/gcc.dg/tm/pr60908.c new file mode 100644 index 000000000000..773438ddbe6f --- /dev/null +++ b/gcc/testsuite/gcc.dg/tm/pr60908.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-options "-fgnu-tm" } */ + +int t, v; + +int +foo (void) +{ + while (1) + { + __transaction_atomic { v++; } + if (t) + return 0; + } +} diff --git a/gcc/trans-mem.c b/gcc/trans-mem.c index b2047600dcb9..500071f94f14 100644 --- a/gcc/trans-mem.c +++ b/gcc/trans-mem.c @@ -2039,16 +2039,17 @@ tm_region_init (struct tm_region *region) struct tm_region *old_region; auto_vec bb_regions; - all_tm_regions = region; - bb = single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun)); - /* We could store this information in bb->aux, but we may get called through get_all_tm_blocks() from another pass that may be already using bb->aux. */ bb_regions.safe_grow_cleared (last_basic_block_for_fn (cfun)); + all_tm_regions = region; + bb = single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun)); queue.safe_push (bb); + bitmap_set_bit (visited_blocks, bb->index); bb_regions[bb->index] = region; + do { bb = queue.pop ();