aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2012-11-19 18:43:40 +0000
committerAldy Hernandez <aldyh@gcc.gnu.org>2012-11-19 18:43:40 +0000
commitb5e10eac5663910ecc0b40610673852daf975303 (patch)
treeaa1ba4fc759aa5ff20f4e98faa2eddae01784b4a
parenta59a2c21161f5a0f9dadf1dd2dc60377de75c21e (diff)
downloadgcc-b5e10eac5663910ecc0b40610673852daf975303.zip
gcc-b5e10eac5663910ecc0b40610673852daf975303.tar.gz
gcc-b5e10eac5663910ecc0b40610673852daf975303.tar.bz2
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
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/tm/pr51516.C1
-rw-r--r--gcc/testsuite/gcc.dg/tm/clone-1.c13
-rw-r--r--gcc/trans-mem.c39
5 files changed, 53 insertions, 16 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c725501..815e954 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,14 @@
+2012-11-19 Aldy Hernandez <aldyh@redhat.com>
+
+ * 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 <sofiane.naci@arm.com>
* config/aarch64/aarch64.c
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 68d9738..f706c43 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2012-11-19 Aldy Hernandez <aldyh@redhat.com>
+
+ * g++.dg/tm/pr51516.C: Adjust for uninstrumented code path.
+ * gcc.dg/tm/clone-1.c: New test.
+
2012-11-19 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/55368
diff --git a/gcc/testsuite/g++.dg/tm/pr51516.C b/gcc/testsuite/g++.dg/tm/pr51516.C
index c13ae47..4e910065 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 0000000..4050add
--- /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 4edb985..15c02bd 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<tm_region_p>
-get_bb_regions_instrumented (void)
+get_bb_regions_instrumented (bool traverse_clones)
{
unsigned n = last_basic_block;
vec<tm_region_p> 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<tm_region_p> bb_regions = get_bb_regions_instrumented ();
+ vec<tm_region_p> 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<tm_region_p> bb_regions = get_bb_regions_instrumented ();
+ vec<tm_region_p> 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;