Skip to content

Commit d1f4ec2

Browse files
committed
[SYCL] Add conditional aspects to SYCLPropagateAspectsUsage pass
This patch implements changes in SYCLPropagateAspectsUsage pass in accordance with design doc for supporting JIT in sycl_ext_oneapi_device_architecture extension Design doc: https://github.com/intel/llvm/blob/01fa4f8a439ea9b7d932d8099e1e1a17c630c1ea/sycl/doc/design/DeviceIf.md#changes-to-the-aspect-propagation-pass
1 parent fe18590 commit d1f4ec2

File tree

8 files changed

+631
-28
lines changed

8 files changed

+631
-28
lines changed

llvm/lib/SYCLLowerIR/SYCLConditionalCallOnDevice.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ SYCLConditionalCallOnDevicePass::run(Module &M, ModuleAnalysisManager &) {
103103
&M);
104104

105105
NewFCaller->setCallingConv(FCaller->getCallingConv());
106+
NewFCaller->setAttributes(FCaller->getAttributes());
106107

107108
DenseMap<CallInst *, CallInst *> OldCallsToNewCalls;
108109

llvm/lib/SYCLLowerIR/SYCLPropagateAspectsUsage.cpp

Lines changed: 346 additions & 25 deletions
Large diffs are not rendered by default.

llvm/test/SYCLLowerIR/ConditionalCallOnDevice/conditional-call-on-device-1.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ entry:
2828
ret void
2929
}
3030

31-
; CHECK: declare spir_func void @call_if_on_device_conditionally_PREFIX_1(ptr, ptr, i32, i32)
31+
; CHECK: declare spir_func void @call_if_on_device_conditionally_PREFIX_1(ptr[[VAL1:.*]], ptr[[VAL2:.*]], i32[[VAL3:.*]], i32[[VAL4:.*]])
3232

3333
attributes #2 = { convergent mustprogress norecurse nounwind "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
3434
attributes #6 = { convergent inlinehint mustprogress norecurse nounwind "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" }

llvm/test/SYCLLowerIR/ConditionalCallOnDevice/conditional-call-on-device-2.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ entry:
4242
ret void
4343
}
4444

45-
; CHECK: declare spir_func void @call_if_on_device_conditionally1_PREFIX_1(ptr, ptr, i32, i32)
46-
; CHECK: declare spir_func void @call_if_on_device_conditionally2_PREFIX_2(ptr, ptr, i32, i32)
45+
; CHECK: declare spir_func void @call_if_on_device_conditionally1_PREFIX_1(ptr[[VAL1:.*]], ptr[[VAL2:.*]], i32[[VAL3:.*]], i32[[VAL4:.*]])
46+
; CHECK: declare spir_func void @call_if_on_device_conditionally2_PREFIX_2(ptr[[VAL1:.*]], ptr[[VAL2:.*]], i32[[VAL3:.*]], i32[[VAL4:.*]])
4747

