Skip to content

Commit 5491486

Browse files
Fznamznonromanovvlad
authored andcommitted
[SYCL] Implement sycl-post-link tool (#695)
The tool will split single big linked device module into smaller ones using 'module-id' attribute applied to kernels. Signed-off-by: Mariya Podchishchaeva <[email protected]> Signed-off-by: Sergey Semenov <[email protected]>
1 parent 918b285 commit 5491486

File tree

7 files changed

+576
-0
lines changed

7 files changed

+576
-0
lines changed
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
; RUN: sycl-post-link -S %s -o %t
2+
; RUN: FileCheck %s -input-file=%t_0.ll --check-prefixes CHECK-TU0,CHECK
3+
; RUN: FileCheck %s -input-file=%t_1.ll --check-prefixes CHECK-TU1,CHECK
4+
; RUN: FileCheck %s -input-file=%t_0.txt --check-prefixes CHECK-TU0-TXT
5+
; RUN: FileCheck %s -input-file=%t_1.txt --check-prefixes CHECK-TU1-TXT
6+
; ModuleID = 'basic-module-split.ll'
7+
source_filename = "basic-module-split.ll"
8+
target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
9+
target triple = "spir64-unknown-linux-sycldevice"
10+
11+
$_Z3barIiET_S0_ = comdat any
12+
13+
;CHECK-TU0-NOT: @{{.*}}GV{{.*}}
14+
;CHECK-TU1: @{{.*}}GV{{.*}} = internal addrspace(1) constant [1 x i32] [i32 42], align 4
15+
@_ZL2GV = internal addrspace(1) constant [1 x i32] [i32 42], align 4
16+
17+
; CHECK-TU0: define dso_local spir_kernel void @{{.*}}TU0_kernel0{{.*}}
18+
; CHECK-TU0-TXT: {{.*}}TU0_kernel0{{.*}}
19+
; CHECK-TU1-NOT: define dso_local spir_kernel void @{{.*}}TU0_kernel0{{.*}}
20+
; CHECK-TU1-TXT-NOT: {{.*}}TU0_kernel0{{.*}}
21+
22+
; CHECK-TU0: call spir_func void @{{.*}}foo{{.*}}()
23+
24+
define dso_local spir_kernel void @_ZTSZ4mainE11TU0_kernel0() #0 {
25+
entry:
26+
call spir_func void @_Z3foov()
27+
ret void
28+
}
29+
30+
; CHECK-TU0: define dso_local spir_func void @{{.*}}foo{{.*}}()
31+
; CHECK-TU1-NOT: define dso_local spir_func void @{{.*}}foo{{.*}}()
32+
33+
; CHECK-TU0: call spir_func i32 @{{.*}}bar{{.*}}(i32 1)
34+
35+
define dso_local spir_func void @_Z3foov() {
36+
entry:
37+
%a = alloca i32, align 4
38+
%call = call spir_func i32 @_Z3barIiET_S0_(i32 1)
39+
%add = add nsw i32 2, %call
40+
store i32 %add, i32* %a, align 4
41+
ret void
42+
}
43+
44+
; CHECK-TU0: define {{.*}} spir_func i32 @{{.*}}bar{{.*}}(i32 %arg)
45+
; CHECK-TU1-NOT: define {{.*}} spir_func i32 @{{.*}}bar{{.*}}(i32 %arg)
46+
47+
; Function Attrs: nounwind
48+
define linkonce_odr dso_local spir_func i32 @_Z3barIiET_S0_(i32 %arg) comdat {
49+
entry:
50+
%arg.addr = alloca i32, align 4
51+
store i32 %arg, i32* %arg.addr, align 4
52+
%0 = load i32, i32* %arg.addr, align 4
53+
ret i32 %0
54+
}
55+
56+
; CHECK-TU0: define dso_local spir_kernel void @{{.*}}TU0_kernel1{{.*}}()
57+
; CHECK-TU0-TXT: {{.*}}TU0_kernel1{{.*}}
58+
; CHECK-TU1-NOT: define dso_local spir_kernel void @{{.*}}TU0_kernel1{{.*}}()
59+
; CHECK-TU1-TXT-NOT: {{.*}}TU0_kernel1{{.*}}
60+
61+
; CHECK-TU0: call spir_func void @{{.*}}foo1{{.*}}()
62+
63+
define dso_local spir_kernel void @_ZTSZ4mainE11TU0_kernel1() #0 {
64+
entry:
65+
call spir_func void @_Z4foo1v()
66+
ret void
67+
}
68+
69+
; CHECK-TU0: define dso_local spir_func void @{{.*}}foo1{{.*}}()
70+
; CHECK-TU1-NOT: define dso_local spir_func void @{{.*}}foo1{{.*}}()
71+
72+
; Function Attrs: nounwind
73+
define dso_local spir_func void @_Z4foo1v() {
74+
entry:
75+
%a = alloca i32, align 4
76+
store i32 2, i32* %a, align 4
77+
ret void
78+
}
79+
80+
; CHECK-TU0-NOT: define dso_local spir_kernel void @{{.*}}TU1_kernel{{.*}}()
81+
; CHECK-TU0-TXT-NOT: {{.*}}TU1_kernel{{.*}}
82+
; CHECK-TU1: define dso_local spir_kernel void @{{.*}}TU1_kernel{{.*}}()
83+
; CHECK-TU1-TXT: {{.*}}TU1_kernel{{.*}}
84+
85+
; CHECK-TU1: call spir_func void @{{.*}}foo2{{.*}}()
86+
87+
define dso_local spir_kernel void @_ZTSZ4mainE10TU1_kernel() #1 {
88+
entry:
89+
call spir_func void @_Z4foo2v()
90+
ret void
91+
}
92+
93+
; CHECK-TU0-NOT: define dso_local spir_func void @{{.*}}foo2{{.*}}()
94+
; CHECK-TU1: define dso_local spir_func void @{{.*}}foo2{{.*}}()
95+
96+
; Function Attrs: nounwind
97+
define dso_local spir_func void @_Z4foo2v() {
98+
entry:
99+
%a = alloca i32, align 4
100+
; CHECK-TU1: %0 = load i32, i32 addrspace(4)* getelementptr inbounds ([1 x i32], [1 x i32] addrspace(4)* addrspacecast ([1 x i32] addrspace(1)* @{{.*}}GV{{.*}} to [1 x i32] addrspace(4)*), i64 0, i64 0), align 4
101+
%0 = load i32, i32 addrspace(4)* getelementptr inbounds ([1 x i32], [1 x i32] addrspace(4)* addrspacecast ([1 x i32] addrspace(1)* @_ZL2GV to [1 x i32] addrspace(4)*), i64 0, i64 0), align 4
102+
%add = add nsw i32 4, %0
103+
store i32 %add, i32* %a, align 4
104+
ret void
105+
}
106+
107+
attributes #0 = { "sycl-module-id"="TU1.cpp" }
108+
attributes #1 = { "sycl-module-id"="TU2.cpp" }
109+
110+
; Metadata is saved in both modules.
111+
; CHECK: !opencl.spir.version = !{!0, !0}
112+
; CHECK: !spirv.Source = !{!1, !1}
113+
114+
!opencl.spir.version = !{!0, !0}
115+
!spirv.Source = !{!1, !1}
116+
117+
; CHECK; !0 = !{i32 1, i32 2}
118+
; CHECK; !1 = !{i32 4, i32 100000}
119+
120+
!0 = !{i32 1, i32 2}
121+
!1 = !{i32 4, i32 100000}
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
; RUN: sycl-post-link --one-kernel -S %s -o %t
2+
; RUN: FileCheck %s -input-file=%t_0.ll --check-prefixes CHECK-MODULE0,CHECK
3+
; RUN: FileCheck %s -input-file=%t_1.ll --check-prefixes CHECK-MODULE1,CHECK
4+
; RUN: FileCheck %s -input-file=%t_2.ll --check-prefixes CHECK-MODULE2,CHECK
5+
; RUN: FileCheck %s -input-file=%t_0.txt --check-prefixes CHECK-MODULE0-TXT
6+
; RUN: FileCheck %s -input-file=%t_1.txt --check-prefixes CHECK-MODULE1-TXT
7+
; RUN: FileCheck %s -input-file=%t_2.txt --check-prefixes CHECK-MODULE2-TXT
8+
; ModuleID = 'basic-module-split.ll'
9+
source_filename = "basic-module-split.ll"
10+
target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
11+
target triple = "spir64-unknown-linux-sycldevice"
12+
13+
$_Z3barIiET_S0_ = comdat any
14+
15+
;CHECK-MODULE0-NOT: @{{.*}}GV{{.*}}
16+
;CHECK-MODULE1-NOT: @{{.*}}GV{{.*}}
17+
;CHECK-MODULE2: @{{.*}}GV{{.*}} = internal addrspace(1) constant [1 x i32] [i32 42], align 4
18+
@_ZL2GV = internal addrspace(1) constant [1 x i32] [i32 42], align 4
19+
20+
; CHECK-MODULE0: define dso_local spir_kernel void @{{.*}}TU0_kernel0{{.*}}
21+
; CHECK-MODULE0-TXT: {{.*}}TU0_kernel0{{.*}}
22+
; CHECK-MODULE1-NOT: define dso_local spir_kernel void @{{.*}}TU0_kernel0{{.*}}
23+
; CHECK-MODULE1-TXT-NOT: {{.*}}TU0_kernel0{{.*}}
24+
25+
; CHECK-MODULE0: call spir_func void @{{.*}}foo{{.*}}()
26+
27+
define dso_local spir_kernel void @TU0_kernel0() #0 {
28+
entry:
29+
call spir_func void @_Z3foov()
30+
ret void
31+
}
32+
33+
; CHECK-MODULE0: define dso_local spir_func void @{{.*}}foo{{.*}}()
34+
; CHECK-MODULE1-NOT: define dso_local spir_func void @{{.*}}foo{{.*}}()
35+
; CHECK-MODULE2-NOT: define dso_local spir_func void @{{.*}}foo{{.*}}()
36+
37+
; CHECK-MODULE0: call spir_func i32 @{{.*}}bar{{.*}}(i32 1)
38+
39+
define dso_local spir_func void @_Z3foov() {
40+
entry:
41+
%a = alloca i32, align 4
42+
%call = call spir_func i32 @_Z3barIiET_S0_(i32 1)
43+
%add = add nsw i32 2, %call
44+
store i32 %add, i32* %a, align 4
45+
ret void
46+
}
47+
48+
; CHECK-MODULE0: define {{.*}} spir_func i32 @{{.*}}bar{{.*}}(i32 %arg)
49+
; CHECK-MODULE1-NOT: define {{.*}} spir_func i32 @{{.*}}bar{{.*}}(i32 %arg)
50+
; CHECK-MODULE2-NOT: define {{.*}} spir_func i32 @{{.*}}bar{{.*}}(i32 %arg)
51+
52+
; Function Attrs: nounwind
53+
define linkonce_odr dso_local spir_func i32 @_Z3barIiET_S0_(i32 %arg) comdat {
54+
entry:
55+
%arg.addr = alloca i32, align 4
56+
store i32 %arg, i32* %arg.addr, align 4
57+
%0 = load i32, i32* %arg.addr, align 4
58+
ret i32 %0
59+
}
60+
61+
; CHECK-MODULE0-NOT: define dso_local spir_kernel void @{{.*}}TU0_kernel1{{.*}}()
62+
; CHECK-MODULE0-TXT-NOT: {{.*}}TU0_kernel1{{.*}}
63+
; CHECK-MODULE1: define dso_local spir_kernel void @{{.*}}TU0_kernel1{{.*}}()
64+
; CHECK-MODULE1-TXT: {{.*}}TU0_kernel1{{.*}}
65+
; CHECK-MODULE2-NOT: define dso_local spir_kernel void @{{.*}}TU0_kernel1{{.*}}()
66+
; CHECK-MODULE2-TXT-NOT: {{.*}}TU0_kernel1{{.*}}
67+
68+
; CHECK-MODULE1: call spir_func void @{{.*}}foo1{{.*}}()
69+
70+
define dso_local spir_kernel void @TU0_kernel1() #0 {
71+
entry:
72+
call spir_func void @_Z4foo1v()
73+
ret void
74+
}
75+
76+
; CHECK-MODULE0-NOT: define dso_local spir_func void @{{.*}}foo1{{.*}}()
77+
; CHECK-MODULE1: define dso_local spir_func void @{{.*}}foo1{{.*}}()
78+
; CHECK-MODULE2-NOT: define dso_local spir_func void @{{.*}}foo1{{.*}}()
79+
80+
; Function Attrs: nounwind
81+
define dso_local spir_func void @_Z4foo1v() {
82+
entry:
83+
%a = alloca i32, align 4
84+
store i32 2, i32* %a, align 4
85+
ret void
86+
}
87+
88+
; CHECK-MODULE0-NOT: define dso_local spir_kernel void @{{.*}}TU1_kernel{{.*}}()
89+
; CHECK-MODULE0-TXT-NOT: {{.*}}TU1_kernel{{.*}}
90+
; CHECK-MODULE1-NOT: define dso_local spir_kernel void @{{.*}}TU1_kernel{{.*}}()
91+
; CHECK-MODULE1-TXT-NOT: {{.*}}TU1_kernel{{.*}}
92+
; CHECK-MODULE2: define dso_local spir_kernel void @{{.*}}TU1_kernel{{.*}}()
93+
; CHECK-MODULE2-TXT: {{.*}}TU1_kernel{{.*}}
94+
95+
; CHECK-MODULE2: call spir_func void @{{.*}}foo2{{.*}}()
96+
97+
define dso_local spir_kernel void @TU1_kernel() #1 {
98+
entry:
99+
call spir_func void @_Z4foo2v()
100+
ret void
101+
}
102+
103+
; CHECK-MODULE0-NOT: define dso_local spir_func void @{{.*}}foo2{{.*}}()
104+
; CHECK-MODULE1-NOT: define dso_local spir_func void @{{.*}}foo2{{.*}}()
105+
; CHECK-MODULE2: define dso_local spir_func void @{{.*}}foo2{{.*}}()
106+
107+
; Function Attrs: nounwind
108+
define dso_local spir_func void @_Z4foo2v() {
109+
entry:
110+
%a = alloca i32, align 4
111+
; CHECK-MODULE2: %0 = load i32, i32 addrspace(4)* getelementptr inbounds ([1 x i32], [1 x i32] addrspace(4)* addrspacecast ([1 x i32] addrspace(1)* @{{.*}}GV{{.*}} to [1 x i32] addrspace(4)*), i64 0, i64 0), align 4
112+
%0 = load i32, i32 addrspace(4)* getelementptr inbounds ([1 x i32], [1 x i32] addrspace(4)* addrspacecast ([1 x i32] addrspace(1)* @_ZL2GV to [1 x i32] addrspace(4)*), i64 0, i64 0), align 4
113+
%add = add nsw i32 4, %0
114+
store i32 %add, i32* %a, align 4
115+
ret void
116+
}
117+
118+
attributes #0 = { "sycl-module-id"="TU1.cpp" }
119+
attributes #1 = { "sycl-module-id"="TU2.cpp" }
120+
121+
; Metadata is saved in both modules.
122+
; CHECK: !opencl.spir.version = !{!0, !0}
123+
; CHECK: !spirv.Source = !{!1, !1}
124+
125+
!opencl.spir.version = !{!0, !0}
126+
!spirv.Source = !{!1, !1}
127+
128+
; CHECK; !0 = !{i32 1, i32 2}
129+
; CHECK; !1 = !{i32 4, i32 100000}
130+
131+
!0 = !{i32 1, i32 2}
132+
!1 = !{i32 4, i32 100000}

