Skip to content

Commit ad3f0ec

Browse files
committed
[HSA] Avoid ICE when "HSA does not implement indirect calls"
Made apparent by recent commit dc70315 "openmp: Implement discovery of implicit declare target to clauses": +FAIL: libgomp.c/target-39.c (internal compiler error) +FAIL: libgomp.c/target-39.c (test for excess errors) +UNRESOLVED: libgomp.c/target-39.c compilation failed to produce executable This is in a '--enable-offload-targets=[...],hsa' build, with '-foffload=hsa' enabled (by default). during GIMPLE pass: hsagen source-gcc/libgomp/testsuite/libgomp.c/target-39.c: In function ‘main._omp_fn.0.hsa.0’: source-gcc/libgomp/testsuite/libgomp.c/target-39.c:23:11: internal compiler error: Segmentation fault 23 | #pragma omp target map(from:err) | ^~~ [...] GDB: Program received signal SIGSEGV, Segmentation fault. fndecl_built_in_p (node=0x0, name=BUILT_IN_PREFETCH) at [...]/source-gcc/gcc/tree.h:6267 6267 return (fndecl_built_in_p (node, BUILT_IN_NORMAL) (gdb) bt #0 fndecl_built_in_p (node=0x0, name=BUILT_IN_PREFETCH) at [...]/source-gcc/gcc/tree.h:6267 #1 0x0000000000b19739 in gen_hsa_insns_for_call (stmt=stmt@entry=0x7ffff693b200, hbb=hbb@entry=0x2b152c0) at [...]/source-gcc/gcc/hsa-gen.c:5304 gcc-mirror#2 0x0000000000b1aca7 in gen_hsa_insns_for_gimple_stmt (stmt=0x7ffff693b200, hbb=hbb@entry=0x2b152c0) at [...]/source-gcc/gcc/hsa-gen.c:5770 gcc-mirror#3 0x0000000000b1bd21 in gen_body_from_gimple () at [...]/source-gcc/gcc/hsa-gen.c:5999 gcc-mirror#4 0x0000000000b1dbd2 in generate_hsa (kernel=<optimized out>) at [...]/source-gcc/gcc/hsa-gen.c:6596 gcc-mirror#5 0x0000000000b1de66 in (anonymous namespace)::pass_gen_hsail::execute (this=0x2a2aac0) at [...]/source-gcc/gcc/hsa-gen.c:6680 gcc-mirror#6 0x0000000000d06f90 in execute_one_pass (pass=pass@entry=0x2a2aac0) at [...]/source-gcc/gcc/passes.c:2502 [...] (gdb) up #1 0x0000000000b19739 in gen_hsa_insns_for_call (stmt=stmt@entry=0x7ffff693b200, hbb=hbb@entry=0x2b152c0) at /home/thomas/tmp/source/gcc/build/track-slim-omp/source-gcc/gcc/hsa-gen.c:5304 5304 if (fndecl_built_in_p (function_decl, BUILT_IN_PREFETCH)) (gdb) print function_decl $1 = (tree) 0x0 (gdb) list 5299 if (!gimple_call_builtin_p (stmt, BUILT_IN_NORMAL)) 5300 { 5301 tree function_decl = gimple_call_fndecl (stmt); 5302 /* Prefetch pass can create type-mismatching prefetch builtin calls which 5303 fail the gimple_call_builtin_p test above. Handle them here. */ 5304 if (fndecl_built_in_p (function_decl, BUILT_IN_PREFETCH)) 5305 return; 5306 5307 if (function_decl == NULL_TREE) 5308 { The problem is present already since 2016-11-23 commit 56b1c60 (r242761) "Merge from HSA branch to trunk", and the fix obvious enough. gcc/ * hsa-gen.c (gen_hsa_insns_for_call): Move 'function_decl == NULL_TREE' check earlier. gcc/testsuite/ * c-c++-common/gomp/hsa-indirect-call-1.c: New file. (cherry picked from commit 973bce0)
1 parent 55838f7 commit ad3f0ec

File tree

2 files changed

+29
-4
lines changed

2 files changed

+29
-4
lines changed

gcc/hsa-gen.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5299,10 +5299,6 @@ gen_hsa_insns_for_call (gimple *stmt, hsa_bb *hbb)
52995299
if (!gimple_call_builtin_p (stmt, BUILT_IN_NORMAL))
53005300
{
53015301
tree function_decl = gimple_call_fndecl (stmt);
5302-
/* Prefetch pass can create type-mismatching prefetch builtin calls which
5303-
fail the gimple_call_builtin_p test above. Handle them here. */
5304-
if (fndecl_built_in_p (function_decl, BUILT_IN_PREFETCH))
5305-
return;
53065302

53075303
if (function_decl == NULL_TREE)
53085304
{
@@ -5311,6 +5307,11 @@ gen_hsa_insns_for_call (gimple *stmt, hsa_bb *hbb)
53115307
return;
53125308
}
53135309

5310+
/* Prefetch pass can create type-mismatching prefetch builtin calls which
5311+
fail the gimple_call_builtin_p test above. Handle them here. */
5312+
if (fndecl_built_in_p (function_decl, BUILT_IN_PREFETCH))
5313+
return;
5314+
53145315
if (hsa_callable_function_p (function_decl))
53155316
gen_hsa_insns_for_direct_call (stmt, hbb);
53165317
else if (!gen_hsa_insns_for_known_library_call (stmt, hbb))
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/* Instead of ICE, we'd like "HSA does not implement indirect calls". */
2+
3+
/* Reduced from 'libgomp.c/target-39.c'. */
4+
5+
/* { dg-require-effective-target offload_hsa } */
6+
/* { dg-additional-options "-Whsa" } to override '{gcc,g++}.dg/gomp/gomp.exp'. */
7+
8+
typedef void (*fnp) (void);
9+
void f1 (void) { }
10+
fnp f2 (void) { return f1; }
11+
#pragma omp declare target to (f1, f2)
12+
13+
int
14+
main ()
15+
{
16+
#pragma omp target
17+
{
18+
fnp fnp = f2 ();
19+
fnp (); /* { dg-message "note: support for HSA does not implement indirect calls" } */
20+
}
21+
return 0;
22+
}
23+
24+
/* { dg-warning "could not emit HSAIL for the function" "" { target *-*-* } 0 } */

0 commit comments

Comments
 (0)