From b5e10eac5663910ecc0b40610673852daf975303 Mon Sep 17 00:00:00 2001 From: Aldy Hernandez Date: Mon, 19 Nov 2012 18:43:40 +0000 Subject: [PATCH] trans-mem (collect_bb2reg): Stop scanning at irrevocable * trans-mem (collect_bb2reg): Stop scanning at irrevocable * blocks. (get_bb_regions_instrumented): Add new traverse_clone argument and use it. (expand_regions_1): Same. (expand_region): Same. (execute_tm_mark): Pass new argument to expand_regions. (expand_block_edges): Pass new argument to get_bb_regions_instrumented. testsuite/ * g++.dg/tm/pr51516.C: Adjust for uninstrumented code path. * gcc.dg/tm/clone-1.c: New test. From-SVN: r193633 --- gcc/ChangeLog | 11 +++++++++ gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/g++.dg/tm/pr51516.C | 1 - gcc/testsuite/gcc.dg/tm/clone-1.c | 13 +++++++++++ gcc/trans-mem.c | 39 +++++++++++++++++++------------ 5 files changed, 53 insertions(+), 16 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tm/clone-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c725501020f..815e9543567 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2012-11-19 Aldy Hernandez + + * trans-mem (collect_bb2reg): Stop scanning at irrevocable blocks. + (get_bb_regions_instrumented): Add new traverse_clone argument and + use it. + (expand_regions_1): Same. + (expand_region): Same. + (execute_tm_mark): Pass new argument to expand_regions. + (expand_block_edges): Pass new argument to + get_bb_regions_instrumented. + 2012-11-19 Sofiane Naci * config/aarch64/aarch64.c diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 68d9738bbb6..f706c43ae68 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-11-19 Aldy Hernandez + + * g++.dg/tm/pr51516.C: Adjust for uninstrumented code path. + * gcc.dg/tm/clone-1.c: New test. + 2012-11-19 Paolo Carlini PR c++/55368 diff --git a/gcc/testsuite/g++.dg/tm/pr51516.C b/gcc/testsuite/g++.dg/tm/pr51516.C index c13ae47fcb8..4e9100651f7 100644 --- a/gcc/testsuite/g++.dg/tm/pr51516.C +++ b/gcc/testsuite/g++.dg/tm/pr51516.C @@ -18,5 +18,4 @@ int main() } /* { dg-final { scan-assembler-not "_ITM_getTMCloneOrIrrevocable" } } */ -/* { dg-final { scan-tree-dump-times ";; Function C::C" 1 "optimized" } } */ /* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tm/clone-1.c b/gcc/testsuite/gcc.dg/tm/clone-1.c new file mode 100644 index 00000000000..4050adddc55 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tm/clone-1.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-fgnu-tm -fdump-tree-tmmark" } */ + +int foo; + +__attribute__((transaction_callable)) +void cloneme() +{ + foo = 666; +} + +/* { dg-final { scan-tree-dump-times "ITM_WU.*foo" 1 "tmmark" } } */ +/* { dg-final { cleanup-tree-dump "tmmark" } } */ diff --git a/gcc/trans-mem.c b/gcc/trans-mem.c index 4edb98598ec..15c02bdc48a 100644 --- a/gcc/trans-mem.c +++ b/gcc/trans-mem.c @@ -138,7 +138,7 @@ static void *expand_regions (struct tm_region *, void *(*callback)(struct tm_region *, void *), - void *); + void *, bool); /* Return the attributes we want to examine for X, or NULL if it's not @@ -2455,7 +2455,7 @@ collect_bb2reg (struct tm_region *region, void *data) region->exit_blocks, region->irr_blocks, NULL, - /*stop_at_irr_p=*/false); + /*stop_at_irr_p=*/true); // We expect expand_region to perform a post-order traversal of the region // tree. Therefore the last region seen for any bb is the innermost. @@ -2489,14 +2489,14 @@ collect_bb2reg (struct tm_region *region, void *data) // only known instance of this block sharing. static vec -get_bb_regions_instrumented (void) +get_bb_regions_instrumented (bool traverse_clones) { unsigned n = last_basic_block; vec ret; ret.create (n); ret.safe_grow_cleared (n); - expand_regions (all_tm_regions, collect_bb2reg, &ret); + expand_regions (all_tm_regions, collect_bb2reg, &ret, traverse_clones); return ret; } @@ -2824,11 +2824,13 @@ execute_tm_mark (void) { pending_edge_inserts_p = false; - expand_regions (all_tm_regions, generate_tm_state, NULL); + expand_regions (all_tm_regions, generate_tm_state, NULL, + /*traverse_clones=*/true); tm_log_init (); - vec bb_regions = get_bb_regions_instrumented (); + vec bb_regions + = get_bb_regions_instrumented (/*traverse_clones=*/true); struct tm_region *r; unsigned i; @@ -2842,7 +2844,8 @@ execute_tm_mark (void) propagate_tm_flags_out (all_tm_regions); // Expand GIMPLE_TRANSACTIONs into calls into the runtime. - expand_regions (all_tm_regions, expand_transaction, NULL); + expand_regions (all_tm_regions, expand_transaction, NULL, + /*traverse_clones=*/false); tm_log_emit (); tm_log_delete (); @@ -2998,7 +3001,8 @@ expand_block_edges (struct tm_region *const region, basic_block bb) static unsigned int execute_tm_edges (void) { - vec bb_regions = get_bb_regions_instrumented (); + vec bb_regions + = get_bb_regions_instrumented (/*traverse_clones=*/false); struct tm_region *r; unsigned i; @@ -3042,15 +3046,18 @@ struct gimple_opt_pass pass_tm_edges = /* Helper function for expand_regions. Expand REGION and recurse to the inner region. Call CALLBACK on each region. CALLBACK returns NULL to continue the traversal, otherwise a non-null value which - this function will return as well. */ + this function will return as well. TRAVERSE_CLONES is true if we + should traverse transactional clones. */ static void * expand_regions_1 (struct tm_region *region, void *(*callback)(struct tm_region *, void *), - void *data) + void *data, + bool traverse_clones) { void *retval = NULL; - if (region->exit_blocks) + if (region->exit_blocks + || (traverse_clones && decl_is_tm_clone (current_function_decl))) { retval = callback (region, data); if (retval) @@ -3058,7 +3065,7 @@ expand_regions_1 (struct tm_region *region, } if (region->inner) { - retval = expand_regions (region->inner, callback, data); + retval = expand_regions (region->inner, callback, data, traverse_clones); if (retval) return retval; } @@ -3068,17 +3075,19 @@ expand_regions_1 (struct tm_region *region, /* Traverse the regions enclosed and including REGION. Execute CALLBACK for each region, passing DATA. CALLBACK returns NULL to continue the traversal, otherwise a non-null value which this - function will return as well. */ + function will return as well. TRAVERSE_CLONES is true if we should + traverse transactional clones. */ static void * expand_regions (struct tm_region *region, void *(*callback)(struct tm_region *, void *), - void *data) + void *data, + bool traverse_clones) { void *retval = NULL; while (region) { - retval = expand_regions_1 (region, callback, data); + retval = expand_regions_1 (region, callback, data, traverse_clones); if (retval) return retval; region = region->next;