[hsa] Consodlidate GTY roots for trees used during expansion to HSA
authorMartin Jambor <mjambor@suse.cz>
Mon, 7 Mar 2016 18:31:53 +0000 (19:31 +0100)
committerMartin Jambor <jamborm@gcc.gnu.org>
Mon, 7 Mar 2016 18:31:53 +0000 (19:31 +0100)
2016-03-07  Martin Jambor  <mjambor@suse.cz>

* hsa.h (hsa_get_ctor_statements): Declare.
(hsa_get_dtor_statements): Likewise.
(hsa_get_kernel_dispatch_type): Likewise.
* hsa.c (hsa_get_ctor_statements): New function.
(hsa_get_dtor_statements): Likewise.
(hsa_get_kernel_dispatch_type): Likewise.
* hsa-brig.c (hsa_cdtor_statements): Removed.
(hsa_output_libgomp_mapping): Use hsa_get_ctor_statements and
hsa_get_dtor_statements.
* hsa-gen.c (hsa_kernel_dispatch_type): Removed.
(get_hsa_kernel_dispatch_offset): Use hsa_get_kernel_dispatch_type.

From-SVN: r234042

gcc/ChangeLog
gcc/hsa-brig.c
gcc/hsa-gen.c
gcc/hsa.c
gcc/hsa.h

index 8db785068a5eb2daf9219d828e7c916b2eadafa5..6a143ba94b54c44a67fe121405084db579969447 100644 (file)
@@ -1,3 +1,17 @@
+2016-03-07  Martin Jambor  <mjambor@suse.cz>
+
+       * hsa.h (hsa_get_ctor_statements): Declare.
+       (hsa_get_dtor_statements): Likewise.
+       (hsa_get_kernel_dispatch_type): Likewise.
+       * hsa.c (hsa_get_ctor_statements): New function.
+       (hsa_get_dtor_statements): Likewise.
+       (hsa_get_kernel_dispatch_type): Likewise.
+       * hsa-brig.c (hsa_cdtor_statements): Removed.
+       (hsa_output_libgomp_mapping): Use hsa_get_ctor_statements and
+       hsa_get_dtor_statements.
+       * hsa-gen.c (hsa_kernel_dispatch_type): Removed.
+       (get_hsa_kernel_dispatch_offset): Use hsa_get_kernel_dispatch_type.
+
 2016-03-07  Andre Vieira  <andre.simoesdiasvieira@arm.com>
 
        * config/arm/arm-cores.def (cortex-r8): New.
index 61cfd8b8c2383d93bd8e316bd3b7c465df3ab149..2a301be81060928a8519312be15728b9f2677280 100644 (file)
@@ -2006,8 +2006,6 @@ hsa_brig_emit_omp_symbols (void)
   emit_directive_variable (hsa_num_threads);
 }
 
-static GTY(()) tree hsa_cdtor_statements[2];
-
 /* Create and return __hsa_global_variables symbol that contains
    all informations consumed by libgomp to link global variables
    with their string names used by an HSA kernel.  */
@@ -2408,6 +2406,7 @@ hsa_output_libgomp_mapping (tree brig_decl)
     = builtin_decl_explicit (BUILT_IN_GOMP_OFFLOAD_REGISTER);
   gcc_checking_assert (offload_register);
 
+  tree *hsa_ctor_stmts = hsa_get_ctor_statements ();
   append_to_statement_list
     (build_call_expr (offload_register, 4,
                      build_int_cstu (unsigned_type_node,
@@ -2416,15 +2415,15 @@ hsa_output_libgomp_mapping (tree brig_decl)
                      build_fold_addr_expr (hsa_libgomp_host_table),
                      build_int_cst (integer_type_node, GOMP_DEVICE_HSA),
                      build_fold_addr_expr (hsa_img_descriptor)),
-     &hsa_cdtor_statements[0]);
+     hsa_ctor_stmts);
 
-  cgraph_build_static_cdtor ('I', hsa_cdtor_statements[0],
-                            DEFAULT_INIT_PRIORITY);
+  cgraph_build_static_cdtor ('I', *hsa_ctor_stmts, DEFAULT_INIT_PRIORITY);
 
   tree offload_unregister
     = builtin_decl_explicit (BUILT_IN_GOMP_OFFLOAD_UNREGISTER);
   gcc_checking_assert (offload_unregister);
 
