Skip to content

Commit 8a0c9a0

Browse files
authored
[SYCL] Improve SYCLPropagateAspectsUsage pass (#7035)
Pass should also collect & propagate function's aspects defined by "!sycl_used_aspect" metadata
1 parent 9994934 commit 8a0c9a0

File tree

4 files changed

+166
-0
lines changed

4 files changed

+166
-0
lines changed

llvm/lib/SYCLLowerIR/SYCLPropagateAspectsUsage.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,7 @@ void propagateAspectsThroughCG(Function *F, CallGraphTy &CG,
285285
/// - checks if return and argument types are using any aspects
286286
/// - checks if instructions are using any aspects
287287
/// - updates call graph information
288+
/// - checks if function has "!sycl_used_aspects" metadata
288289
///
289290
void processFunction(Function &F, FunctionToAspectsMapTy &FunctionToAspects,
290291
TypeToAspectsMapTy &TypesWithAspects, CallGraphTy &CG) {
@@ -307,6 +308,17 @@ void processFunction(Function &F, FunctionToAspectsMapTy &FunctionToAspects,
307308
CG[&F].insert(CI->getCalledFunction());
308309
}
309310
}
311+
312+
if (F.hasMetadata("sycl_used_aspects")) {
313+
const MDNode *MD = F.getMetadata("sycl_used_aspects");
314+
AspectsSetTy Aspects;
315+
for (size_t I = 0, E = MD->getNumOperands(); I < E; ++I) {
316+
Constant *C =
317+
cast<ConstantAsMetadata>(MD->getOperand(I).get())->getValue();
318+
Aspects.insert(cast<ConstantInt>(C)->getSExtValue());
319+
}
320+
FunctionToAspects[&F].insert(Aspects.begin(), Aspects.end());
321+
}
310322
}
311323

312324
// Return true if the function is a SPIRV or SYCL builtin, e.g.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
; RUN: opt -passes=sycl-propagate-aspects-usage %s -S | FileCheck %s
2+
3+
; Check that baz() & bar() take the same !sycl_used_aspects as foo()
4+
5+
; baz()
6+
; |
7+
; v
8+
; bar()
9+
; |
10+
; v
11+
; foo()
12+
13+
source_filename = "main.cpp"
14+
target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-n8:16:32:64"
15+
target triple = "spir64-unknown-unknown"
16+
17+
; CHECK: void @_ZTSZZ4mainENKUlRN4sycl3_V17handlerEE_clES2_EUlvE_() !sycl_used_aspects ![[#ASPECT:]] {
18+
define weak_odr dso_local spir_kernel void @_ZTSZZ4mainENKUlRN4sycl3_V17handlerEE_clES2_EUlvE_() {
19+
entry:
20+
call spir_func void @_Z3bazv()
21+
ret void
22+
}
23+
24+
; CHECK: void @_Z3bazv() !sycl_used_aspects ![[#ASPECT]] {
25+
define dso_local spir_func void @_Z3bazv() {
26+
entry:
27+
call spir_func void @_Z3barv()
28+
ret void
29+
}
30+
31+
; CHECK: void @_Z3barv() !sycl_used_aspects ![[#ASPECT]] {
32+
define dso_local spir_func void @_Z3barv() {
33+
entry:
34+
call spir_func void @_Z3foov()
35+
ret void
36+
}
37+
38+
; CHECK: void @_Z3foov() !sycl_used_aspects ![[#ASPECT]] {
39+
define dso_local spir_func void @_Z3foov() !sycl_used_aspects !2 {
40+
entry:
41+
ret void
42+
}
43+
44+
!sycl_aspects = !{!0, !1}
45+
46+
!0 = !{!"gpu", i32 2}
47+
!1 = !{!"fp64", i32 6}
48+
!2 = !{i32 2}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
; RUN: opt -passes=sycl-propagate-aspects-usage %s -S | FileCheck %s
2+
3+
; Check that baz() takes a mix of "!sycl_used_aspects" of bar() & foo()
4+
5+
; baz()
6+
; / \
7+
; v v
8+
; bar() foo()
9+
10+
source_filename = "main.cpp"
11+
target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-n8:16:32:64"
12+
target triple = "spir64-unknown-unknown"
13+
14+
; CHECK: void @_Z3bazv() !sycl_used_aspects ![[#ASPECT1:]] {
15+
define dso_local spir_kernel void @_Z3bazv() {
16+
entry:
17+
call spir_func void @_Z3barv()
18+
call spir_func void @_Z3foov()
19+
ret void
20+
}
21+
22+
; CHECK: void @_Z3barv() !sycl_used_aspects ![[#ASPECT2:]] {
23+
define dso_local spir_func void @_Z3barv() !sycl_used_aspects !3 {
24+
entry:
25+
ret void
26+
}
27+
28+
; CHECK: void @_Z3foov() !sycl_used_aspects ![[#ASPECT3:]] {
29+
define dso_local spir_func void @_Z3foov() !sycl_used_aspects !4 {
30+
entry:
31+
ret void
32+
}
33+
34+
; CHECK: ![[#ASPECT1]] = !{i32 2, i32 1}
35+
; CHECK: ![[#ASPECT2]] = !{i32 2}
36+
; CHECK: ![[#ASPECT3]] = !{i32 1}
37+
38+
!sycl_aspects = !{!0, !1, !2}
39+
40+
!0 = !{!"cpu", i32 1}
41+
!1 = !{!"gpu", i32 2}
42+
!2 = !{!"fp64", i32 6}
43+
!3 = !{i32 2}
44+
!4 = !{i32 1}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
; RUN: opt -passes=sycl-propagate-aspects-usage < %s -S | FileCheck %s
2+
3+
; Test checks that the pass is able to propagate information about used aspects
4+
; & aspects from function's "!sycl_used_aspects" through a call graph
5+
;
6+
; K
7+
; / \
8+
; F1 F2
9+
; \ / \
10+
; F3 F4
11+
;
12+
; F3 uses optional A.
13+
; F4 uses optional B.
14+
15+
%Optional.A = type { i32 }
16+
%Optional.B = type { i32 }
17+
18+
; CHECK: spir_kernel void @kernel() !sycl_used_aspects ![[#ID1:]] {
19+
define spir_kernel void @kernel() {
20+
call spir_func void @func1()
21+
call spir_func void @func2()
22+
ret void
23+
}
24+
25+
; CHECK: spir_func void @func1() !sycl_used_aspects ![[#ID2:]] {
26+
define spir_func void @func1() {
27+
call spir_func void @func3()
28+
ret void
29+
}
30+
31+
; CHECK: spir_func void @func2() !sycl_used_aspects ![[#ID1]] {
32+
define spir_func void @func2() {
33+
call spir_func void @func3()
34+
call spir_func void @func4()
35+
ret void
36+
}
37+
38+
; CHECK: spir_func void @func3() !sycl_used_aspects ![[#ID2]] {
39+
define spir_func void @func3() {
40+
%tmp = alloca %Optional.A
41+
ret void
42+
}
43+
44+
; CHECK: spir_func void @func4() !sycl_used_aspects ![[#ID3:]] {
45+
define spir_func void @func4() !sycl_used_aspects !5 {
46+
%tmp = alloca %Optional.B
47+
ret void
48+
}
49+
50+
!sycl_types_that_use_aspects = !{!0, !1}
51+
!0 = !{!"Optional.A", i32 1}
52+
!1 = !{!"Optional.B", i32 2}
53+
54+
!sycl_aspects = !{!2}
55+
!2 = !{!"fp64", i32 6}
56+
!3 = !{!"cpu", i32 1}
57+
!4 = !{!"host", i32 0}
58+
!5 = !{i32 0}
59+
60+
; CHECK: ![[#ID1]] = !{i32 1, i32 2, i32 0}
61+
; CHECK: ![[#ID2]] = !{i32 1}
62+
; CHECK: ![[#ID3]] = !{i32 2, i32 0}

0 commit comments

Comments
 (0)