4848
attributes #2 = { convergent mustprogress norecurse nounwind "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
4949
attributes #6 = { convergent inlinehint mustprogress norecurse nounwind "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
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 conditionally
4+
; and unconditionally used aspects through a call graph
5+
;
6+
; K
7+
; / \
8+
; F1 (A) F2 (B)
9+
; |
10+
; CF1
11+
; |
12+
; F3 (C)
13+
;
14+
15+
%Optional.A = type { i32 }
16+
%Optional.B = type { i32 }
17+
%Optional.C = type { i32 }
18+
19+
%class.anon = type { ptr addrspace(4) }
20+
21+
; CHECK: define spir_kernel void @kernel() !sycl_used_aspects ![[#ID1:]] !sycl_conditionally_used_aspects ![[#ID2:]]
22+
define spir_kernel void @kernel() {
23+
call spir_func void @func1()
24+
call spir_func void @func2()
25+
ret void
26+
}
27+
28+
; CHECK: define spir_func void @func1() !sycl_used_aspects ![[#ID6:]]
29+
define spir_func void @func1() {
30+
%tmp = alloca %Optional.A
31+
ret void
32+
}
33+
34+
; CHECK: define spir_func void @func2() !sycl_used_aspects ![[#ID7:]] !sycl_conditionally_used_aspects ![[#ID2:]]
35+
define spir_func void @func2() {
36+
%tmp = alloca %Optional.B
37+
%agg.tmp = alloca %class.anon, align 8
38+
call spir_func void @cond_func1(ptr @func3, ptr %agg.tmp, i32 0, i32 0)
39+
ret void
40+
}
41+
42+
; CHECK: define spir_func void @func3() !sycl_conditionally_used_aspects ![[#ID2:]]
43+
define spir_func void @func3() {
44+
%tmp = alloca %Optional.C
45+
ret void
46+
}
47+
48+
; CHECK: declare !sycl_conditionally_used_aspects ![[#ID2:]] spir_func void @cond_func1
49+
declare spir_func void @cond_func1(ptr noundef byval(%fn) align 8, ptr noundef, i32 noundef, i32) #1
50+
51+
%fn = type { ptr addrspace(4) }
52+
53+
attributes #1 = { "sycl-call-if-on-device-conditionally"="true" }
54+
55+
!sycl_types_that_use_aspects = !{!0, !1, !2}
56+
!0 = !{!"Optional.A", i32 1}
57+
!1 = !{!"Optional.B", i32 2}
58+
!2 = !{!"Optional.C", i32 3}
59+
60+
!sycl_aspects = !{!3}
61+
!3 = !{!"fp64", i32 6}
62+
63+
; CHECK: ![[#ID1]] = !{i32 1, i32 2}
64+
; CHECK: ![[#ID2]] = !{![[#ID3:]]}
65+
; CHECK: ![[#ID3]] = !{![[#ID4:]], ![[#ID5:]]}
66+
; CHECK: ![[#ID4]] = !{i32 0}
67+
; CHECK: ![[#ID5]] = !{i32 3}
68+
; CHECK: ![[#ID6]] = !{i32 1}
69+
; CHECK: ![[#ID7]] = !{i32 2}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
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 conditionally
4+
; and unconditionally used aspects through a call graph
5+
;
6+
; K
7+
; / \
8+
; CF1 CF2
9+
; | |
10+
; F1 (A) F2 (B)
11+
;
12+
13+
%Optional.A = type { i32 }
14+
%Optional.B = type { i32 }
15+
16+
%class.anon = type { ptr addrspace(4) }
17+
18+
; CHECK: define spir_kernel void @kernel() !sycl_conditionally_used_aspects ![[#ID1:]]
19+
define spir_kernel void @kernel() {
20+
%agg.tmp = alloca %class.anon, align 8
21+
call spir_func void @cond_func1(ptr @func1, ptr %agg.tmp, i32 0, i32 0)
22+
call spir_func void @cond_func2(ptr @func2, ptr %agg.tmp, i32 0, i32 0)
23+
ret void
24+
}
25+
26+
; CHECK: define spir_func void @func1() !sycl_conditionally_used_aspects ![[#ID9:]]
27+
define spir_func void @func1() {
28+
%tmp = alloca %Optional.A
29+
ret void
30+
}
31+
32+
; CHECK: define spir_func void @func2() !sycl_conditionally_used_aspects ![[#ID10:]]
33+
define spir_func void @func2() {
34+
%tmp = alloca %Optional.B
35+
ret void
36+
}
37+
38+
; CHECK: declare !sycl_conditionally_used_aspects ![[#ID9:]] spir_func void @cond_func1
39+
declare spir_func void @cond_func1(ptr noundef byval(%fn) align 8, ptr noundef, i32 noundef, i32) #1
40+
41+
; CHECK: declare !sycl_conditionally_used_aspects ![[#ID10:]] spir_func void @cond_func2
42+
declare spir_func void @cond_func2(ptr noundef byval(%fn) align 8, ptr noundef, i32 noundef, i32) #1
43+
44+
%fn = type { ptr addrspace(4) }
45+
46+
attributes #1 = { "sycl-call-if-on-device-conditionally"="true" }
47+
48+
!sycl_types_that_use_aspects = !{!0, !1}
49+
!0 = !{!"Optional.A", i32 1}
50+
!1 = !{!"Optional.B", i32 2}
51+
52+
!sycl_aspects = !{!2}
53+
!2 = !{!"fp64", i32 6}
54+
55+
; TODO: need to optimize Conditions-Aspects pairs to combine Aspects from different pairs which have the same Conditions
56+
57+
; CHECK: ![[#ID1]] = !{![[#ID2:]], ![[#ID5:]], ![[#ID7:]]}
58+
; CHECK: ![[#ID2]] = !{![[#ID3:]], ![[#ID4:]]}
59+
; CHECK: ![[#ID3]] = !{i32 0}
60+
; CHECK: ![[#ID4]] = !{i32 1}
61+
; CHECK: ![[#ID5]] = !{![[#ID3:]], ![[#ID6:]]}
62+
; CHECK: ![[#ID6]] = !{i32 1, i32 2}
63+
; CHECK: ![[#ID7]] = !{![[#ID3:]], ![[#ID8:]]}
64+
; CHECK: ![[#ID8]] = !{i32 2}
65+
; CHECK: ![[#ID9]] = !{![[#ID2:]]}
66+
; CHECK: ![[#ID10]] = !{![[#ID7:]]}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
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 conditionally
4+
; and unconditionally used aspects through a call graph
5+
;
6+
; K
7+
; / \
8+
; F1 (B) CF1
9+
; \ /
10+
; F2 (A)
11+
;
12+
13+
%Optional.A = type { i32 }
14+
%Optional.B = type { i32 }
15+
16+
%class.anon = type { ptr addrspace(4) }
17+
18+
; CHECK: define spir_kernel void @kernel() !sycl_used_aspects ![[#ID1:]] !sycl_conditionally_used_aspects ![[#ID2:]]
19+
define spir_kernel void @kernel() {
20+
call spir_func void @func1()
21+
%agg.tmp = alloca %class.anon, align 8
22+
call spir_func void @cond_func1(ptr @func2, ptr %agg.tmp, i32 0, i32 0)
23+
ret void
24+
}
25+
26+
; CHECK: define spir_func void @func1() !sycl_used_aspects ![[#ID1:]]
27+
define spir_func void @func1() {
28+
%tmp = alloca %Optional.B
29+
call spir_func void @func2()
30+
ret void
31+
}
32+
33+
; CHECK: define spir_func void @func2() !sycl_used_aspects ![[#ID5:]] !sycl_conditionally_used_aspects ![[#ID2:]]
34+
define spir_func void @func2() {
35+
%tmp = alloca %Optional.A
36+
ret void
37+
}
38+
39+
; CHECK: declare !sycl_conditionally_used_aspects ![[#ID2:]] spir_func void @cond_func1
40+
declare spir_func void @cond_func1(ptr noundef byval(%fn) align 8, ptr noundef, i32 noundef, i32) #1
41+
42+
%fn = type { ptr addrspace(4) }
43+
44+
attributes #1 = { "sycl-call-if-on-device-conditionally"="true" }
45+
46+
!sycl_types_that_use_aspects = !{!0, !1}
47+
!0 = !{!"Optional.A", i32 1}
48+
!1 = !{!"Optional.B", i32 2}
49+
50+
!sycl_aspects = !{!2}
51+
!2 = !{!"fp64", i32 6}
52+
53+
; CHECK: ![[#ID1]] = !{i32 2, i32 1}
54+
; CHECK: ![[#ID2]] = !{![[#ID3:]]}
55+
; CHECK: ![[#ID3]] = !{![[#ID4:]], ![[#ID5:]]}
56+
; CHECK: ![[#ID4]] = !{i32 0}
57+
; CHECK: ![[#ID5]] = !{i32 1}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
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 conditionally
4+
; and unconditionally used aspects through a call graph
5+
;
6+
; K
7+
; / \
8+
; F1 (A) F2 (B)
9+
; |
10+
; CF1
11+
; |
12+
; F3 (C)
13+
; |
14+
; CF2
15+
; |
16+
; F4 (D)
17+
;
18+
19+
%Optional.A = type { i32 }
20+
%Optional.B = type { i32 }
21+
%Optional.C = type { i32 }
22+
%Optional.D = type { i32 }
23+
24+
%class.anon = type { ptr addrspace(4) }
25+
26+
; CHECK: define spir_kernel void @kernel() !sycl_used_aspects ![[#ID1:]] !sycl_conditionally_used_aspects ![[#ID2:]]
27+
define spir_kernel void @kernel() {
28+
call spir_func void @func1()
29+
call spir_func void @func2()
30+
ret void
31+
}
32+
33+
; CHECK: define spir_func void @func1() !sycl_used_aspects ![[#ID8:]]
34+
define spir_func void @func1() {
35+
%tmp = alloca %Optional.A
36+
ret void
37+
}
38+
39+
; CHECK: define spir_func void @func2() !sycl_used_aspects ![[#ID9:]] !sycl_conditionally_used_aspects ![[#ID2:]]
40+
define spir_func void @func2() {
41+
%tmp = alloca %Optional.B
42+
%agg.tmp = alloca %class.anon, align 8
43+
call spir_func void @cond_func1(ptr @func3, ptr %agg.tmp, i32 1, i32 2)
44+
ret void
45+
}
46+
47+
; CHECK: define spir_func void @func3() !sycl_conditionally_used_aspects ![[#ID2:]]
48+
define spir_func void @func3() {
49+
%tmp = alloca %Optional.C
50+
%agg.tmp = alloca %class.anon, align 8
51+
call spir_func void @cond_func2(ptr @func4, ptr %agg.tmp, i32 3, i32 4)
52+
ret void
53+
}
54+
55+
; CHECK: define spir_func void @func4() !sycl_conditionally_used_aspects ![[#ID10:]]
56+
define spir_func void @func4() {
57+
%tmp = alloca %Optional.D
58+
ret void
59+
}
60+
61+
; CHECK: declare !sycl_conditionally_used_aspects ![[#ID2:]] spir_func void @cond_func1
62+
declare spir_func void @cond_func1(ptr noundef byval(%fn) align 8, ptr noundef, i32 noundef, i32) #1
63+
64+
; CHECK: declare !sycl_conditionally_used_aspects ![[#ID10:]] spir_func void @cond_func2
65+
declare spir_func void @cond_func2(ptr noundef byval(%fn) align 8, ptr noundef, i32 noundef, i32) #1
66+
67+
%fn = type { ptr addrspace(4) }
68+
69+
attributes #1 = { "sycl-call-if-on-device-conditionally"="true" }
70+
71+
!sycl_types_that_use_aspects = !{!0, !1, !2, !3}
72+
!0 = !{!"Optional.A", i32 1}
73+
!1 = !{!"Optional.B", i32 2}
74+
!2 = !{!"Optional.C", i32 3}
75+
!3 = !{!"Optional.D", i32 4}
76+
77+
!sycl_aspects = !{!4}
78+
!4 = !{!"fp64", i32 6}
79+
80+
; CHECK: ![[#ID1]] = !{i32 1, i32 2}
81+
; CHECK: ![[#ID2]] = !{![[#ID3:]], ![[#ID5:]]}
82+
; CHECK: ![[#ID3]] = !{![[#ID1:]], ![[#ID4:]]}
83+
; CHECK: ![[#ID4]] = !{i32 3, i32 4}
84+
; CHECK: ![[#ID5]] = !{![[#ID6:]], ![[#ID7:]]}
85+
; CHECK: ![[#ID6]] = !{i32 1, i32 2, i32 3, i32 4}
86+
; CHECK: ![[#ID7]] = !{i32 4}
87+
; CHECK: ![[#ID8]] = !{i32 1}
88+
; CHECK: ![[#ID9]] = !{i32 2}
89+
; CHECK: ![[#ID10]] = !{![[#ID5:]]}

0 commit comments

Comments
 (0)