Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions llvm/lib/SYCLLowerIR/SYCLConditionalCallOnDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ SYCLConditionalCallOnDevicePass::run(Module &M, ModuleAnalysisManager &) {
&M);

NewFCaller->setCallingConv(FCaller->getCallingConv());
NewFCaller->setAttributes(FCaller->getAttributes());

DenseMap<CallInst *, CallInst *> OldCallsToNewCalls;

Expand Down
371 changes: 346 additions & 25 deletions llvm/lib/SYCLLowerIR/SYCLPropagateAspectsUsage.cpp

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ entry:
ret void
}

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

attributes #2 = { convergent mustprogress norecurse nounwind "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
attributes #6 = { convergent inlinehint mustprogress norecurse nounwind "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ entry:
ret void
}

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

attributes #2 = { convergent mustprogress norecurse nounwind "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
attributes #6 = { convergent inlinehint mustprogress norecurse nounwind "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
; RUN: opt -passes=sycl-propagate-aspects-usage < %s -S | FileCheck %s
;
; Test checks that the pass is able to propagate information about conditionally
; and unconditionally used aspects through a call graph
;
; K
; / \
; F1 (A) F2 (B)
; |
; CF1
; |
; F3 (C)
;

%Optional.A = type { i32 }
%Optional.B = type { i32 }
%Optional.C = type { i32 }

%class.anon = type { ptr addrspace(4) }

