Skip to content

Commit 083997f

Browse files
dguzhaevigcbot
authored andcommitted
Tests for SelectiveFuncitonControl flag
Add lits on SelectFunctionControl functionality
1 parent b385195 commit 083997f

9 files changed

+692
-1
lines changed

IGC/Compiler/tests/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ igc_configure_lit_site_cfg(
3737
# If any new tool is required by any of the LIT tests add it here:
3838
set(IGC_LIT_TEST_DEPENDS
3939
FileCheck
40+
split-file
4041
count
4142
not
4243
"${IGC_BUILD__PROJ__igc_opt}"
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
;=========================== begin_copyright_notice ============================
2+
;
3+
; Copyright (C) 2024 Intel Corporation
4+
;
5+
; SPDX-License-Identifier: MIT
6+
;
7+
;============================ end_copyright_notice =============================
8+
;
9+
; REQUIRES: llvm-14-plus, regkeys
10+
; RUN: igc_opt --igc-process-func-attributes -S < %s 2>&1 | FileCheck %s --check-prefixes=CHECK-FC0
11+
; RUN: igc_opt --igc-process-func-attributes -S -regkey FunctionControl=1 < %s 2>&1 | FileCheck %s --check-prefixes=CHECK-FC1
12+
; RUN: igc_opt --igc-process-func-attributes -S -regkey FunctionControl=2 < %s 2>&1 | FileCheck %s --check-prefixes=CHECK-FC2
13+
; RUN: igc_opt --igc-process-func-attributes -S -regkey FunctionControl=3 < %s 2>&1 | FileCheck %s --check-prefixes=CHECK-FC3
14+
; RUN: igc_opt --igc-process-func-attributes -S -regkey FunctionControl=4 < %s 2>&1 | FileCheck %s --check-prefixes=CHECK-FC4
15+
; ------------------------------------------------
16+
17+
; Test check forced attribute update based on FunctionControl flag:
18+
; FLAG_FCALL_DEFAULT = 0,
19+
; FLAG_FCALL_FORCE_INLINE = 1,
20+
; FLAG_FCALL_FORCE_SUBROUTINE = 2,
21+
; FLAG_FCALL_FORCE_STACKCALL = 3,
22+
; FLAG_FCALL_FORCE_INDIRECTCALL = 4
23+
24+
define spir_func i32 @foo1(i32* %src) #0 {
25+
; CHECK-FC0-LABEL: define internal spir_func i32 @foo1(
26+
; CHECK-FC0-SAME: i32* [[SRC:%.*]]) #[[ATTR0:[0-9]+]] {
27+
;
28+
; CHECK-FC1-LABEL: define internal spir_func i32 @foo1(
29+
; CHECK-FC1-SAME: i32* [[SRC:%.*]]) #[[ATTR0:[0-9]+]] {
30+
;
31+
; CHECK-FC2-LABEL: define internal spir_func i32 @foo1(
32+
; CHECK-FC2-SAME: i32* [[SRC:%.*]]) #[[ATTR0:[0-9]+]] {
33+
;
34+
; CHECK-FC3-LABEL: define internal spir_func i32 @foo1(
35+
; CHECK-FC3-SAME: i32* [[SRC:%.*]]) #[[ATTR0:[0-9]+]] {
36+
;
37+
; CHECK-FC4-LABEL: define dso_local spir_func i32 @foo1(
38+
; CHECK-FC4-SAME: i32* [[SRC:%.*]]) #[[ATTR0:[0-9]+]] {
39+
;
40+
%1 = load i32, i32* %src
41+
%2 = add i32 %1, 144
42+
ret i32 %2
43+
}
44+
45+
define spir_func i32 @foo2(i32* %src) #1 {
46+
; CHECK-FC0-LABEL: define internal spir_func i32 @foo2(
47+
; CHECK-FC0-SAME: i32* [[SRC:%.*]]) #[[ATTR1:[0-9]+]] {
48+
;
49+
; CHECK-FC1-LABEL: define internal spir_func i32 @foo2(
50+
; CHECK-FC1-SAME: i32* [[SRC:%.*]]) #[[ATTR0]] {
51+
;
52+
; CHECK-FC2-LABEL: define internal spir_func i32 @foo2(
53+
; CHECK-FC2-SAME: i32* [[SRC:%.*]]) #[[ATTR1:[0-9]+]] {
54+
;
55+
; CHECK-FC3-LABEL: define internal spir_func i32 @foo2(
56+
; CHECK-FC3-SAME: i32* [[SRC:%.*]]) #[[ATTR1:[0-9]+]] {
57+
;
58+
; CHECK-FC4-LABEL: define dso_local spir_func i32 @foo2(
59+
; CHECK-FC4-SAME: i32* [[SRC:%.*]]) #[[ATTR1:[0-9]+]] {
60+
;
61+
%1 = load i32, i32* %src
62+
%2 = mul i32 %1, 13
63+
ret i32 %2
64+
}
65+
66+
define spir_func i32 @foo3(i32* %src) #0 {
67+
; CHECK-FC0-LABEL: define internal spir_func i32 @foo3(
68+
; CHECK-FC0-SAME: i32* [[SRC:%.*]]) #[[ATTR0]] {
69+
;
70+
; CHECK-FC1-LABEL: define internal spir_func i32 @foo3(
71+
; CHECK-FC1-SAME: i32* [[SRC:%.*]]) #[[ATTR0]] {
72+
;
73+
; CHECK-FC2-LABEL: define internal spir_func i32 @foo3(
74+
; CHECK-FC2-SAME: i32* [[SRC:%.*]]) #[[ATTR0]] {
75+
;
76+
; CHECK-FC3-LABEL: define internal spir_func i32 @foo3(
77+
; CHECK-FC3-SAME: i32* [[SRC:%.*]]) #[[ATTR0]] {
78+
;
79+
; CHECK-FC4-LABEL: define dso_local spir_func i32 @foo3(
80+
; CHECK-FC4-SAME: i32* [[SRC:%.*]]) #[[ATTR0]] {
81+
;
82+
%1 = load i32, i32* %src
83+
%2 = mul i32 %1, 13
84+
ret i32 %2
85+
}
86+
87+
define spir_kernel void @test_kernel(i32* %a) #0 {
88+
; CHECK-FC0-LABEL: define spir_kernel void @test_kernel(
89+
; CHECK-FC0-SAME: i32* [[A:%.*]]) #[[ATTR0]] {
90+
;
91+
; CHECK-FC1-LABEL: define spir_kernel void @test_kernel(
92+
; CHECK-FC1-SAME: i32* [[A:%.*]]) #[[ATTR1:[0-9]+]] {
93+
;
94+
; CHECK-FC2-LABEL: define spir_kernel void @test_kernel(
95+
; CHECK-FC2-SAME: i32* [[A:%.*]]) #[[ATTR0]] {
96+
;
97+
; CHECK-FC3-LABEL: define spir_kernel void @test_kernel(
98+
; CHECK-FC3-SAME: i32* [[A:%.*]]) #[[ATTR2:[0-9]+]] {
99+
;
100+
; CHECK-FC4-LABEL: define spir_kernel void @test_kernel(
101+
; CHECK-FC4-SAME: i32* [[A:%.*]]) #[[ATTR2:[0-9]+]] {
102+
;
103+
%1 = call i32 @foo1(i32* %a)
104+
%2 = call i32 @foo2(i32* %a)
105+
%3 = call i32 @foo3(i32* %a)
106+
%4 = mul i32 %1, %2
107+
%5 = add i32 %4, %3
108+
call void @declared_foo(i32 %5)
109+
ret void
110+
}
111+
112+
; CHECK-FC0-LABEL: declare spir_func void @declared_foo(
113+
; CHECK-FC0-SAME: i32) #[[ATTR2:[0-9]+]]
114+
115+
; CHECK-FC1-LABEL: declare spir_func void @declared_foo(
116+
; CHECK-FC1-SAME: i32) #[[ATTR2:[0-9]+]]
117+
118+
; CHECK-FC2-LABEL: declare spir_func void @declared_foo(
119+
; CHECK-FC2-SAME: i32) #[[ATTR2:[0-9]+]]
120+
121+
; CHECK-FC3-LABEL: declare spir_func void @declared_foo(
122+
; CHECK-FC3-SAME: i32) #[[ATTR3:[0-9]+]]
123+
124+
; CHECK-FC4-LABEL: declare spir_func void @declared_foo(
125+
; CHECK-FC4-SAME: i32) #[[ATTR3:[0-9]+]]
126+
127+
declare spir_func void @declared_foo(i32)
128+
129+
attributes #0 = { noinline optnone }
130+
attributes #1 = { alwaysinline }
131+
132+
!igc.functions = !{!1}
133+
!1 = !{void (i32*)* @test_kernel, !2}
134+
!2 = !{!3}
135+
!3 = !{!"function_type", i32 0}
136+
;.
137+
; CHECK-FC0: attributes #[[ATTR0]] = { noinline optnone }
138+
; CHECK-FC0: attributes #[[ATTR1]] = { alwaysinline }
139+
; CHECK-FC0: attributes #[[ATTR2]] = { "referenced-indirectly" "visaStackCall" }
140+
;.
141+
; CHECK-FC1: attributes #[[ATTR0]] = { alwaysinline }
142+
; CHECK-FC1: attributes #[[ATTR1]] = { noinline optnone }
143+
; CHECK-FC1: attributes #[[ATTR2]] = { "referenced-indirectly" "visaStackCall" }
144+
;.
145+
; CHECK-FC2: attributes #[[ATTR0]] = { noinline optnone }
146+
; CHECK-FC2: attributes #[[ATTR1]] = { noinline }
147+
; CHECK-FC2: attributes #[[ATTR2]] = { "referenced-indirectly" "visaStackCall" }
148+
;.
149+
; CHECK-FC3: attributes #[[ATTR0]] = { noinline optnone "visaStackCall" }
150+
; CHECK-FC3: attributes #[[ATTR1]] = { noinline "visaStackCall" }
151+
; CHECK-FC3: attributes #[[ATTR2]] = { noinline optnone }
152+
; CHECK-FC3: attributes #[[ATTR3]] = { "referenced-indirectly" "visaStackCall" }
153+
;.
154+
; CHECK-FC4: attributes #[[ATTR0]] = { noinline optnone "referenced-indirectly" "visaStackCall" }
155+
; CHECK-FC4: attributes #[[ATTR1]] = { noinline "referenced-indirectly" "visaStackCall" }
156+
; CHECK-FC4: attributes #[[ATTR2]] = { noinline optnone }
157+
; CHECK-FC4: attributes #[[ATTR3]] = { "referenced-indirectly" "visaStackCall" }
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
;=========================== begin_copyright_notice ============================
2+
;
3+
; Copyright (C) 2024 Intel Corporation
4+
;
5+
; SPDX-License-Identifier: MIT
6+
;
7+
;============================ end_copyright_notice =============================
8+
;
9+
; REQUIRES: llvm-14-plus, regkeys, opaque-ptr-fix
10+
; RUN: igc_opt --opaque-pointers --igc-process-func-attributes -S < %s 2>&1 | FileCheck %s --check-prefixes=CHECK-FC0
11+
; RUN: igc_opt --opaque-pointers --igc-process-func-attributes -S -regkey FunctionControl=1 < %s 2>&1 | FileCheck %s --check-prefixes=CHECK-FC1
12+
; RUN: igc_opt --opaque-pointers --igc-process-func-attributes -S -regkey FunctionControl=2 < %s 2>&1 | FileCheck %s --check-prefixes=CHECK-FC2
13+
; RUN: igc_opt --opaque-pointers --igc-process-func-attributes -S -regkey FunctionControl=3 < %s 2>&1 | FileCheck %s --check-prefixes=CHECK-FC3
14+
; RUN: igc_opt --opaque-pointers --igc-process-func-attributes -S -regkey FunctionControl=4 < %s 2>&1 | FileCheck %s --check-prefixes=CHECK-FC4
15+
; ------------------------------------------------
16+
17+
; Test check forced attribute update based on FunctionControl flag:
18+
; FLAG_FCALL_DEFAULT = 0,
19+
; FLAG_FCALL_FORCE_INLINE = 1,
20+
; FLAG_FCALL_FORCE_SUBROUTINE = 2,
21+
; FLAG_FCALL_FORCE_STACKCALL = 3,
22+
; FLAG_FCALL_FORCE_INDIRECTCALL = 4
23+
24+
define spir_func i32 @foo1(ptr %src) #0 {
25+
; CHECK-FC0-LABEL: define internal spir_func i32 @foo1(
26+
; CHECK-FC0-SAME: ptr [[SRC:%.*]]) #[[ATTR0:[0-9]+]] {
27+
;
28+
; CHECK-FC1-LABEL: define internal spir_func i32 @foo1(
29+
; CHECK-FC1-SAME: ptr [[SRC:%.*]]) #[[ATTR0:[0-9]+]] {
30+
;
31+
; CHECK-FC2-LABEL: define internal spir_func i32 @foo1(
32+
; CHECK-FC2-SAME: ptr [[SRC:%.*]]) #[[ATTR0:[0-9]+]] {
33+
;
34+
; CHECK-FC3-LABEL: define internal spir_func i32 @foo1(
35+
; CHECK-FC3-SAME: ptr [[SRC:%.*]]) #[[ATTR0:[0-9]+]] {
36+
;
37+
; CHECK-FC4-LABEL: define dso_local spir_func i32 @foo1(
38+
; CHECK-FC4-SAME: ptr [[SRC:%.*]]) #[[ATTR0:[0-9]+]] {
39+
;
40+
%1 = load i32, ptr %src
41+
%2 = add i32 %1, 144
42+
ret i32 %2
43+
}
44+
45+
define spir_func i32 @foo2(ptr %src) #1 {
46+
; CHECK-FC0-LABEL: define internal spir_func i32 @foo2(
47+
; CHECK-FC0-SAME: ptr [[SRC:%.*]]) #[[ATTR1:[0-9]+]] {
48+
;
49+
; CHECK-FC1-LABEL: define internal spir_func i32 @foo2(
50+
; CHECK-FC1-SAME: ptr [[SRC:%.*]]) #[[ATTR0]] {
51+
;
52+
; CHECK-FC2-LABEL: define internal spir_func i32 @foo2(
53+
; CHECK-FC2-SAME: ptr [[SRC:%.*]]) #[[ATTR1:[0-9]+]] {
54+
;
55+
; CHECK-FC3-LABEL: define internal spir_func i32 @foo2(
56+
; CHECK-FC3-SAME: ptr [[SRC:%.*]]) #[[ATTR1:[0-9]+]] {
57+
;
58+
; CHECK-FC4-LABEL: define dso_local spir_func i32 @foo2(
59+
; CHECK-FC4-SAME: ptr [[SRC:%.*]]) #[[ATTR1:[0-9]+]] {
60+
;
61+
%1 = load i32, ptr %src
62+
%2 = mul i32 %1, 13
63+
ret i32 %2
64+
}
65+
66+
define spir_func i32 @foo3(ptr %src) #0 {
67+
; CHECK-FC0-LABEL: define internal spir_func i32 @foo3(
68+
; CHECK-FC0-SAME: ptr [[SRC:%.*]]) #[[ATTR0]] {
69+
;
70+
; CHECK-FC1-LABEL: define internal spir_func i32 @foo3(
71+
; CHECK-FC1-SAME: ptr [[SRC:%.*]]) #[[ATTR0]] {
72+
;
73+
; CHECK-FC2-LABEL: define internal spir_func i32 @foo3(
74+
; CHECK-FC2-SAME: ptr [[SRC:%.*]]) #[[ATTR0]] {
75+
;
76+
; CHECK-FC3-LABEL: define internal spir_func i32 @foo3(
77+
; CHECK-FC3-SAME: ptr [[SRC:%.*]]) #[[ATTR0]] {
78+
;
79+
; CHECK-FC4-LABEL: define dso_local spir_func i32 @foo3(
80+
; CHECK-FC4-SAME: ptr [[SRC:%.*]]) #[[ATTR0]] {
81+
;
82+
%1 = load i32, ptr %src
83+
%2 = mul i32 %1, 13
84+
ret i32 %2
85+
}
86+
87+
define spir_kernel void @test_kernel(ptr %a) #0 {
88+
; CHECK-FC0-LABEL: define spir_kernel void @test_kernel(
89+
; CHECK-FC0-SAME: ptr [[A:%.*]]) #[[ATTR0]] {
90+
;
91+
; CHECK-FC1-LABEL: define spir_kernel void @test_kernel(
92+
; CHECK-FC1-SAME: ptr [[A:%.*]]) #[[ATTR1:[0-9]+]] {
93+
;
94+
; CHECK-FC2-LABEL: define spir_kernel void @test_kernel(
95+
; CHECK-FC2-SAME: ptr [[A:%.*]]) #[[ATTR0]] {
96+
;
97+
; CHECK-FC3-LABEL: define spir_kernel void @test_kernel(
98+
; CHECK-FC3-SAME: ptr [[A:%.*]]) #[[ATTR2:[0-9]+]] {
99+
;
100+
; CHECK-FC4-LABEL: define spir_kernel void @test_kernel(
101+
; CHECK-FC4-SAME: ptr [[A:%.*]]) #[[ATTR2:[0-9]+]] {
102+
;
103+
%1 = call i32 @foo1(ptr %a)
104+
%2 = call i32 @foo2(ptr %a)
105+
%3 = call i32 @foo3(ptr %a)
106+
%4 = mul i32 %1, %2
107+
%5 = add i32 %4, %3
108+
call void @declared_foo(i32 %5)
109+
ret void
110+
}
111+
112+
; CHECK-FC0-LABEL: declare spir_func void @declared_foo(
113+
; CHECK-FC0-SAME: i32) #[[ATTR2:[0-9]+]]
114+
115+
; CHECK-FC1-LABEL: declare spir_func void @declared_foo(
116+
; CHECK-FC1-SAME: i32) #[[ATTR2:[0-9]+]]
117+
118+
; CHECK-FC2-LABEL: declare spir_func void @declared_foo(
119+
; CHECK-FC2-SAME: i32) #[[ATTR2:[0-9]+]]
120+
121+
; CHECK-FC3-LABEL: declare spir_func void @declared_foo(
122+
; CHECK-FC3-SAME: i32) #[[ATTR3:[0-9]+]]
123+
124+
; CHECK-FC4-LABEL: declare spir_func void @declared_foo(
125+
; CHECK-FC4-SAME: i32) #[[ATTR3:[0-9]+]]
126+
127+
declare spir_func void @declared_foo(i32)
128+
129+
attributes #0 = { noinline optnone }
130+
attributes #1 = { alwaysinline }
131+
132+
!igc.functions = !{!1}
133+
!1 = !{ptr @test_kernel, !2}
134+
!2 = !{!3}
135+
!3 = !{!"function_type", i32 0}
136+
;.
137+
; CHECK-FC0: attributes #[[ATTR0]] = { noinline optnone }
138+
; CHECK-FC0: attributes #[[ATTR1]] = { alwaysinline }
139+
; CHECK-FC0: attributes #[[ATTR2]] = { "referenced-indirectly" "visaStackCall" }
140+
;.
141+
; CHECK-FC1: attributes #[[ATTR0]] = { alwaysinline }
142+
; CHECK-FC1: attributes #[[ATTR1]] = { noinline optnone }
143+
; CHECK-FC1: attributes #[[ATTR2]] = { "referenced-indirectly" "visaStackCall" }
144+
;.
145+
; CHECK-FC2: attributes #[[ATTR0]] = { noinline optnone }
146+
; CHECK-FC2: attributes #[[ATTR1]] = { noinline }
147+
; CHECK-FC2: attributes #[[ATTR2]] = { "referenced-indirectly" "visaStackCall" }
148+
;.
149+
; CHECK-FC3: attributes #[[ATTR0]] = { noinline optnone "visaStackCall" }
150+
; CHECK-FC3: attributes #[[ATTR1]] = { noinline "visaStackCall" }
151+
; CHECK-FC3: attributes #[[ATTR2]] = { noinline optnone }
152+
; CHECK-FC3: attributes #[[ATTR3]] = { "referenced-indirectly" "visaStackCall" }
153+
;.
154+
; CHECK-FC4: attributes #[[ATTR0]] = { noinline optnone "referenced-indirectly" "visaStackCall" }
155+
; CHECK-FC4: attributes #[[ATTR1]] = { noinline "referenced-indirectly" "visaStackCall" }
156+
; CHECK-FC4: attributes #[[ATTR2]] = { noinline optnone }
157+
; CHECK-FC4: attributes #[[ATTR3]] = { "referenced-indirectly" "visaStackCall" }
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
;=========================== begin_copyright_notice ============================
2+
;
3+
; Copyright (C) 2024 Intel Corporation
4+
;
5+
; SPDX-License-Identifier: MIT
6+
;
7+
;============================ end_copyright_notice =============================
8+
;
9+
; REQUIRES: llvm-14-plus, regkeys
10+
; RUN: igc_opt --igc-process-func-attributes -regkey FunctionControl=3,SelectiveFunctionControl=2,SelectiveFunctionControlFile=%t < %s
11+
; RUN: cat %t | FileCheck %s
12+
; ------------------------------------------------
13+
14+
; Test checks that file with callable functions is created:
15+
16+
; CHECK-DAG: foo1
17+
; CHECK-DAG: foo2
18+
; CHECK-DAG: foo3
19+
; CHECK-NOT: declared_foo
20+
21+
define spir_func i32 @foo1(i32* %src) #0 {
22+
%1 = load i32, i32* %src
23+
%2 = add i32 %1, 144
24+
ret i32 %2
25+
}
26+
27+
define spir_func i32 @foo2(i32* %src) #1 {
28+
%1 = load i32, i32* %src
29+
%2 = mul i32 %1, 13
30+
ret i32 %2
31+
}
32+
33+
define spir_func i32 @foo3(i32* %src) #0 {
34+
%1 = load i32, i32* %src
35+
%2 = mul i32 %1, 13
36+
ret i32 %2
37+
}
38+
39+
define spir_kernel void @test_kernel(i32* %a) #0 {
40+
%1 = call i32 @foo1(i32* %a)
41+
%2 = call i32 @foo2(i32* %a)
42+
%3 = call i32 @foo3(i32* %a)
43+
%4 = mul i32 %1, %2
44+
%5 = add i32 %4, %3
45+
call void @declared_foo(i32 %5)
46+
ret void
47+
}
48+
49+
declare spir_func void @declared_foo(i32)
50+
51+
attributes #0 = { noinline optnone }
52+
attributes #1 = { alwaysinline }
53+
54+
!igc.functions = !{!1}
55+
!1 = !{void (i32*)* @test_kernel, !2}
56+
!2 = !{!3}
57+
!3 = !{!"function_type", i32 0}

0 commit comments

Comments
 (0)