+  tree *hsa_dtor_stmts = hsa_get_dtor_statements ();
   append_to_statement_list
     (build_call_expr (offload_unregister, 4,
                      build_int_cstu (unsigned_type_node,
@@ -2433,9 +2432,8 @@ hsa_output_libgomp_mapping (tree brig_decl)
                      build_fold_addr_expr (hsa_libgomp_host_table),
                      build_int_cst (integer_type_node, GOMP_DEVICE_HSA),
                      build_fold_addr_expr (hsa_img_descriptor)),
-     &hsa_cdtor_statements[1]);
-  cgraph_build_static_cdtor ('D', hsa_cdtor_statements[1],
-                            DEFAULT_INIT_PRIORITY);
+     hsa_dtor_stmts);
+  cgraph_build_static_cdtor ('D', *hsa_dtor_stmts, DEFAULT_INIT_PRIORITY);
 }
 
 /* Emit the brig module we have compiled to a section in the final assembly and
index 4881f24206b4c9cd63f3c2b1007c54ad136de4fd..5939a577f3f4a2a46d82672e68e16f9aec7f8899 100644 (file)
@@ -3772,20 +3772,19 @@ gen_set_num_threads (tree value, hsa_bb *hbb)
   hbb->append_insn (basic);
 }
 
-static GTY (()) tree hsa_kernel_dispatch_type = NULL;
-
 /* Return byte offset of a FIELD_NAME in GOMP_hsa_kernel_dispatch which
    is defined in plugin-hsa.c.  */
 
 static HOST_WIDE_INT
 get_hsa_kernel_dispatch_offset (const char *field_name)
 {
-  if (hsa_kernel_dispatch_type == NULL)
+  tree *hsa_kernel_dispatch_type = hsa_get_kernel_dispatch_type ();
+  if (*hsa_kernel_dispatch_type == NULL)
     {
       /* Collection of information needed for a dispatch of a kernel from a
         kernel.  Keep in sync with libgomp's plugin-hsa.c.  */
 
-      hsa_kernel_dispatch_type = make_node (RECORD_TYPE);
+      *hsa_kernel_dispatch_type = make_node (RECORD_TYPE);
       tree id_f1 = build_decl (BUILTINS_LOCATION, FIELD_DECL,
                               get_identifier ("queue"), ptr_type_node);
       DECL_CHAIN (id_f1) = NULL_TREE;
@@ -3835,12 +3834,12 @@ get_hsa_kernel_dispatch_offset (const char *field_name)
       DECL_CHAIN (id_f12) = id_f11;
 
 
-      finish_builtin_struct (hsa_kernel_dispatch_type, "__hsa_kernel_dispatch",
+      finish_builtin_struct (*hsa_kernel_dispatch_type, "__hsa_kernel_dispatch",
                             id_f12, NULL_TREE);
-      TYPE_ARTIFICIAL (hsa_kernel_dispatch_type) = 1;
+      TYPE_ARTIFICIAL (*hsa_kernel_dispatch_type) = 1;
     }
 
-  for (tree chain = TYPE_FIELDS (hsa_kernel_dispatch_type);
+  for (tree chain = TYPE_FIELDS (*hsa_kernel_dispatch_type);
        chain != NULL_TREE; chain = TREE_CHAIN (chain))
     if (strcmp (field_name, IDENTIFIER_POINTER (DECL_NAME (chain))) == 0)
       return int_byte_position (chain);
index 09bfd28b4378866f9af64d6efd1ed107657ce132..9eacb59f759633aced8e10014f0756e3262afa70 100644 (file)
--- a/gcc/hsa.c
+++ b/gcc/hsa.c
@@ -712,6 +712,31 @@ hsa_add_kernel_dependency (tree caller, const char *called_function)
   s->safe_push (called_function);
 }
 
+/* Expansion to HSA needs a few gc roots to hold types, constructors etc.  In
+   order to minimize the number of GTY roots, we'll root them all in the
+   following array.  The individual elements should only be accessed by the
+   very simple getters (of a pointer-to-tree) below.  */
+
+static GTY(()) tree hsa_tree_gt_roots[3];
+
+tree *
+hsa_get_ctor_statements (void)
+{
+  return &hsa_tree_gt_roots[0];
+}
+
+tree *
+hsa_get_dtor_statements (void)
+{
+  return &hsa_tree_gt_roots[1];
+}
+
+tree *
+hsa_get_kernel_dispatch_type (void)
+{
+  return &hsa_tree_gt_roots[2];
+}
+
 /* Modify the name P in-place so that it is a valid HSA identifier.  */
 
 void
index 3a13fbd147a636ac1019e67805710631cf7f9ab1..6a7c651ce9bc0c9100a0893c9b034c65f15c26ba 100644 (file)
--- a/gcc/hsa.h
+++ b/gcc/hsa.h
@@ -1353,6 +1353,9 @@ char *hsa_get_decl_kernel_mapping_name (unsigned i);
 unsigned hsa_get_decl_kernel_mapping_omp_size (unsigned i);
 bool hsa_get_decl_kernel_mapping_gridified (unsigned i);
 void hsa_free_decl_kernel_mapping (void);
+tree *hsa_get_ctor_statements (void);
+tree *hsa_get_dtor_statements (void);
+tree *hsa_get_kernel_dispatch_type (void);
 void hsa_add_kernel_dependency (tree caller, const char *called_function);
 void hsa_sanitize_name (char *p);
 char *hsa_brig_function_name (const char *p);