trans-mem (collect_bb2reg): Stop scanning at irrevocable
authorAldy Hernandez <aldyh@redhat.com>
Mon, 19 Nov 2012 18:43:40 +0000 (18:43 +0000)
committerAldy Hernandez <aldyh@gcc.gnu.org>
Mon, 19 Nov 2012 18:43:40 +0000 (18:43 +0000)
* 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
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/tm/pr51516.C
gcc/testsuite/gcc.dg/tm/clone-1.c [new file with mode: 0644]
gcc/trans-mem.c

index c725501..815e954 100644 (file)
@@ -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
index 68d9738..f706c43 100644 (file)
@@ -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
index c13ae47..4e91006 100644 (file)
@@ -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 (file)
index 0000000..4050add
--- /dev/null
@@ -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" } } */
index 4edb985..15c02bd 100644 (file)
 
 static void *expand_regions (struct tm_region *,
                             void *(*callback)(struct tm_region *, void *),
-                            void *);
+                            void *, bool);
 
 \f
 /* 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;