diff mbox

[hsa] Back-end enhancement

Message ID 56549CD4.6010304@suse.cz
State New
Headers show

Commit Message

Martin Liška Nov. 24, 2015, 5:22 p.m. UTC
Hi.

Following small series enhances HSA back-end in following manner:

1) HSA: support alloca builtin
2) HSA: dump alignment of mem and alloca instructions
3) HSA: write back OMP arguments after a kernel dispatch

All patches have been committed to the branch.

Martin
diff mbox

Patch

From df55b9103bf00e435984eab7a2cd50a3eaf80ef3 Mon Sep 17 00:00:00 2001
From: marxin <mliska@suse.cz>
Date: Tue, 24 Nov 2015 16:55:55 +0100
Subject: [PATCH 3/4] HSA: write back OMP arguments after a kernel dispatch

gcc/ChangeLog:

2015-11-24  Martin Liska  <mliska@suse.cz>

	* hsa-gen.c (gen_hsa_insns_for_kernel_call): Copy back OMP
	argument that is copied to a dispatched kernel.
---
 gcc/hsa-gen.c | 23 ++++++++++++++++++-----
 1 file changed, 18 insertions(+), 5 deletions(-)

diff --git a/gcc/hsa-gen.c b/gcc/hsa-gen.c
index b39123d..75facec 100644
--- a/gcc/hsa-gen.c
+++ b/gcc/hsa-gen.c
@@ -4009,10 +4009,10 @@  gen_hsa_insns_for_kernel_call (hsa_bb *hbb, gcall *call)
 
   tree argument = gimple_call_arg (call, 1);
 
+  hsa_symbol *omp_var_decl = NULL;
   if (TREE_CODE (argument) == ADDR_EXPR)
     {
       /* Emit instructions that copy OMP arguments.  */
-
       tree d = TREE_TYPE (TREE_OPERAND (argument, 0));
       unsigned omp_data_size = tree_to_uhwi (TYPE_SIZE_UNIT (d));
       gcc_checking_assert (omp_data_size > 0);
@@ -4020,12 +4020,12 @@  gen_hsa_insns_for_kernel_call (hsa_bb *hbb, gcall *call)
       if (omp_data_size > hsa_cfun->m_maximum_omp_data_size)
 	hsa_cfun->m_maximum_omp_data_size = omp_data_size;
 
-      hsa_symbol *var_decl = get_symbol_for_decl (TREE_OPERAND (argument, 0));
+      omp_var_decl = get_symbol_for_decl (TREE_OPERAND (argument, 0));
 
-      hbb->append_insn (new hsa_insn_comment ("memory copy instructions"));
+      hbb->append_insn (new hsa_insn_comment ("OMP arg memcpy instructions"));
 
-      hsa_op_address *src_addr = new hsa_op_address (var_decl);
-      gen_hsa_memory_copy (hbb, dst_addr, src_addr, var_decl->m_dim);
+      hsa_op_address *src_addr = new hsa_op_address (omp_var_decl);
+      gen_hsa_memory_copy (hbb, dst_addr, src_addr, omp_var_decl->m_dim);
     }
   else if (integer_zerop (argument))
     {
@@ -4107,6 +4107,8 @@  gen_hsa_insns_for_kernel_call (hsa_bb *hbb, gcall *call)
   basic_block dest = split_edge (e);
   edge false_e = EDGE_SUCC (dest, 0);
 
+  basic_block memcpy_dest = split_edge (false_e);
+
   false_e->flags &= ~EDGE_FALLTHRU;
   false_e->flags |= EDGE_FALSE_VALUE;
 
@@ -4114,6 +4116,7 @@  gen_hsa_insns_for_kernel_call (hsa_bb *hbb, gcall *call)
 
   /* Emit blocking signal waiting instruction.  */
   hsa_bb *new_hbb = hsa_init_new_bb (dest);
+  hsa_bb *memcpy_hbb = hsa_init_new_bb (memcpy_dest);
 
   hbb->append_insn (new hsa_insn_comment ("wait for the signal"));
 
@@ -4137,6 +4140,16 @@  gen_hsa_insns_for_kernel_call (hsa_bb *hbb, gcall *call)
   new_hbb->append_insn (cmp);
   new_hbb->append_insn (new hsa_insn_br (ctrl));
 
+  if (TREE_CODE (argument) == ADDR_EXPR)
+    {
+      /* Emit instructions that copy back OMP arguments to a caller kernel.  */
+      memcpy_hbb->append_insn
+	(new hsa_insn_comment ("OMP arg memcpy back instructions"));
+
+      hsa_op_address *src_addr = new hsa_op_address (omp_var_decl);
+      gen_hsa_memory_copy (memcpy_hbb, src_addr, dst_addr, omp_var_decl->m_dim);
+    }
+
   hsa_cfun->m_kernel_dispatch_count++;
 }
 
-- 
2.6.3