llvm/tools/LLVMBuild.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ subdirectories =
5656
llvm-split
5757
llvm-undname
5858
opt
59+
sycl-post-link
5960
verify-uselistorder
6061

6162
[component_0]
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
set(LLVM_LINK_COMPONENTS
2+
BitWriter
3+
Core
4+
IPO
5+
IRReader
6+
Support
7+
)
8+
9+
add_llvm_tool(sycl-post-link
10+
sycl-post-link.cpp
11+
12+
DEPENDS
13+
intrinsics_gen
14+
)
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
;===- ./tools/sycl-post-link/LLVMBuild.txt ---------------------*- Conf -*--===;
2+
;
3+
; Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
; See https://llvm.org/LICENSE.txt for license information.
5+
; SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
;
7+
;===------------------------------------------------------------------------===;
8+
;
9+
; This is an LLVMBuild description file for the components in this subdirectory.
10+
;
11+
; For more information on the LLVMBuild system, please see:
12+
;
13+
; http://llvm.org/docs/LLVMBuild.html
14+
;
15+
;===------------------------------------------------------------------------===;
16+
17+
[component_0]
18+
type = Tool
19+
name = sycl-post-link
20+
parent = Tools
21+
required_libraries = AsmParser BitReader BitWriter IRReader IPO

0 commit comments

Comments
 (0)