; CHECK: define spir_kernel void @kernel() !sycl_used_aspects ![[#ID1:]] !sycl_conditionally_used_aspects ![[#ID2:]]
define spir_kernel void @kernel() {
call spir_func void @func1()
call spir_func void @func2()
ret void
}

; CHECK: define spir_func void @func1() !sycl_used_aspects ![[#ID6:]]
define spir_func void @func1() {
%tmp = alloca %Optional.A
ret void
}

; CHECK: define spir_func void @func2() !sycl_used_aspects ![[#ID7:]] !sycl_conditionally_used_aspects ![[#ID2:]]
define spir_func void @func2() {
%tmp = alloca %Optional.B
%agg.tmp = alloca %class.anon, align 8
call spir_func void @cond_func1(ptr @func3, ptr %agg.tmp, i32 0, i32 0)
ret void
}

; CHECK: define spir_func void @func3() !sycl_conditionally_used_aspects ![[#ID2:]]
define spir_func void @func3() {
%tmp = alloca %Optional.C
ret void
}

; CHECK: declare !sycl_conditionally_used_aspects ![[#ID2:]] spir_func void @cond_func1
declare spir_func void @cond_func1(ptr noundef byval(%fn) align 8, ptr noundef, i32 noundef, i32) #1

%fn = type { ptr addrspace(4) }

attributes #1 = { "sycl-call-if-on-device-conditionally"="true" }

!sycl_types_that_use_aspects = !{!0, !1, !2}
!0 = !{!"Optional.A", i32 1}
!1 = !{!"Optional.B", i32 2}
!2 = !{!"Optional.C", i32 3}

!sycl_aspects = !{!3}
!3 = !{!"fp64", i32 6}

; CHECK: ![[#ID1]] = !{i32 1, i32 2}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A more descriptive names here would be appreciated, something like: K_ASPECTS, K_COND_ASPECTS, F1_ASPECTS, F2_COND_ASPECTS, etc., the same applies to other tests

; CHECK: ![[#ID2]] = !{![[#ID3:]]}
; CHECK: ![[#ID3]] = !{![[#ID4:]], ![[#ID5:]]}
; CHECK: ![[#ID4]] = !{i32 0}
; CHECK: ![[#ID5]] = !{i32 3}
; CHECK: ![[#ID6]] = !{i32 1}
; CHECK: ![[#ID7]] = !{i32 2}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
; RUN: opt -passes=sycl-propagate-aspects-usage < %s -S | FileCheck %s
;
; Test checks that the pass is able to propagate information about conditionally
; and unconditionally used aspects through a call graph
;
; K
; / \
; CF1 CF2
; | |
; F1 (A) F2 (B)
;

%Optional.A = type { i32 }
%Optional.B = type { i32 }

%class.anon = type { ptr addrspace(4) }

; CHECK: define spir_kernel void @kernel() !sycl_conditionally_used_aspects ![[#ID1:]]
define spir_kernel void @kernel() {
%agg.tmp = alloca %class.anon, align 8
call spir_func void @cond_func1(ptr @func1, ptr %agg.tmp, i32 0, i32 0)
call spir_func void @cond_func2(ptr @func2, ptr %agg.tmp, i32 0, i32 0)
ret void
}

; CHECK: define spir_func void @func1() !sycl_conditionally_used_aspects ![[#ID9:]]
define spir_func void @func1() {
%tmp = alloca %Optional.A
ret void
}

; CHECK: define spir_func void @func2() !sycl_conditionally_used_aspects ![[#ID10:]]
define spir_func void @func2() {
%tmp = alloca %Optional.B
ret void
}

; CHECK: declare !sycl_conditionally_used_aspects ![[#ID9:]] spir_func void @cond_func1
declare spir_func void @cond_func1(ptr noundef byval(%fn) align 8, ptr noundef, i32 noundef, i32) #1

; CHECK: declare !sycl_conditionally_used_aspects ![[#ID10:]] spir_func void @cond_func2
declare spir_func void @cond_func2(ptr noundef byval(%fn) align 8, ptr noundef, i32 noundef, i32) #1

%fn = type { ptr addrspace(4) }

attributes #1 = { "sycl-call-if-on-device-conditionally"="true" }

!sycl_types_that_use_aspects = !{!0, !1}
!0 = !{!"Optional.A", i32 1}
!1 = !{!"Optional.B", i32 2}

!sycl_aspects = !{!2}
!2 = !{!"fp64", i32 6}

; TODO: need to optimize Conditions-Aspects pairs to combine Aspects from different pairs which have the same Conditions

; CHECK: ![[#ID1]] = !{![[#ID2:]], ![[#ID5:]], ![[#ID7:]]}
; CHECK: ![[#ID2]] = !{![[#ID3:]], ![[#ID4:]]}
; CHECK: ![[#ID3]] = !{i32 0}
; CHECK: ![[#ID4]] = !{i32 1}
; CHECK: ![[#ID5]] = !{![[#ID3:]], ![[#ID6:]]}
; CHECK: ![[#ID6]] = !{i32 1, i32 2}
; CHECK: ![[#ID7]] = !{![[#ID3:]], ![[#ID8:]]}
; CHECK: ![[#ID8]] = !{i32 2}
; CHECK: ![[#ID9]] = !{![[#ID2:]]}
; CHECK: ![[#ID10]] = !{![[#ID7:]]}
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
; RUN: opt -passes=sycl-propagate-aspects-usage < %s -S | FileCheck %s
;
; Test checks that the pass is able to propagate information about conditionally
; and unconditionally used aspects through a call graph
;
; K
; / \
; F1 (B) CF1
; \ /
; F2 (A)
;

%Optional.A = type { i32 }
%Optional.B = type { i32 }

%class.anon = type { ptr addrspace(4) }

; CHECK: define spir_kernel void @kernel() !sycl_used_aspects ![[#ID1:]] !sycl_conditionally_used_aspects ![[#ID2:]]
define spir_kernel void @kernel() {
call spir_func void @func1()
%agg.tmp = alloca %class.anon, align 8
call spir_func void @cond_func1(ptr @func2, ptr %agg.tmp, i32 0, i32 0)
ret void
}

; CHECK: define spir_func void @func1() !sycl_used_aspects ![[#ID1:]]
define spir_func void @func1() {
%tmp = alloca %Optional.B
call spir_func void @func2()
ret void
}

; CHECK: define spir_func void @func2() !sycl_used_aspects ![[#ID5:]] !sycl_conditionally_used_aspects ![[#ID2:]]
define spir_func void @func2() {
%tmp = alloca %Optional.A
ret void
}

; CHECK: declare !sycl_conditionally_used_aspects ![[#ID2:]] spir_func void @cond_func1
declare spir_func void @cond_func1(ptr noundef byval(%fn) align 8, ptr noundef, i32 noundef, i32) #1

%fn = type { ptr addrspace(4) }

attributes #1 = { "sycl-call-if-on-device-conditionally"="true" }

!sycl_types_that_use_aspects = !{!0, !1}
!0 = !{!"Optional.A", i32 1}
!1 = !{!"Optional.B", i32 2}

!sycl_aspects = !{!2}
!2 = !{!"fp64", i32 6}

; CHECK: ![[#ID1]] = !{i32 2, i32 1}
; CHECK: ![[#ID2]] = !{![[#ID3:]]}
; CHECK: ![[#ID3]] = !{![[#ID4:]], ![[#ID5:]]}
; CHECK: ![[#ID4]] = !{i32 0}
; CHECK: ![[#ID5]] = !{i32 1}
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
; RUN: opt -passes=sycl-propagate-aspects-usage < %s -S | FileCheck %s
;
; Test checks that the pass is able to propagate information about conditionally
; and unconditionally used aspects through a call graph
;
; K
; / \
; F1 (A) F2 (B)
; |
; CF1
; |
; F3 (C)
; |
; CF2
; |
; F4 (D)
;

%Optional.A = type { i32 }
%Optional.B = type { i32 }
%Optional.C = type { i32 }
%Optional.D = type { i32 }

%class.anon = type { ptr addrspace(4) }

; CHECK: define spir_kernel void @kernel() !sycl_used_aspects ![[#ID1:]] !sycl_conditionally_used_aspects ![[#ID2:]]
define spir_kernel void @kernel() {
call spir_func void @func1()
call spir_func void @func2()
ret void
}

; CHECK: define spir_func void @func1() !sycl_used_aspects ![[#ID8:]]
define spir_func void @func1() {
%tmp = alloca %Optional.A
ret void
}

; CHECK: define spir_func void @func2() !sycl_used_aspects ![[#ID9:]] !sycl_conditionally_used_aspects ![[#ID2:]]
define spir_func void @func2() {
%tmp = alloca %Optional.B
%agg.tmp = alloca %class.anon, align 8
call spir_func void @cond_func1(ptr @func3, ptr %agg.tmp, i32 1, i32 2)
ret void
}

; CHECK: define spir_func void @func3() !sycl_conditionally_used_aspects ![[#ID2:]]
define spir_func void @func3() {
%tmp = alloca %Optional.C
%agg.tmp = alloca %class.anon, align 8
call spir_func void @cond_func2(ptr @func4, ptr %agg.tmp, i32 3, i32 4)
ret void
}

; CHECK: define spir_func void @func4() !sycl_conditionally_used_aspects ![[#ID10:]]
define spir_func void @func4() {
%tmp = alloca %Optional.D
ret void
}

; CHECK: declare !sycl_conditionally_used_aspects ![[#ID2:]] spir_func void @cond_func1
declare spir_func void @cond_func1(ptr noundef byval(%fn) align 8, ptr noundef, i32 noundef, i32) #1

; CHECK: declare !sycl_conditionally_used_aspects ![[#ID10:]] spir_func void @cond_func2
declare spir_func void @cond_func2(ptr noundef byval(%fn) align 8, ptr noundef, i32 noundef, i32) #1

%fn = type { ptr addrspace(4) }

attributes #1 = { "sycl-call-if-on-device-conditionally"="true" }

!sycl_types_that_use_aspects = !{!0, !1, !2, !3}
!0 = !{!"Optional.A", i32 1}
!1 = !{!"Optional.B", i32 2}
!2 = !{!"Optional.C", i32 3}
!3 = !{!"Optional.D", i32 4}

!sycl_aspects = !{!4}
!4 = !{!"fp64", i32 6}

; CHECK: ![[#ID1]] = !{i32 1, i32 2}
; CHECK: ![[#ID2]] = !{![[#ID3:]], ![[#ID5:]]}
; CHECK: ![[#ID3]] = !{![[#ID1:]], ![[#ID4:]]}
; CHECK: ![[#ID4]] = !{i32 3, i32 4}
; CHECK: ![[#ID5]] = !{![[#ID6:]], ![[#ID7:]]}
; CHECK: ![[#ID6]] = !{i32 1, i32 2, i32 3, i32 4}
; CHECK: ![[#ID7]] = !{i32 4}
; CHECK: ![[#ID8]] = !{i32 1}
; CHECK: ![[#ID9]] = !{i32 2}
; CHECK: ![[#ID10]] = !{![[#ID5:]]}
Loading