]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gcn: Add __builtin_gcn_kernarg_ptr
authorTobias Burnus <tobias@codesourcery.com>
Fri, 18 Nov 2022 09:46:48 +0000 (10:46 +0100)
committerTobias Burnus <tobias@codesourcery.com>
Fri, 18 Nov 2022 09:46:48 +0000 (10:46 +0100)
Add __builtin_gcn_kernarg_ptr to avoid using hard-coded register values
and permit future ABI changes while keeping the API.

gcc/ChangeLog:

* config/gcn/gcn-builtins.def (KERNARG_PTR): Add.
* config/gcn/gcn.cc (gcn_init_builtin_types): Change siptr_type_node,
sfptr_type_node and voidptr_type_node from FLAT to ADDR_SPACE_DEFAULT.
(gcn_expand_builtin_1): Handle GCN_BUILTIN_KERNARG_PTR.
(gcn_oacc_dim_size): Return in ADDR_SPACE_FLAT.

libgomp/ChangeLog:

* config/gcn/team.c (gomp_gcn_enter_kernel): Use
__builtin_gcn_kernarg_ptr instead of asm ("s8").

Co-Authored-By: Andrew Stubbs <ams@codesourcery.com>
(cherry picked from commit 6f83861cc1c4d09425aa6539877bfa50ef90f183)

gcc/ChangeLog.omp
gcc/config/gcn/gcn-builtins.def
gcc/config/gcn/gcn.cc
libgomp/ChangeLog.omp
libgomp/config/gcn/team.c

index 61651fbfe37c3f0d84b4acff6f272ee1ffdfaf14..fd420ef3431918176ff0f06065fd6dce3c44b3b6 100644 (file)
@@ -1,3 +1,15 @@
+2022-11-18  Tobias Burnus  <tobias@codesourcery.com>
+
+       Backported from master:
+       2022-11-16  Tobias Burnus  <tobias@codesourcery.com>
+                   Andrew Stubbs  <ams@codesourcery.com>
+
+       * config/gcn/gcn-builtins.def (KERNARG_PTR): Add.
+       * config/gcn/gcn.cc (gcn_init_builtin_types): Change siptr_type_node,
+       sfptr_type_node and voidptr_type_node from FLAT to ADDR_SPACE_DEFAULT.
+       (gcn_expand_builtin_1): Handle GCN_BUILTIN_KERNARG_PTR.
+       (gcn_oacc_dim_size): Return in ADDR_SPACE_FLAT.
+
 2022-11-16  Tobias Burnus  <tobias@codesourcery.com>
 
        Backported from master:
index c50777bd3b02df9ed093e2ad291e738dc188d613..eeeaebf9013256afaf8c17b56efc6eaab0edbf61 100644 (file)
@@ -158,6 +158,10 @@ DEF_BUILTIN (ACC_SINGLE_COPY_END, -1, "single_copy_end", B_INSN,
 DEF_BUILTIN (ACC_BARRIER, -1, "acc_barrier", B_INSN, _A1 (GCN_BTI_VOID),
             gcn_expand_builtin_1)
 
+/* Kernel inputs.  */
+
+DEF_BUILTIN (KERNARG_PTR, -1, "kernarg_ptr", B_INSN, _A1 (GCN_BTI_VOIDPTR),
+            gcn_expand_builtin_1)
 
 #undef _A1
 #undef _A2
index 884703249aed6d94a20e8caaacdd5c185dd6ad63..0d076aaa1a503f88019f35b0f98f92f1fc78be5a 100644 (file)
@@ -4091,15 +4091,15 @@ gcn_init_builtin_types (void)
                                          (integer_type_node) */
                                        , 64);
   tree tmp = build_distinct_type_copy (intSI_type_node);
-  TYPE_ADDR_SPACE (tmp) = ADDR_SPACE_FLAT;
+  TYPE_ADDR_SPACE (tmp) = ADDR_SPACE_DEFAULT;
   siptr_type_node = build_pointer_type (tmp);
 
   tmp = build_distinct_type_copy (float_type_node);
-  TYPE_ADDR_SPACE (tmp) = ADDR_SPACE_FLAT;
+  TYPE_ADDR_SPACE (tmp) = ADDR_SPACE_DEFAULT;
   sfptr_type_node = build_pointer_type (tmp);
 
   tmp = build_distinct_type_copy (void_type_node);
-  TYPE_ADDR_SPACE (tmp) = ADDR_SPACE_FLAT;
+  TYPE_ADDR_SPACE (tmp) = ADDR_SPACE_DEFAULT;
   voidptr_type_node = build_pointer_type (tmp);
 
   tmp = build_distinct_type_copy (void_type_node);
@@ -4526,6 +4526,20 @@ gcn_expand_builtin_1 (tree exp, rtx target, rtx /*subtarget */ ,
       emit_insn (gen_gcn_wavefront_barrier ());
       return target;
 
+    case GCN_BUILTIN_KERNARG_PTR:
+      {
+       rtx ptr;
+       if (cfun->machine->args.reg[KERNARG_SEGMENT_PTR_ARG] >= 0)
+          ptr = gen_rtx_REG (DImode,
+                             cfun->machine->args.reg[KERNARG_SEGMENT_PTR_ARG]);
+       else
+         {
+           ptr = gen_reg_rtx (DImode);
+           emit_move_insn (ptr, const0_rtx);
+         }
+       return ptr;
+      }
+
     default:
       gcc_unreachable ();
     }
@@ -5840,7 +5854,9 @@ gcn_oacc_dim_size (int dim)
                                        cfun->machine->args.
                                        reg[DISPATCH_PTR_ARG]),
                           GEN_INT (offset[dim]));
-  return gen_rtx_MEM (SImode, addr);
+  rtx mem = gen_rtx_MEM (SImode, addr);
+  set_mem_addr_space (mem, ADDR_SPACE_SCALAR_FLAT);
+  return mem;
 }
 
 /* Helper function for oacc_dim_pos instruction.
index 7e117fd50101e753e97329c04b76e48b598a3692..136b6f0d7f17106139205debf9d0289e085d5725 100644 (file)
@@ -1,3 +1,12 @@
+2022-11-18  Tobias Burnus  <tobias@codesourcery.com>
+
+       Backported from master:
+       2022-11-16  Tobias Burnus  <tobias@codesourcery.com>
+                   Andrew Stubbs  <ams@codesourcery.com>
+
+       * config/gcn/team.c (gomp_gcn_enter_kernel): Use
+       __builtin_gcn_kernarg_ptr instead of asm ("s8").
+
 2022-11-14  Tobias Burnus  <tobias@codesourcery.com>
 
        Backport from mainline:
index 70fbf6f482278c9c956e193ceb3b99e7696454c3..7cf4c0be3cc0cd8af30ae0207bc630280b22957b 100644 (file)
@@ -60,7 +60,7 @@ gomp_gcn_enter_kernel (void)
       /* Initialize the team arena for optimized memory allocation.
          The arena has been allocated on the host side, and the address
          passed in via the kernargs.  Each team takes a small slice of it.  */
-      register void **kernargs asm("s8");
+      void **kernargs = (void**) __builtin_gcn_kernarg_ptr ();
       void *team_arena = (kernargs[4] + TEAM_ARENA_SIZE*teamid);
       void * __lds *arena_start = (void * __lds *)TEAM_ARENA_START;
       void * __lds *arena_free = (void * __lds *)TEAM_ARENA_FREE;