xref: /dragonfly/contrib/gcc-8.0/gcc/hsa-common.c (revision 38fd1498)
1*38fd1498Szrj /* Implementation of commonly needed HSAIL related functions and methods.
2*38fd1498Szrj    Copyright (C) 2013-2018 Free Software Foundation, Inc.
3*38fd1498Szrj    Contributed by Martin Jambor <mjambor@suse.cz> and
4*38fd1498Szrj    Martin Liska <mliska@suse.cz>.
5*38fd1498Szrj 
6*38fd1498Szrj This file is part of GCC.
7*38fd1498Szrj 
8*38fd1498Szrj GCC is free software; you can redistribute it and/or modify
9*38fd1498Szrj it under the terms of the GNU General Public License as published by
10*38fd1498Szrj the Free Software Foundation; either version 3, or (at your option)
11*38fd1498Szrj any later version.
12*38fd1498Szrj 
13*38fd1498Szrj GCC is distributed in the hope that it will be useful,
14*38fd1498Szrj but WITHOUT ANY WARRANTY; without even the implied warranty of
15*38fd1498Szrj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16*38fd1498Szrj GNU General Public License for more details.
17*38fd1498Szrj 
18*38fd1498Szrj You should have received a copy of the GNU General Public License
19*38fd1498Szrj along with GCC; see the file COPYING3.  If not see
20*38fd1498Szrj <http://www.gnu.org/licenses/>.  */
21*38fd1498Szrj 
22*38fd1498Szrj #include "config.h"
23*38fd1498Szrj #include "system.h"
24*38fd1498Szrj #include "coretypes.h"
25*38fd1498Szrj #include "tm.h"
26*38fd1498Szrj #include "is-a.h"
27*38fd1498Szrj #include "hash-set.h"
28*38fd1498Szrj #include "hash-map.h"
29*38fd1498Szrj #include "vec.h"
30*38fd1498Szrj #include "tree.h"
31*38fd1498Szrj #include "dumpfile.h"
32*38fd1498Szrj #include "gimple-pretty-print.h"
33*38fd1498Szrj #include "diagnostic-core.h"
34*38fd1498Szrj #include "alloc-pool.h"
35*38fd1498Szrj #include "cgraph.h"
36*38fd1498Szrj #include "print-tree.h"
37*38fd1498Szrj #include "stringpool.h"
38*38fd1498Szrj #include "symbol-summary.h"
39*38fd1498Szrj #include "hsa-common.h"
40*38fd1498Szrj #include "internal-fn.h"
41*38fd1498Szrj #include "ctype.h"
42*38fd1498Szrj #include "builtins.h"
43*38fd1498Szrj #include "stringpool.h"
44*38fd1498Szrj #include "attribs.h"
45*38fd1498Szrj 
46*38fd1498Szrj /* Structure containing intermediate HSA representation of the generated
47*38fd1498Szrj    function.  */
48*38fd1498Szrj class hsa_function_representation *hsa_cfun;
49*38fd1498Szrj 
50*38fd1498Szrj /* Element of the mapping vector between a host decl and an HSA kernel.  */
51*38fd1498Szrj 
52*38fd1498Szrj struct GTY(()) hsa_decl_kernel_map_element
53*38fd1498Szrj {
54*38fd1498Szrj   /* The decl of the host function.  */
55*38fd1498Szrj   tree decl;
56*38fd1498Szrj   /* Name of the HSA kernel in BRIG.  */
57*38fd1498Szrj   char * GTY((skip)) name;
58*38fd1498Szrj   /* Size of OMP data, if the kernel contains a kernel dispatch.  */
59*38fd1498Szrj   unsigned omp_data_size;
60*38fd1498Szrj   /* True if the function is gridified kernel.  */
61*38fd1498Szrj   bool gridified_kernel_p;
62*38fd1498Szrj };
63*38fd1498Szrj 
64*38fd1498Szrj /* Mapping between decls and corresponding HSA kernels in this compilation
65*38fd1498Szrj    unit.  */
66*38fd1498Szrj 
67*38fd1498Szrj static GTY (()) vec<hsa_decl_kernel_map_element, va_gc>
68*38fd1498Szrj   *hsa_decl_kernel_mapping;
69*38fd1498Szrj 
70*38fd1498Szrj /* Mapping between decls and corresponding HSA kernels
71*38fd1498Szrj    called by the function.  */
72*38fd1498Szrj hash_map <tree, vec <const char *> *> *hsa_decl_kernel_dependencies;
73*38fd1498Szrj 
74*38fd1498Szrj /* Hash function to lookup a symbol for a decl.  */
75*38fd1498Szrj hash_table <hsa_noop_symbol_hasher> *hsa_global_variable_symbols;
76*38fd1498Szrj 
77*38fd1498Szrj /* HSA summaries.  */
78*38fd1498Szrj hsa_summary_t *hsa_summaries = NULL;
79*38fd1498Szrj 
80*38fd1498Szrj /* HSA number of threads.  */
81*38fd1498Szrj hsa_symbol *hsa_num_threads = NULL;
82*38fd1498Szrj 
83*38fd1498Szrj /* HSA function that cannot be expanded to HSAIL.  */
84*38fd1498Szrj hash_set <tree> *hsa_failed_functions = NULL;
85*38fd1498Szrj 
86*38fd1498Szrj /* True if compilation unit-wide data are already allocated and initialized.  */
87*38fd1498Szrj static bool compilation_unit_data_initialized;
88*38fd1498Szrj 
89*38fd1498Szrj /* Return true if FNDECL represents an HSA-callable function.  */
90*38fd1498Szrj 
91*38fd1498Szrj bool
hsa_callable_function_p(tree fndecl)92*38fd1498Szrj hsa_callable_function_p (tree fndecl)
93*38fd1498Szrj {
94*38fd1498Szrj   return (lookup_attribute ("omp declare target", DECL_ATTRIBUTES (fndecl))
95*38fd1498Szrj 	  && !lookup_attribute ("oacc function", DECL_ATTRIBUTES (fndecl)));
96*38fd1498Szrj }
97*38fd1498Szrj 
98*38fd1498Szrj /* Allocate HSA structures that are are used when dealing with different
99*38fd1498Szrj    functions.  */
100*38fd1498Szrj 
101*38fd1498Szrj void
hsa_init_compilation_unit_data(void)102*38fd1498Szrj hsa_init_compilation_unit_data (void)
103*38fd1498Szrj {
104*38fd1498Szrj   if (compilation_unit_data_initialized)
105*38fd1498Szrj     return;
106*38fd1498Szrj 
107*38fd1498Szrj   compilation_unit_data_initialized = true;
108*38fd1498Szrj 
109*38fd1498Szrj   hsa_global_variable_symbols = new hash_table <hsa_noop_symbol_hasher> (8);
110*38fd1498Szrj   hsa_failed_functions = new hash_set <tree> ();
111*38fd1498Szrj   hsa_emitted_internal_decls = new hash_table <hsa_internal_fn_hasher> (2);
112*38fd1498Szrj }
113*38fd1498Szrj 
114*38fd1498Szrj /* Free data structures that are used when dealing with different
115*38fd1498Szrj    functions.  */
116*38fd1498Szrj 
117*38fd1498Szrj void
hsa_deinit_compilation_unit_data(void)118*38fd1498Szrj hsa_deinit_compilation_unit_data (void)
119*38fd1498Szrj {
120*38fd1498Szrj   gcc_assert (compilation_unit_data_initialized);
121*38fd1498Szrj 
122*38fd1498Szrj   delete hsa_failed_functions;
123*38fd1498Szrj   delete hsa_emitted_internal_decls;
124*38fd1498Szrj 
125*38fd1498Szrj   for (hash_table <hsa_noop_symbol_hasher>::iterator it
126*38fd1498Szrj        = hsa_global_variable_symbols->begin ();
127*38fd1498Szrj        it != hsa_global_variable_symbols->end ();
128*38fd1498Szrj        ++it)
129*38fd1498Szrj     {
130*38fd1498Szrj       hsa_symbol *sym = *it;
131*38fd1498Szrj       delete sym;
132*38fd1498Szrj     }
133*38fd1498Szrj 
134*38fd1498Szrj   delete hsa_global_variable_symbols;
135*38fd1498Szrj 
136*38fd1498Szrj   if (hsa_num_threads)
137*38fd1498Szrj     {
138*38fd1498Szrj       delete hsa_num_threads;
139*38fd1498Szrj       hsa_num_threads = NULL;
140*38fd1498Szrj     }
141*38fd1498Szrj 
142*38fd1498Szrj   compilation_unit_data_initialized = false;
143*38fd1498Szrj }
144*38fd1498Szrj 
145*38fd1498Szrj /* Return true if we are generating large HSA machine model.  */
146*38fd1498Szrj 
147*38fd1498Szrj bool
hsa_machine_large_p(void)148*38fd1498Szrj hsa_machine_large_p (void)
149*38fd1498Szrj {
150*38fd1498Szrj   /* FIXME: I suppose this is technically wrong but should work for me now.  */
151*38fd1498Szrj   return (GET_MODE_BITSIZE (Pmode) == 64);
152*38fd1498Szrj }
153*38fd1498Szrj 
154*38fd1498Szrj /* Return the HSA profile we are using.  */
155*38fd1498Szrj 
156*38fd1498Szrj bool
hsa_full_profile_p(void)157*38fd1498Szrj hsa_full_profile_p (void)
158*38fd1498Szrj {
159*38fd1498Szrj   return true;
160*38fd1498Szrj }
161*38fd1498Szrj 
162*38fd1498Szrj /* Return true if a register in operand number OPNUM of instruction
163*38fd1498Szrj    is an output.  False if it is an input.  */
164*38fd1498Szrj 
165*38fd1498Szrj bool
op_output_p(unsigned opnum)166*38fd1498Szrj hsa_insn_basic::op_output_p (unsigned opnum)
167*38fd1498Szrj {
168*38fd1498Szrj   switch (m_opcode)
169*38fd1498Szrj     {
170*38fd1498Szrj     case HSA_OPCODE_PHI:
171*38fd1498Szrj     case BRIG_OPCODE_CBR:
172*38fd1498Szrj     case BRIG_OPCODE_SBR:
173*38fd1498Szrj     case BRIG_OPCODE_ST:
174*38fd1498Szrj     case BRIG_OPCODE_SIGNALNORET:
175*38fd1498Szrj     case BRIG_OPCODE_DEBUGTRAP:
176*38fd1498Szrj       /* FIXME: There are probably missing cases here, double check.  */
177*38fd1498Szrj       return false;
178*38fd1498Szrj     case BRIG_OPCODE_EXPAND:
179*38fd1498Szrj       /* Example: expand_v4_b32_b128 (dest0, dest1, dest2, dest3), src0.  */
180*38fd1498Szrj       return opnum < operand_count () - 1;
181*38fd1498Szrj     default:
182*38fd1498Szrj      return opnum == 0;
183*38fd1498Szrj     }
184*38fd1498Szrj }
185*38fd1498Szrj 
186*38fd1498Szrj /* Return true if OPCODE is an floating-point bit instruction opcode.  */
187*38fd1498Szrj 
188*38fd1498Szrj bool
hsa_opcode_floating_bit_insn_p(BrigOpcode16_t opcode)189*38fd1498Szrj hsa_opcode_floating_bit_insn_p (BrigOpcode16_t opcode)
190*38fd1498Szrj {
191*38fd1498Szrj   switch (opcode)
192*38fd1498Szrj     {
193*38fd1498Szrj     case BRIG_OPCODE_NEG:
194*38fd1498Szrj     case BRIG_OPCODE_ABS:
195*38fd1498Szrj     case BRIG_OPCODE_CLASS:
196*38fd1498Szrj     case BRIG_OPCODE_COPYSIGN:
197*38fd1498Szrj       return true;
198*38fd1498Szrj     default:
199*38fd1498Szrj       return false;
200*38fd1498Szrj     }
201*38fd1498Szrj }
202*38fd1498Szrj 
203*38fd1498Szrj /* Return the number of destination operands for this INSN.  */
204*38fd1498Szrj 
205*38fd1498Szrj unsigned
input_count()206*38fd1498Szrj hsa_insn_basic::input_count ()
207*38fd1498Szrj {
208*38fd1498Szrj   switch (m_opcode)
209*38fd1498Szrj     {
210*38fd1498Szrj       default:
211*38fd1498Szrj 	return 1;
212*38fd1498Szrj 
213*38fd1498Szrj       case BRIG_OPCODE_NOP:
214*38fd1498Szrj 	return 0;
215*38fd1498Szrj 
216*38fd1498Szrj       case BRIG_OPCODE_EXPAND:
217*38fd1498Szrj 	return 2;
218*38fd1498Szrj 
219*38fd1498Szrj       case BRIG_OPCODE_LD:
220*38fd1498Szrj 	/* ld_v[234] not yet handled.  */
221*38fd1498Szrj 	return 1;
222*38fd1498Szrj 
223*38fd1498Szrj       case BRIG_OPCODE_ST:
224*38fd1498Szrj 	return 0;
225*38fd1498Szrj 
226*38fd1498Szrj       case BRIG_OPCODE_ATOMICNORET:
227*38fd1498Szrj 	return 0;
228*38fd1498Szrj 
229*38fd1498Szrj       case BRIG_OPCODE_SIGNAL:
230*38fd1498Szrj 	return 1;
231*38fd1498Szrj 
232*38fd1498Szrj       case BRIG_OPCODE_SIGNALNORET:
233*38fd1498Szrj 	return 0;
234*38fd1498Szrj 
235*38fd1498Szrj       case BRIG_OPCODE_MEMFENCE:
236*38fd1498Szrj 	return 0;
237*38fd1498Szrj 
238*38fd1498Szrj       case BRIG_OPCODE_RDIMAGE:
239*38fd1498Szrj       case BRIG_OPCODE_LDIMAGE:
240*38fd1498Szrj       case BRIG_OPCODE_STIMAGE:
241*38fd1498Szrj       case BRIG_OPCODE_QUERYIMAGE:
242*38fd1498Szrj       case BRIG_OPCODE_QUERYSAMPLER:
243*38fd1498Szrj 	sorry ("HSA image ops not handled");
244*38fd1498Szrj 	return 0;
245*38fd1498Szrj 
246*38fd1498Szrj       case BRIG_OPCODE_CBR:
247*38fd1498Szrj       case BRIG_OPCODE_BR:
248*38fd1498Szrj 	return 0;
249*38fd1498Szrj 
250*38fd1498Szrj       case BRIG_OPCODE_SBR:
251*38fd1498Szrj 	return 0; /* ??? */
252*38fd1498Szrj 
253*38fd1498Szrj       case BRIG_OPCODE_WAVEBARRIER:
254*38fd1498Szrj 	return 0; /* ??? */
255*38fd1498Szrj 
256*38fd1498Szrj       case BRIG_OPCODE_BARRIER:
257*38fd1498Szrj       case BRIG_OPCODE_ARRIVEFBAR:
258*38fd1498Szrj       case BRIG_OPCODE_INITFBAR:
259*38fd1498Szrj       case BRIG_OPCODE_JOINFBAR:
260*38fd1498Szrj       case BRIG_OPCODE_LEAVEFBAR:
261*38fd1498Szrj       case BRIG_OPCODE_RELEASEFBAR:
262*38fd1498Szrj       case BRIG_OPCODE_WAITFBAR:
263*38fd1498Szrj 	return 0;
264*38fd1498Szrj 
265*38fd1498Szrj       case BRIG_OPCODE_LDF:
266*38fd1498Szrj 	return 1;
267*38fd1498Szrj 
268*38fd1498Szrj       case BRIG_OPCODE_ACTIVELANECOUNT:
269*38fd1498Szrj       case BRIG_OPCODE_ACTIVELANEID:
270*38fd1498Szrj       case BRIG_OPCODE_ACTIVELANEMASK:
271*38fd1498Szrj       case BRIG_OPCODE_ACTIVELANEPERMUTE:
272*38fd1498Szrj 	return 1; /* ??? */
273*38fd1498Szrj 
274*38fd1498Szrj       case BRIG_OPCODE_CALL:
275*38fd1498Szrj       case BRIG_OPCODE_SCALL:
276*38fd1498Szrj       case BRIG_OPCODE_ICALL:
277*38fd1498Szrj 	return 0;
278*38fd1498Szrj 
279*38fd1498Szrj       case BRIG_OPCODE_RET:
280*38fd1498Szrj 	return 0;
281*38fd1498Szrj 
282*38fd1498Szrj       case BRIG_OPCODE_ALLOCA:
283*38fd1498Szrj 	return 1;
284*38fd1498Szrj 
285*38fd1498Szrj       case BRIG_OPCODE_CLEARDETECTEXCEPT:
286*38fd1498Szrj 	return 0;
287*38fd1498Szrj 
288*38fd1498Szrj       case BRIG_OPCODE_SETDETECTEXCEPT:
289*38fd1498Szrj 	return 0;
290*38fd1498Szrj 
291*38fd1498Szrj       case BRIG_OPCODE_PACKETCOMPLETIONSIG:
292*38fd1498Szrj       case BRIG_OPCODE_PACKETID:
293*38fd1498Szrj       case BRIG_OPCODE_CASQUEUEWRITEINDEX:
294*38fd1498Szrj       case BRIG_OPCODE_LDQUEUEREADINDEX:
295*38fd1498Szrj       case BRIG_OPCODE_LDQUEUEWRITEINDEX:
296*38fd1498Szrj       case BRIG_OPCODE_STQUEUEREADINDEX:
297*38fd1498Szrj       case BRIG_OPCODE_STQUEUEWRITEINDEX:
298*38fd1498Szrj 	return 1; /* ??? */
299*38fd1498Szrj 
300*38fd1498Szrj       case BRIG_OPCODE_ADDQUEUEWRITEINDEX:
301*38fd1498Szrj 	return 1;
302*38fd1498Szrj 
303*38fd1498Szrj       case BRIG_OPCODE_DEBUGTRAP:
304*38fd1498Szrj 	return 0;
305*38fd1498Szrj 
306*38fd1498Szrj       case BRIG_OPCODE_GROUPBASEPTR:
307*38fd1498Szrj       case BRIG_OPCODE_KERNARGBASEPTR:
308*38fd1498Szrj 	return 1; /* ??? */
309*38fd1498Szrj 
310*38fd1498Szrj       case HSA_OPCODE_ARG_BLOCK:
311*38fd1498Szrj 	return 0;
312*38fd1498Szrj 
313*38fd1498Szrj       case BRIG_KIND_DIRECTIVE_COMMENT:
314*38fd1498Szrj 	return 0;
315*38fd1498Szrj     }
316*38fd1498Szrj }
317*38fd1498Szrj 
318*38fd1498Szrj /* Return the number of source operands for this INSN.  */
319*38fd1498Szrj 
320*38fd1498Szrj unsigned
num_used_ops()321*38fd1498Szrj hsa_insn_basic::num_used_ops ()
322*38fd1498Szrj {
323*38fd1498Szrj   gcc_checking_assert (input_count () <= operand_count ());
324*38fd1498Szrj 
325*38fd1498Szrj   return operand_count () - input_count ();
326*38fd1498Szrj }
327*38fd1498Szrj 
328*38fd1498Szrj /* Set alignment to VALUE.  */
329*38fd1498Szrj 
330*38fd1498Szrj void
set_align(BrigAlignment8_t value)331*38fd1498Szrj hsa_insn_mem::set_align (BrigAlignment8_t value)
332*38fd1498Szrj {
333*38fd1498Szrj   /* TODO: Perhaps remove this dump later on:  */
334*38fd1498Szrj   if (dump_file && (dump_flags & TDF_DETAILS) && value < m_align)
335*38fd1498Szrj     {
336*38fd1498Szrj       fprintf (dump_file, "Decreasing alignment to %u in instruction ", value);
337*38fd1498Szrj       dump_hsa_insn (dump_file, this);
338*38fd1498Szrj     }
339*38fd1498Szrj   m_align = value;
340*38fd1498Szrj }
341*38fd1498Szrj 
342*38fd1498Szrj /* Return size of HSA type T in bits.  */
343*38fd1498Szrj 
344*38fd1498Szrj unsigned
hsa_type_bit_size(BrigType16_t t)345*38fd1498Szrj hsa_type_bit_size (BrigType16_t t)
346*38fd1498Szrj {
347*38fd1498Szrj   switch (t)
348*38fd1498Szrj     {
349*38fd1498Szrj     case BRIG_TYPE_B1:
350*38fd1498Szrj       return 1;
351*38fd1498Szrj 
352*38fd1498Szrj     case BRIG_TYPE_U8:
353*38fd1498Szrj     case BRIG_TYPE_S8:
354*38fd1498Szrj     case BRIG_TYPE_B8:
355*38fd1498Szrj       return 8;
356*38fd1498Szrj 
357*38fd1498Szrj     case BRIG_TYPE_U16:
358*38fd1498Szrj     case BRIG_TYPE_S16:
359*38fd1498Szrj     case BRIG_TYPE_B16:
360*38fd1498Szrj     case BRIG_TYPE_F16:
361*38fd1498Szrj       return 16;
362*38fd1498Szrj 
363*38fd1498Szrj     case BRIG_TYPE_U32:
364*38fd1498Szrj     case BRIG_TYPE_S32:
365*38fd1498Szrj     case BRIG_TYPE_B32:
366*38fd1498Szrj     case BRIG_TYPE_F32:
367*38fd1498Szrj     case BRIG_TYPE_U8X4:
368*38fd1498Szrj     case BRIG_TYPE_U16X2:
369*38fd1498Szrj     case BRIG_TYPE_S8X4:
370*38fd1498Szrj     case BRIG_TYPE_S16X2:
371*38fd1498Szrj     case BRIG_TYPE_F16X2:
372*38fd1498Szrj       return 32;
373*38fd1498Szrj 
374*38fd1498Szrj     case BRIG_TYPE_U64:
375*38fd1498Szrj     case BRIG_TYPE_S64:
376*38fd1498Szrj     case BRIG_TYPE_F64:
377*38fd1498Szrj     case BRIG_TYPE_B64:
378*38fd1498Szrj     case BRIG_TYPE_U8X8:
379*38fd1498Szrj     case BRIG_TYPE_U16X4:
380*38fd1498Szrj     case BRIG_TYPE_U32X2:
381*38fd1498Szrj     case BRIG_TYPE_S8X8:
382*38fd1498Szrj     case BRIG_TYPE_S16X4:
383*38fd1498Szrj     case BRIG_TYPE_S32X2:
384*38fd1498Szrj     case BRIG_TYPE_F16X4:
385*38fd1498Szrj     case BRIG_TYPE_F32X2:
386*38fd1498Szrj 
387*38fd1498Szrj       return 64;
388*38fd1498Szrj 
389*38fd1498Szrj     case BRIG_TYPE_B128:
390*38fd1498Szrj     case BRIG_TYPE_U8X16:
391*38fd1498Szrj     case BRIG_TYPE_U16X8:
392*38fd1498Szrj     case BRIG_TYPE_U32X4:
393*38fd1498Szrj     case BRIG_TYPE_U64X2:
394*38fd1498Szrj     case BRIG_TYPE_S8X16:
395*38fd1498Szrj     case BRIG_TYPE_S16X8:
396*38fd1498Szrj     case BRIG_TYPE_S32X4:
397*38fd1498Szrj     case BRIG_TYPE_S64X2:
398*38fd1498Szrj     case BRIG_TYPE_F16X8:
399*38fd1498Szrj     case BRIG_TYPE_F32X4:
400*38fd1498Szrj     case BRIG_TYPE_F64X2:
401*38fd1498Szrj       return 128;
402*38fd1498Szrj 
403*38fd1498Szrj     default:
404*38fd1498Szrj       gcc_assert (hsa_seen_error ());
405*38fd1498Szrj       return t;
406*38fd1498Szrj     }
407*38fd1498Szrj }
408*38fd1498Szrj 
409*38fd1498Szrj /* Return BRIG bit-type with BITSIZE length.  */
410*38fd1498Szrj 
411*38fd1498Szrj BrigType16_t
hsa_bittype_for_bitsize(unsigned bitsize)412*38fd1498Szrj hsa_bittype_for_bitsize (unsigned bitsize)
413*38fd1498Szrj {
414*38fd1498Szrj   switch (bitsize)
415*38fd1498Szrj     {
416*38fd1498Szrj     case 1:
417*38fd1498Szrj       return BRIG_TYPE_B1;
418*38fd1498Szrj     case 8:
419*38fd1498Szrj       return BRIG_TYPE_B8;
420*38fd1498Szrj     case 16:
421*38fd1498Szrj       return BRIG_TYPE_B16;
422*38fd1498Szrj     case 32:
423*38fd1498Szrj       return BRIG_TYPE_B32;
424*38fd1498Szrj     case 64:
425*38fd1498Szrj       return BRIG_TYPE_B64;
426*38fd1498Szrj     case 128:
427*38fd1498Szrj       return BRIG_TYPE_B128;
428*38fd1498Szrj     default:
429*38fd1498Szrj       gcc_unreachable ();
430*38fd1498Szrj     }
431*38fd1498Szrj }
432*38fd1498Szrj 
433*38fd1498Szrj /* Return BRIG unsigned int type with BITSIZE length.  */
434*38fd1498Szrj 
435*38fd1498Szrj BrigType16_t
hsa_uint_for_bitsize(unsigned bitsize)436*38fd1498Szrj hsa_uint_for_bitsize (unsigned bitsize)
437*38fd1498Szrj {
438*38fd1498Szrj   switch (bitsize)
439*38fd1498Szrj     {
440*38fd1498Szrj     case 8:
441*38fd1498Szrj       return BRIG_TYPE_U8;
442*38fd1498Szrj     case 16:
443*38fd1498Szrj       return BRIG_TYPE_U16;
444*38fd1498Szrj     case 32:
445*38fd1498Szrj       return BRIG_TYPE_U32;
446*38fd1498Szrj     case 64:
447*38fd1498Szrj       return BRIG_TYPE_U64;
448*38fd1498Szrj     default:
449*38fd1498Szrj       gcc_unreachable ();
450*38fd1498Szrj     }
451*38fd1498Szrj }
452*38fd1498Szrj 
453*38fd1498Szrj /* Return BRIG float type with BITSIZE length.  */
454*38fd1498Szrj 
455*38fd1498Szrj BrigType16_t
hsa_float_for_bitsize(unsigned bitsize)456*38fd1498Szrj hsa_float_for_bitsize (unsigned bitsize)
457*38fd1498Szrj {
458*38fd1498Szrj   switch (bitsize)
459*38fd1498Szrj     {
460*38fd1498Szrj     case 16:
461*38fd1498Szrj       return BRIG_TYPE_F16;
462*38fd1498Szrj     case 32:
463*38fd1498Szrj       return BRIG_TYPE_F32;
464*38fd1498Szrj     case 64:
465*38fd1498Szrj       return BRIG_TYPE_F64;
466*38fd1498Szrj     default:
467*38fd1498Szrj       gcc_unreachable ();
468*38fd1498Szrj     }
469*38fd1498Szrj }
470*38fd1498Szrj 
471*38fd1498Szrj /* Return HSA bit-type with the same size as the type T.  */
472*38fd1498Szrj 
473*38fd1498Szrj BrigType16_t
hsa_bittype_for_type(BrigType16_t t)474*38fd1498Szrj hsa_bittype_for_type (BrigType16_t t)
475*38fd1498Szrj {
476*38fd1498Szrj   return hsa_bittype_for_bitsize (hsa_type_bit_size (t));
477*38fd1498Szrj }
478*38fd1498Szrj 
479*38fd1498Szrj /* Return HSA unsigned integer type with the same size as the type T.  */
480*38fd1498Szrj 
481*38fd1498Szrj BrigType16_t
hsa_unsigned_type_for_type(BrigType16_t t)482*38fd1498Szrj hsa_unsigned_type_for_type (BrigType16_t t)
483*38fd1498Szrj {
484*38fd1498Szrj   return hsa_uint_for_bitsize (hsa_type_bit_size (t));
485*38fd1498Szrj }
486*38fd1498Szrj 
487*38fd1498Szrj /* Return true if TYPE is a packed HSA type.  */
488*38fd1498Szrj 
489*38fd1498Szrj bool
hsa_type_packed_p(BrigType16_t type)490*38fd1498Szrj hsa_type_packed_p (BrigType16_t type)
491*38fd1498Szrj {
492*38fd1498Szrj   return (type & BRIG_TYPE_PACK_MASK) != BRIG_TYPE_PACK_NONE;
493*38fd1498Szrj }
494*38fd1498Szrj 
495*38fd1498Szrj /* Return true if and only if TYPE is a floating point number type.  */
496*38fd1498Szrj 
497*38fd1498Szrj bool
hsa_type_float_p(BrigType16_t type)498*38fd1498Szrj hsa_type_float_p (BrigType16_t type)
499*38fd1498Szrj {
500*38fd1498Szrj   switch (type & BRIG_TYPE_BASE_MASK)
501*38fd1498Szrj     {
502*38fd1498Szrj     case BRIG_TYPE_F16:
503*38fd1498Szrj     case BRIG_TYPE_F32:
504*38fd1498Szrj     case BRIG_TYPE_F64:
505*38fd1498Szrj       return true;
506*38fd1498Szrj     default:
507*38fd1498Szrj       return false;
508*38fd1498Szrj     }
509*38fd1498Szrj }
510*38fd1498Szrj 
511*38fd1498Szrj /* Return true if and only if TYPE is an integer number type.  */
512*38fd1498Szrj 
513*38fd1498Szrj bool
hsa_type_integer_p(BrigType16_t type)514*38fd1498Szrj hsa_type_integer_p (BrigType16_t type)
515*38fd1498Szrj {
516*38fd1498Szrj   switch (type & BRIG_TYPE_BASE_MASK)
517*38fd1498Szrj     {
518*38fd1498Szrj     case BRIG_TYPE_U8:
519*38fd1498Szrj     case BRIG_TYPE_U16:
520*38fd1498Szrj     case BRIG_TYPE_U32:
521*38fd1498Szrj     case BRIG_TYPE_U64:
522*38fd1498Szrj     case BRIG_TYPE_S8:
523*38fd1498Szrj     case BRIG_TYPE_S16:
524*38fd1498Szrj     case BRIG_TYPE_S32:
525*38fd1498Szrj     case BRIG_TYPE_S64:
526*38fd1498Szrj       return true;
527*38fd1498Szrj     default:
528*38fd1498Szrj       return false;
529*38fd1498Szrj     }
530*38fd1498Szrj }
531*38fd1498Szrj 
532*38fd1498Szrj /* Return true if and only if TYPE is an bit-type.  */
533*38fd1498Szrj 
534*38fd1498Szrj bool
hsa_btype_p(BrigType16_t type)535*38fd1498Szrj hsa_btype_p (BrigType16_t type)
536*38fd1498Szrj {
537*38fd1498Szrj   switch (type & BRIG_TYPE_BASE_MASK)
538*38fd1498Szrj     {
539*38fd1498Szrj     case BRIG_TYPE_B8:
540*38fd1498Szrj     case BRIG_TYPE_B16:
541*38fd1498Szrj     case BRIG_TYPE_B32:
542*38fd1498Szrj     case BRIG_TYPE_B64:
543*38fd1498Szrj     case BRIG_TYPE_B128:
544*38fd1498Szrj       return true;
545*38fd1498Szrj     default:
546*38fd1498Szrj       return false;
547*38fd1498Szrj     }
548*38fd1498Szrj }
549*38fd1498Szrj 
550*38fd1498Szrj 
551*38fd1498Szrj /* Return HSA alignment encoding alignment to N bits.  */
552*38fd1498Szrj 
553*38fd1498Szrj BrigAlignment8_t
hsa_alignment_encoding(unsigned n)554*38fd1498Szrj hsa_alignment_encoding (unsigned n)
555*38fd1498Szrj {
556*38fd1498Szrj   gcc_assert (n >= 8 && !(n & (n - 1)));
557*38fd1498Szrj   if (n >= 256)
558*38fd1498Szrj     return BRIG_ALIGNMENT_32;
559*38fd1498Szrj 
560*38fd1498Szrj   switch (n)
561*38fd1498Szrj     {
562*38fd1498Szrj     case 8:
563*38fd1498Szrj       return BRIG_ALIGNMENT_1;
564*38fd1498Szrj     case 16:
565*38fd1498Szrj       return BRIG_ALIGNMENT_2;
566*38fd1498Szrj     case 32:
567*38fd1498Szrj       return BRIG_ALIGNMENT_4;
568*38fd1498Szrj     case 64:
569*38fd1498Szrj       return BRIG_ALIGNMENT_8;
570*38fd1498Szrj     case 128:
571*38fd1498Szrj       return BRIG_ALIGNMENT_16;
572*38fd1498Szrj     default:
573*38fd1498Szrj       gcc_unreachable ();
574*38fd1498Szrj     }
575*38fd1498Szrj }
576*38fd1498Szrj 
577*38fd1498Szrj /* Return HSA alignment encoding alignment of T got
578*38fd1498Szrj    by get_object_alignment.  */
579*38fd1498Szrj 
580*38fd1498Szrj BrigAlignment8_t
hsa_object_alignment(tree t)581*38fd1498Szrj hsa_object_alignment (tree t)
582*38fd1498Szrj {
583*38fd1498Szrj   return hsa_alignment_encoding (get_object_alignment (t));
584*38fd1498Szrj }
585*38fd1498Szrj 
586*38fd1498Szrj /* Return byte alignment for given BrigAlignment8_t value.  */
587*38fd1498Szrj 
588*38fd1498Szrj unsigned
hsa_byte_alignment(BrigAlignment8_t alignment)589*38fd1498Szrj hsa_byte_alignment (BrigAlignment8_t alignment)
590*38fd1498Szrj {
591*38fd1498Szrj   gcc_assert (alignment != BRIG_ALIGNMENT_NONE);
592*38fd1498Szrj 
593*38fd1498Szrj   return 1 << (alignment - 1);
594*38fd1498Szrj }
595*38fd1498Szrj 
596*38fd1498Szrj /* Return natural alignment of HSA TYPE.  */
597*38fd1498Szrj 
598*38fd1498Szrj BrigAlignment8_t
hsa_natural_alignment(BrigType16_t type)599*38fd1498Szrj hsa_natural_alignment (BrigType16_t type)
600*38fd1498Szrj {
601*38fd1498Szrj   return hsa_alignment_encoding (hsa_type_bit_size (type & ~BRIG_TYPE_ARRAY));
602*38fd1498Szrj }
603*38fd1498Szrj 
604*38fd1498Szrj /* Call the correct destructor of a HSA instruction.  */
605*38fd1498Szrj 
606*38fd1498Szrj void
hsa_destroy_insn(hsa_insn_basic * insn)607*38fd1498Szrj hsa_destroy_insn (hsa_insn_basic *insn)
608*38fd1498Szrj {
609*38fd1498Szrj   if (hsa_insn_phi *phi = dyn_cast <hsa_insn_phi *> (insn))
610*38fd1498Szrj     phi->~hsa_insn_phi ();
611*38fd1498Szrj   else if (hsa_insn_cbr *br = dyn_cast <hsa_insn_cbr *> (insn))
612*38fd1498Szrj     br->~hsa_insn_cbr ();
613*38fd1498Szrj   else if (hsa_insn_cmp *cmp = dyn_cast <hsa_insn_cmp *> (insn))
614*38fd1498Szrj     cmp->~hsa_insn_cmp ();
615*38fd1498Szrj   else if (hsa_insn_mem *mem = dyn_cast <hsa_insn_mem *> (insn))
616*38fd1498Szrj     mem->~hsa_insn_mem ();
617*38fd1498Szrj   else if (hsa_insn_atomic *atomic = dyn_cast <hsa_insn_atomic *> (insn))
618*38fd1498Szrj     atomic->~hsa_insn_atomic ();
619*38fd1498Szrj   else if (hsa_insn_seg *seg = dyn_cast <hsa_insn_seg *> (insn))
620*38fd1498Szrj     seg->~hsa_insn_seg ();
621*38fd1498Szrj   else if (hsa_insn_call *call = dyn_cast <hsa_insn_call *> (insn))
622*38fd1498Szrj     call->~hsa_insn_call ();
623*38fd1498Szrj   else if (hsa_insn_arg_block *block = dyn_cast <hsa_insn_arg_block *> (insn))
624*38fd1498Szrj     block->~hsa_insn_arg_block ();
625*38fd1498Szrj   else if (hsa_insn_sbr *sbr = dyn_cast <hsa_insn_sbr *> (insn))
626*38fd1498Szrj     sbr->~hsa_insn_sbr ();
627*38fd1498Szrj   else if (hsa_insn_br *br = dyn_cast <hsa_insn_br *> (insn))
628*38fd1498Szrj     br->~hsa_insn_br ();
629*38fd1498Szrj   else if (hsa_insn_comment *comment = dyn_cast <hsa_insn_comment *> (insn))
630*38fd1498Szrj     comment->~hsa_insn_comment ();
631*38fd1498Szrj   else
632*38fd1498Szrj     insn->~hsa_insn_basic ();
633*38fd1498Szrj }
634*38fd1498Szrj 
635*38fd1498Szrj /* Call the correct destructor of a HSA operand.  */
636*38fd1498Szrj 
637*38fd1498Szrj void
hsa_destroy_operand(hsa_op_base * op)638*38fd1498Szrj hsa_destroy_operand (hsa_op_base *op)
639*38fd1498Szrj {
640*38fd1498Szrj   if (hsa_op_code_list *list = dyn_cast <hsa_op_code_list *> (op))
641*38fd1498Szrj     list->~hsa_op_code_list ();
642*38fd1498Szrj   else if (hsa_op_operand_list *list = dyn_cast <hsa_op_operand_list *> (op))
643*38fd1498Szrj     list->~hsa_op_operand_list ();
644*38fd1498Szrj   else if (hsa_op_reg *reg = dyn_cast <hsa_op_reg *> (op))
645*38fd1498Szrj     reg->~hsa_op_reg ();
646*38fd1498Szrj   else if (hsa_op_immed *immed = dyn_cast <hsa_op_immed *> (op))
647*38fd1498Szrj     immed->~hsa_op_immed ();
648*38fd1498Szrj   else
649*38fd1498Szrj     op->~hsa_op_base ();
650*38fd1498Szrj }
651*38fd1498Szrj 
652*38fd1498Szrj /* Create a mapping between the original function DECL and kernel name NAME.  */
653*38fd1498Szrj 
654*38fd1498Szrj void
hsa_add_kern_decl_mapping(tree decl,char * name,unsigned omp_data_size,bool gridified_kernel_p)655*38fd1498Szrj hsa_add_kern_decl_mapping (tree decl, char *name, unsigned omp_data_size,
656*38fd1498Szrj 			   bool gridified_kernel_p)
657*38fd1498Szrj {
658*38fd1498Szrj   hsa_decl_kernel_map_element dkm;
659*38fd1498Szrj   dkm.decl = decl;
660*38fd1498Szrj   dkm.name = name;
661*38fd1498Szrj   dkm.omp_data_size = omp_data_size;
662*38fd1498Szrj   dkm.gridified_kernel_p = gridified_kernel_p;
663*38fd1498Szrj   vec_safe_push (hsa_decl_kernel_mapping, dkm);
664*38fd1498Szrj }
665*38fd1498Szrj 
666*38fd1498Szrj /* Return the number of kernel decl name mappings.  */
667*38fd1498Szrj 
668*38fd1498Szrj unsigned
hsa_get_number_decl_kernel_mappings(void)669*38fd1498Szrj hsa_get_number_decl_kernel_mappings (void)
670*38fd1498Szrj {
671*38fd1498Szrj   return vec_safe_length (hsa_decl_kernel_mapping);
672*38fd1498Szrj }
673*38fd1498Szrj 
674*38fd1498Szrj /* Return the decl in the Ith kernel decl name mapping.  */
675*38fd1498Szrj 
676*38fd1498Szrj tree
hsa_get_decl_kernel_mapping_decl(unsigned i)677*38fd1498Szrj hsa_get_decl_kernel_mapping_decl (unsigned i)
678*38fd1498Szrj {
679*38fd1498Szrj   return (*hsa_decl_kernel_mapping)[i].decl;
680*38fd1498Szrj }
681*38fd1498Szrj 
682*38fd1498Szrj /* Return the name in the Ith kernel decl name mapping.  */
683*38fd1498Szrj 
684*38fd1498Szrj char *
hsa_get_decl_kernel_mapping_name(unsigned i)685*38fd1498Szrj hsa_get_decl_kernel_mapping_name (unsigned i)
686*38fd1498Szrj {
687*38fd1498Szrj   return (*hsa_decl_kernel_mapping)[i].name;
688*38fd1498Szrj }
689*38fd1498Szrj 
690*38fd1498Szrj /* Return maximum OMP size for kernel decl name mapping.  */
691*38fd1498Szrj 
692*38fd1498Szrj unsigned
hsa_get_decl_kernel_mapping_omp_size(unsigned i)693*38fd1498Szrj hsa_get_decl_kernel_mapping_omp_size (unsigned i)
694*38fd1498Szrj {
695*38fd1498Szrj   return (*hsa_decl_kernel_mapping)[i].omp_data_size;
696*38fd1498Szrj }
697*38fd1498Szrj 
698*38fd1498Szrj /* Return if the function is gridified kernel in decl name mapping.  */
699*38fd1498Szrj 
700*38fd1498Szrj bool
hsa_get_decl_kernel_mapping_gridified(unsigned i)701*38fd1498Szrj hsa_get_decl_kernel_mapping_gridified (unsigned i)
702*38fd1498Szrj {
703*38fd1498Szrj   return (*hsa_decl_kernel_mapping)[i].gridified_kernel_p;
704*38fd1498Szrj }
705*38fd1498Szrj 
706*38fd1498Szrj /* Free the mapping between original decls and kernel names.  */
707*38fd1498Szrj 
708*38fd1498Szrj void
hsa_free_decl_kernel_mapping(void)709*38fd1498Szrj hsa_free_decl_kernel_mapping (void)
710*38fd1498Szrj {
711*38fd1498Szrj   if (hsa_decl_kernel_mapping == NULL)
712*38fd1498Szrj     return;
713*38fd1498Szrj 
714*38fd1498Szrj   for (unsigned i = 0; i < hsa_decl_kernel_mapping->length (); ++i)
715*38fd1498Szrj     free ((*hsa_decl_kernel_mapping)[i].name);
716*38fd1498Szrj   ggc_free (hsa_decl_kernel_mapping);
717*38fd1498Szrj }
718*38fd1498Szrj 
719*38fd1498Szrj /* Add new kernel dependency.  */
720*38fd1498Szrj 
721*38fd1498Szrj void
hsa_add_kernel_dependency(tree caller,const char * called_function)722*38fd1498Szrj hsa_add_kernel_dependency (tree caller, const char *called_function)
723*38fd1498Szrj {
724*38fd1498Szrj   if (hsa_decl_kernel_dependencies == NULL)
725*38fd1498Szrj     hsa_decl_kernel_dependencies = new hash_map<tree, vec<const char *> *> ();
726*38fd1498Szrj 
727*38fd1498Szrj   vec <const char *> *s = NULL;
728*38fd1498Szrj   vec <const char *> **slot = hsa_decl_kernel_dependencies->get (caller);
729*38fd1498Szrj   if (slot == NULL)
730*38fd1498Szrj     {
731*38fd1498Szrj       s = new vec <const char *> ();
732*38fd1498Szrj       hsa_decl_kernel_dependencies->put (caller, s);
733*38fd1498Szrj     }
734*38fd1498Szrj   else
735*38fd1498Szrj     s = *slot;
736*38fd1498Szrj 
737*38fd1498Szrj   s->safe_push (called_function);
738*38fd1498Szrj }
739*38fd1498Szrj 
740*38fd1498Szrj /* Expansion to HSA needs a few gc roots to hold types, constructors etc.  In
741*38fd1498Szrj    order to minimize the number of GTY roots, we'll root them all in the
742*38fd1498Szrj    following array.  The individual elements should only be accessed by the
743*38fd1498Szrj    very simple getters (of a pointer-to-tree) below.  */
744*38fd1498Szrj 
745*38fd1498Szrj static GTY(()) tree hsa_tree_gt_roots[3];
746*38fd1498Szrj 
747*38fd1498Szrj tree *
hsa_get_ctor_statements(void)748*38fd1498Szrj hsa_get_ctor_statements (void)
749*38fd1498Szrj {
750*38fd1498Szrj   return &hsa_tree_gt_roots[0];
751*38fd1498Szrj }
752*38fd1498Szrj 
753*38fd1498Szrj tree *
hsa_get_dtor_statements(void)754*38fd1498Szrj hsa_get_dtor_statements (void)
755*38fd1498Szrj {
756*38fd1498Szrj   return &hsa_tree_gt_roots[1];
757*38fd1498Szrj }
758*38fd1498Szrj 
759*38fd1498Szrj tree *
hsa_get_kernel_dispatch_type(void)760*38fd1498Szrj hsa_get_kernel_dispatch_type (void)
761*38fd1498Szrj {
762*38fd1498Szrj   return &hsa_tree_gt_roots[2];
763*38fd1498Szrj }
764*38fd1498Szrj 
765*38fd1498Szrj /* Modify the name P in-place so that it is a valid HSA identifier.  */
766*38fd1498Szrj 
767*38fd1498Szrj void
hsa_sanitize_name(char * p)768*38fd1498Szrj hsa_sanitize_name (char *p)
769*38fd1498Szrj {
770*38fd1498Szrj   for (; *p; p++)
771*38fd1498Szrj     if (*p == '.' || *p == '-')
772*38fd1498Szrj       *p = '_';
773*38fd1498Szrj }
774*38fd1498Szrj 
775*38fd1498Szrj /* Clone the name P, set trailing ampersand and sanitize the name.  */
776*38fd1498Szrj 
777*38fd1498Szrj char *
hsa_brig_function_name(const char * p)778*38fd1498Szrj hsa_brig_function_name (const char *p)
779*38fd1498Szrj {
780*38fd1498Szrj   unsigned len = strlen (p);
781*38fd1498Szrj   char *buf = XNEWVEC (char, len + 2);
782*38fd1498Szrj 
783*38fd1498Szrj   buf[0] = '&';
784*38fd1498Szrj   buf[len + 1] = '\0';
785*38fd1498Szrj   memcpy (buf + 1, p, len);
786*38fd1498Szrj 
787*38fd1498Szrj   hsa_sanitize_name (buf);
788*38fd1498Szrj   return buf;
789*38fd1498Szrj }
790*38fd1498Szrj 
791*38fd1498Szrj /* Add a flatten attribute and disable vectorization for gpu implementation
792*38fd1498Szrj    function decl GDECL.  */
793*38fd1498Szrj 
process_gpu_implementation_attributes(tree gdecl)794*38fd1498Szrj void hsa_summary_t::process_gpu_implementation_attributes (tree gdecl)
795*38fd1498Szrj {
796*38fd1498Szrj   DECL_ATTRIBUTES (gdecl)
797*38fd1498Szrj     = tree_cons (get_identifier ("flatten"), NULL_TREE,
798*38fd1498Szrj 		 DECL_ATTRIBUTES (gdecl));
799*38fd1498Szrj 
800*38fd1498Szrj   tree fn_opts = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (gdecl);
801*38fd1498Szrj   if (fn_opts == NULL_TREE)
802*38fd1498Szrj     fn_opts = optimization_default_node;
803*38fd1498Szrj   fn_opts = copy_node (fn_opts);
804*38fd1498Szrj   TREE_OPTIMIZATION (fn_opts)->x_flag_tree_loop_vectorize = false;
805*38fd1498Szrj   TREE_OPTIMIZATION (fn_opts)->x_flag_tree_slp_vectorize = false;
806*38fd1498Szrj   DECL_FUNCTION_SPECIFIC_OPTIMIZATION (gdecl) = fn_opts;
807*38fd1498Szrj }
808*38fd1498Szrj 
809*38fd1498Szrj void
link_functions(cgraph_node * gpu,cgraph_node * host,hsa_function_kind kind,bool gridified_kernel_p)810*38fd1498Szrj hsa_summary_t::link_functions (cgraph_node *gpu, cgraph_node *host,
811*38fd1498Szrj 			       hsa_function_kind kind, bool gridified_kernel_p)
812*38fd1498Szrj {
813*38fd1498Szrj   hsa_function_summary *gpu_summary = get (gpu);
814*38fd1498Szrj   hsa_function_summary *host_summary = get (host);
815*38fd1498Szrj 
816*38fd1498Szrj   gpu_summary->m_kind = kind;
817*38fd1498Szrj   host_summary->m_kind = kind;
818*38fd1498Szrj 
819*38fd1498Szrj   gpu_summary->m_gpu_implementation_p = true;
820*38fd1498Szrj   host_summary->m_gpu_implementation_p = false;
821*38fd1498Szrj 
822*38fd1498Szrj   gpu_summary->m_gridified_kernel_p = gridified_kernel_p;
823*38fd1498Szrj   host_summary->m_gridified_kernel_p = gridified_kernel_p;
824*38fd1498Szrj 
825*38fd1498Szrj   gpu_summary->m_bound_function = host;
826*38fd1498Szrj   host_summary->m_bound_function = gpu;
827*38fd1498Szrj 
828*38fd1498Szrj   process_gpu_implementation_attributes (gpu->decl);
829*38fd1498Szrj 
830*38fd1498Szrj   /* Create reference between a kernel and a corresponding host implementation
831*38fd1498Szrj      to quarantee LTO streaming to a same LTRANS.  */
832*38fd1498Szrj   if (kind == HSA_KERNEL)
833*38fd1498Szrj     gpu->create_reference (host, IPA_REF_ADDR);
834*38fd1498Szrj }
835*38fd1498Szrj 
836*38fd1498Szrj /* Add a HOST function to HSA summaries.  */
837*38fd1498Szrj 
838*38fd1498Szrj void
hsa_register_kernel(cgraph_node * host)839*38fd1498Szrj hsa_register_kernel (cgraph_node *host)
840*38fd1498Szrj {
841*38fd1498Szrj   if (hsa_summaries == NULL)
842*38fd1498Szrj     hsa_summaries = new hsa_summary_t (symtab);
843*38fd1498Szrj   hsa_function_summary *s = hsa_summaries->get (host);
844*38fd1498Szrj   s->m_kind = HSA_KERNEL;
845*38fd1498Szrj }
846*38fd1498Szrj 
847*38fd1498Szrj /* Add a pair of functions to HSA summaries.  GPU is an HSA implementation of
848*38fd1498Szrj    a HOST function.  */
849*38fd1498Szrj 
850*38fd1498Szrj void
hsa_register_kernel(cgraph_node * gpu,cgraph_node * host)851*38fd1498Szrj hsa_register_kernel (cgraph_node *gpu, cgraph_node *host)
852*38fd1498Szrj {
853*38fd1498Szrj   if (hsa_summaries == NULL)
854*38fd1498Szrj     hsa_summaries = new hsa_summary_t (symtab);
855*38fd1498Szrj   hsa_summaries->link_functions (gpu, host, HSA_KERNEL, true);
856*38fd1498Szrj }
857*38fd1498Szrj 
858*38fd1498Szrj /* Return true if expansion of the current HSA function has already failed.  */
859*38fd1498Szrj 
860*38fd1498Szrj bool
hsa_seen_error(void)861*38fd1498Szrj hsa_seen_error (void)
862*38fd1498Szrj {
863*38fd1498Szrj   return hsa_cfun->m_seen_error;
864*38fd1498Szrj }
865*38fd1498Szrj 
866*38fd1498Szrj /* Mark current HSA function as failed.  */
867*38fd1498Szrj 
868*38fd1498Szrj void
hsa_fail_cfun(void)869*38fd1498Szrj hsa_fail_cfun (void)
870*38fd1498Szrj {
871*38fd1498Szrj   hsa_failed_functions->add (hsa_cfun->m_decl);
872*38fd1498Szrj   hsa_cfun->m_seen_error = true;
873*38fd1498Szrj }
874*38fd1498Szrj 
875*38fd1498Szrj char *
name()876*38fd1498Szrj hsa_internal_fn::name ()
877*38fd1498Szrj {
878*38fd1498Szrj   char *name = xstrdup (internal_fn_name (m_fn));
879*38fd1498Szrj   for (char *ptr = name; *ptr; ptr++)
880*38fd1498Szrj     *ptr = TOLOWER (*ptr);
881*38fd1498Szrj 
882*38fd1498Szrj   const char *suffix = NULL;
883*38fd1498Szrj   if (m_type_bit_size == 32)
884*38fd1498Szrj     suffix = "f";
885*38fd1498Szrj 
886*38fd1498Szrj   if (suffix)
887*38fd1498Szrj     {
888*38fd1498Szrj       char *name2 = concat (name, suffix, NULL);
889*38fd1498Szrj       free (name);
890*38fd1498Szrj       name = name2;
891*38fd1498Szrj     }
892*38fd1498Szrj 
893*38fd1498Szrj   hsa_sanitize_name (name);
894*38fd1498Szrj   return name;
895*38fd1498Szrj }
896*38fd1498Szrj 
897*38fd1498Szrj unsigned
get_arity()898*38fd1498Szrj hsa_internal_fn::get_arity ()
899*38fd1498Szrj {
900*38fd1498Szrj   switch (m_fn)
901*38fd1498Szrj     {
902*38fd1498Szrj     case IFN_ACOS:
903*38fd1498Szrj     case IFN_ASIN:
904*38fd1498Szrj     case IFN_ATAN:
905*38fd1498Szrj     case IFN_COS:
906*38fd1498Szrj     case IFN_EXP:
907*38fd1498Szrj     case IFN_EXP10:
908*38fd1498Szrj     case IFN_EXP2:
909*38fd1498Szrj     case IFN_EXPM1:
910*38fd1498Szrj     case IFN_LOG:
911*38fd1498Szrj     case IFN_LOG10:
912*38fd1498Szrj     case IFN_LOG1P:
913*38fd1498Szrj     case IFN_LOG2:
914*38fd1498Szrj     case IFN_LOGB:
915*38fd1498Szrj     case IFN_SIGNIFICAND:
916*38fd1498Szrj     case IFN_SIN:
917*38fd1498Szrj     case IFN_SQRT:
918*38fd1498Szrj     case IFN_TAN:
919*38fd1498Szrj     case IFN_CEIL:
920*38fd1498Szrj     case IFN_FLOOR:
921*38fd1498Szrj     case IFN_NEARBYINT:
922*38fd1498Szrj     case IFN_RINT:
923*38fd1498Szrj     case IFN_ROUND:
924*38fd1498Szrj     case IFN_TRUNC:
925*38fd1498Szrj       return 1;
926*38fd1498Szrj     case IFN_ATAN2:
927*38fd1498Szrj     case IFN_COPYSIGN:
928*38fd1498Szrj     case IFN_FMOD:
929*38fd1498Szrj     case IFN_POW:
930*38fd1498Szrj     case IFN_REMAINDER:
931*38fd1498Szrj     case IFN_SCALB:
932*38fd1498Szrj     case IFN_LDEXP:
933*38fd1498Szrj       return 2;
934*38fd1498Szrj     case IFN_CLRSB:
935*38fd1498Szrj     case IFN_CLZ:
936*38fd1498Szrj     case IFN_CTZ:
937*38fd1498Szrj     case IFN_FFS:
938*38fd1498Szrj     case IFN_PARITY:
939*38fd1498Szrj     case IFN_POPCOUNT:
940*38fd1498Szrj     default:
941*38fd1498Szrj       /* As we produce sorry message for unknown internal functions,
942*38fd1498Szrj 	 reaching this label is definitely a bug.  */
943*38fd1498Szrj       gcc_unreachable ();
944*38fd1498Szrj     }
945*38fd1498Szrj }
946*38fd1498Szrj 
947*38fd1498Szrj BrigType16_t
get_argument_type(int n)948*38fd1498Szrj hsa_internal_fn::get_argument_type (int n)
949*38fd1498Szrj {
950*38fd1498Szrj   switch (m_fn)
951*38fd1498Szrj     {
952*38fd1498Szrj     case IFN_ACOS:
953*38fd1498Szrj     case IFN_ASIN:
954*38fd1498Szrj     case IFN_ATAN:
955*38fd1498Szrj     case IFN_COS:
956*38fd1498Szrj     case IFN_EXP:
957*38fd1498Szrj     case IFN_EXP10:
958*38fd1498Szrj     case IFN_EXP2:
959*38fd1498Szrj     case IFN_EXPM1:
960*38fd1498Szrj     case IFN_LOG:
961*38fd1498Szrj     case IFN_LOG10:
962*38fd1498Szrj     case IFN_LOG1P:
963*38fd1498Szrj     case IFN_LOG2:
964*38fd1498Szrj     case IFN_LOGB:
965*38fd1498Szrj     case IFN_SIGNIFICAND:
966*38fd1498Szrj     case IFN_SIN:
967*38fd1498Szrj     case IFN_SQRT:
968*38fd1498Szrj     case IFN_TAN:
969*38fd1498Szrj     case IFN_CEIL:
970*38fd1498Szrj     case IFN_FLOOR:
971*38fd1498Szrj     case IFN_NEARBYINT:
972*38fd1498Szrj     case IFN_RINT:
973*38fd1498Szrj     case IFN_ROUND:
974*38fd1498Szrj     case IFN_TRUNC:
975*38fd1498Szrj     case IFN_ATAN2:
976*38fd1498Szrj     case IFN_COPYSIGN:
977*38fd1498Szrj     case IFN_FMOD:
978*38fd1498Szrj     case IFN_POW:
979*38fd1498Szrj     case IFN_REMAINDER:
980*38fd1498Szrj     case IFN_SCALB:
981*38fd1498Szrj       return hsa_float_for_bitsize (m_type_bit_size);
982*38fd1498Szrj     case IFN_LDEXP:
983*38fd1498Szrj       {
984*38fd1498Szrj 	if (n == -1 || n == 0)
985*38fd1498Szrj 	  return hsa_float_for_bitsize (m_type_bit_size);
986*38fd1498Szrj 	else
987*38fd1498Szrj 	  return BRIG_TYPE_S32;
988*38fd1498Szrj       }
989*38fd1498Szrj     default:
990*38fd1498Szrj       /* As we produce sorry message for unknown internal functions,
991*38fd1498Szrj 	 reaching this label is definitely a bug.  */
992*38fd1498Szrj       gcc_unreachable ();
993*38fd1498Szrj     }
994*38fd1498Szrj }
995*38fd1498Szrj 
996*38fd1498Szrj #include "gt-hsa-common.h"
997