Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / remove-no-kernel-id-attribute.ll
blob384a9c4043a1d3cfbab0f07712a63411df523b09
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-attributes --check-globals --version 3
2 ; RUN: opt -S -mtriple=amdgcn-- -passes=amdgpu-attributor,amdgpu-lower-module-lds < %s --amdgpu-lower-module-lds-strategy=table | FileCheck -check-prefixes=CHECK,TABLE %s
4 ; FIXME: Work around update_test_checks bug in constant expression handling by manually deleting part of the last global pattern
6 @function.lds = addrspace(3) global i16 poison
7 @other.kernel.lds = addrspace(3) global i16 poison
8 @recursive.kernel.lds = addrspace(3) global i16 poison
11 ; CHECK: @[[LLVM_AMDGCN_KERNEL_K0_F0_LDS:[a-zA-Z0-9_$"\\.-]+]] = internal addrspace(3) global [[LLVM_AMDGCN_KERNEL_K0_F0_LDS_T:%.*]] poison, align 2, !absolute_symbol !0
12 ; CHECK: @[[LLVM_AMDGCN_KERNEL_K1_F0_LDS:[a-zA-Z0-9_$"\\.-]+]] = internal addrspace(3) global [[LLVM_AMDGCN_KERNEL_K1_F0_LDS_T:%.*]] poison, align 2, !absolute_symbol !0
13 ; CHECK: @[[LLVM_AMDGCN_KERNEL_KERNEL_LDS_LDS:[a-zA-Z0-9_$"\\.-]+]] = internal addrspace(3) global [[LLVM_AMDGCN_KERNEL_KERNEL_LDS_LDS_T:%.*]] poison, align 2, !absolute_symbol !0
14 ; CHECK: @[[LLVM_AMDGCN_KERNEL_KERNEL_LDS_RECURSION_LDS:[a-zA-Z0-9_$"\\.-]+]] = internal addrspace(3) global [[LLVM_AMDGCN_KERNEL_KERNEL_LDS_RECURSION_LDS_T:%.*]] poison, align 2, !absolute_symbol !0
15 ; CHECK: @[[LLVM_AMDGCN_LDS_OFFSET_TABLE:[a-zA-Z0-9_$"\\.-]+]] = internal addrspace(4) constant [3 x [2 x i32]]
17 define internal void @lds_use_through_indirect() {
18 ; CHECK-LABEL: define internal void @lds_use_through_indirect(
19 ; CHECK-SAME: ) #[[ATTR0:[0-9]+]] {
20 ; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.amdgcn.lds.kernel.id()
21 ; CHECK-NEXT:    [[FUNCTION_LDS2:%.*]] = getelementptr inbounds [3 x [2 x i32]], ptr addrspace(4) @llvm.amdgcn.lds.offset.table, i32 0, i32 [[TMP1]], i32 0
22 ; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr addrspace(4) [[FUNCTION_LDS2]], align 4
23 ; CHECK-NEXT:    [[FUNCTION_LDS3:%.*]] = inttoptr i32 [[TMP2]] to ptr addrspace(3)
24 ; CHECK-NEXT:    [[LD:%.*]] = load i16, ptr addrspace(3) [[FUNCTION_LDS3]], align 2
25 ; CHECK-NEXT:    [[MUL:%.*]] = mul i16 [[LD]], 7
26 ; CHECK-NEXT:    [[FUNCTION_LDS:%.*]] = getelementptr inbounds [3 x [2 x i32]], ptr addrspace(4) @llvm.amdgcn.lds.offset.table, i32 0, i32 [[TMP1]], i32 0
27 ; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr addrspace(4) [[FUNCTION_LDS]], align 4
28 ; CHECK-NEXT:    [[FUNCTION_LDS1:%.*]] = inttoptr i32 [[TMP3]] to ptr addrspace(3)
29 ; CHECK-NEXT:    store i16 [[MUL]], ptr addrspace(3) [[FUNCTION_LDS1]], align 2
30 ; CHECK-NEXT:    ret void
32   %ld = load i16, ptr addrspace(3) @function.lds
33   %mul = mul i16 %ld, 7
34   store i16 %mul, ptr addrspace(3) @function.lds
35   ret void
38 define internal void @indirectly_called() {
39 ; CHECK-LABEL: define internal void @indirectly_called(
40 ; CHECK-SAME: ) #[[ATTR0]] {
41 ; CHECK-NEXT:    store volatile ptr @indirectly_called, ptr addrspace(1) null, align 8
42 ; CHECK-NEXT:    call void @lds_use_through_indirect()
43 ; CHECK-NEXT:    ret void
45   store volatile ptr @indirectly_called, ptr addrspace(1) null
46   call void @lds_use_through_indirect()
47   ret void
50 define internal void @calls_indirectly_called() {
51 ; CHECK-LABEL: define internal void @calls_indirectly_called(
52 ; CHECK-SAME: ) #[[ATTR0]] {
53 ; CHECK-NEXT:    call void @indirectly_called()
54 ; CHECK-NEXT:    ret void
56   call void @indirectly_called()
57   ret void
60 ; TODO: Should still have "amdgpu-no-lds-kernel-id" attached
61 define internal void @no_lds_global_use_leaf() {
62 ; CHECK-LABEL: define internal void @no_lds_global_use_leaf(
63 ; CHECK-SAME: ) #[[ATTR1:[0-9]+]] {
64 ; CHECK-NEXT:    ret void
66   ret void
69 ; Should have "amdgpu-no-lds-kernel-id" stripped
70 define internal void @f0() {
71 ; CHECK-LABEL: define internal void @f0(
72 ; CHECK-SAME: ) #[[ATTR0]] {
73 ; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.amdgcn.lds.kernel.id()
74 ; CHECK-NEXT:    [[FUNCTION_LDS2:%.*]] = getelementptr inbounds [3 x [2 x i32]], ptr addrspace(4) @llvm.amdgcn.lds.offset.table, i32 0, i32 [[TMP1]], i32 0
75 ; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr addrspace(4) [[FUNCTION_LDS2]], align 4
76 ; CHECK-NEXT:    [[FUNCTION_LDS3:%.*]] = inttoptr i32 [[TMP2]] to ptr addrspace(3)
77 ; CHECK-NEXT:    [[LD:%.*]] = load i16, ptr addrspace(3) [[FUNCTION_LDS3]], align 2
78 ; CHECK-NEXT:    [[MUL:%.*]] = mul i16 [[LD]], 4
79 ; CHECK-NEXT:    [[FUNCTION_LDS:%.*]] = getelementptr inbounds [3 x [2 x i32]], ptr addrspace(4) @llvm.amdgcn.lds.offset.table, i32 0, i32 [[TMP1]], i32 0
80 ; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr addrspace(4) [[FUNCTION_LDS]], align 4
81 ; CHECK-NEXT:    [[FUNCTION_LDS1:%.*]] = inttoptr i32 [[TMP3]] to ptr addrspace(3)
82 ; CHECK-NEXT:    store i16 [[MUL]], ptr addrspace(3) [[FUNCTION_LDS1]], align 2
83 ; CHECK-NEXT:    call void @no_lds_global_use_leaf()
84 ; CHECK-NEXT:    ret void
86   %ld = load i16, ptr addrspace(3) @function.lds
87   %mul = mul i16 %ld, 4
88   store i16 %mul, ptr addrspace(3) @function.lds
89   call void @no_lds_global_use_leaf()
90   ret void
93 ; Should have "amdgpu-no-lds-kernel-id" stripped
94 define internal void @f0_transitive() {
95 ; CHECK-LABEL: define internal void @f0_transitive(
96 ; CHECK-SAME: ) #[[ATTR0]] {
97 ; CHECK-NEXT:    call void @f0()
98 ; CHECK-NEXT:    call void @no_lds_global_use_leaf()
99 ; CHECK-NEXT:    ret void
101   call void @f0()
102   call void @no_lds_global_use_leaf()
103   ret void
106 define amdgpu_kernel void @k0_f0() {
107 ; CHECK-LABEL: define amdgpu_kernel void @k0_f0(
108 ; CHECK-SAME: ) #[[ATTR2:[0-9]+]] !llvm.amdgcn.lds.kernel.id !2 {
109 ; CHECK-NEXT:    call void @llvm.donothing() [ "ExplicitUse"(ptr addrspace(3) @llvm.amdgcn.kernel.k0_f0.lds) ]
110 ; CHECK-NEXT:    call void @f0_transitive()
111 ; CHECK-NEXT:    ret void
113   call void @f0_transitive()
114   ret void
117 define amdgpu_kernel void @k1_f0() {
118 ; CHECK-LABEL: define amdgpu_kernel void @k1_f0(
119 ; CHECK-SAME: ) #[[ATTR3:[0-9]+]] !llvm.amdgcn.lds.kernel.id !3 {
120 ; CHECK-NEXT:    call void @llvm.donothing() [ "ExplicitUse"(ptr addrspace(3) @llvm.amdgcn.kernel.k1_f0.lds) ], !alias.scope !4, !noalias !7
121 ; CHECK-NEXT:    call void @f0_transitive()
122 ; CHECK-NEXT:    [[FPTR:%.*]] = load volatile ptr, ptr addrspace(1) null, align 8
123 ; CHECK-NEXT:    call void [[FPTR]]()
124 ; CHECK-NEXT:    call void @calls_indirectly_called()
125 ; CHECK-NEXT:    ret void
127   call void @f0_transitive()
128   %fptr = load volatile ptr, ptr addrspace(1) null
129   call void %fptr()
130   call void @calls_indirectly_called()
131   ret void
134 ; Should still have "amdgpu-no-lds-kernel-id" attached
135 define amdgpu_kernel void @kernel_lds() {
136 ; CHECK-LABEL: define amdgpu_kernel void @kernel_lds(
137 ; CHECK-SAME: ) #[[ATTR4:[0-9]+]] {
138 ; CHECK-NEXT:    [[LD:%.*]] = load i16, ptr addrspace(3) @llvm.amdgcn.kernel.kernel_lds.lds, align 2
139 ; CHECK-NEXT:    [[MUL:%.*]] = mul i16 [[LD]], 42
140 ; CHECK-NEXT:    store i16 [[MUL]], ptr addrspace(3) @llvm.amdgcn.kernel.kernel_lds.lds, align 2
141 ; CHECK-NEXT:    ret void
143   %ld = load i16, ptr addrspace(3) @other.kernel.lds
144   %mul = mul i16 %ld, 42
145   store i16 %mul, ptr addrspace(3) @other.kernel.lds
146   ret void
149 define internal i16 @mutual_recursion_0(i16 %arg) {
150 ; CHECK-LABEL: define internal i16 @mutual_recursion_0(
151 ; CHECK-SAME: i16 [[ARG:%.*]]) #[[ATTR0]] {
152 ; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.amdgcn.lds.kernel.id()
153 ; CHECK-NEXT:    [[RECURSIVE_KERNEL_LDS:%.*]] = getelementptr inbounds [3 x [2 x i32]], ptr addrspace(4) @llvm.amdgcn.lds.offset.table, i32 0, i32 [[TMP1]], i32 1
154 ; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr addrspace(4) [[RECURSIVE_KERNEL_LDS]], align 4
155 ; CHECK-NEXT:    [[RECURSIVE_KERNEL_LDS1:%.*]] = inttoptr i32 [[TMP2]] to ptr addrspace(3)
156 ; CHECK-NEXT:    [[LD:%.*]] = load i16, ptr addrspace(3) [[RECURSIVE_KERNEL_LDS1]], align 2
157 ; CHECK-NEXT:    [[MUL:%.*]] = mul i16 [[LD]], 7
158 ; CHECK-NEXT:    [[RET:%.*]] = call i16 @mutual_recursion_1(i16 [[LD]])
159 ; CHECK-NEXT:    [[ADD:%.*]] = add i16 [[RET]], 1
160 ; CHECK-NEXT:    ret i16 [[ADD]]
162   %ld = load i16, ptr addrspace(3) @recursive.kernel.lds
163   %mul = mul i16 %ld, 7
164   %ret = call i16 @mutual_recursion_1(i16 %ld)
165   %add = add i16 %ret, 1
166   ret i16 %add
169 define internal void @mutual_recursion_1(i16 %arg) {
170 ; CHECK-LABEL: define internal void @mutual_recursion_1(
171 ; CHECK-SAME: i16 [[ARG:%.*]]) #[[ATTR0]] {
172 ; CHECK-NEXT:    call void @mutual_recursion_0(i16 [[ARG]])
173 ; CHECK-NEXT:    ret void
175   call void @mutual_recursion_0(i16 %arg)
176   ret void
179 define amdgpu_kernel void @kernel_lds_recursion() {
180 ; CHECK-LABEL: define amdgpu_kernel void @kernel_lds_recursion(
181 ; CHECK-SAME: ) #[[ATTR2]] !llvm.amdgcn.lds.kernel.id !9 {
182 ; CHECK-NEXT:    call void @llvm.donothing() [ "ExplicitUse"(ptr addrspace(3) @llvm.amdgcn.kernel.kernel_lds_recursion.lds) ]
183 ; CHECK-NEXT:    call void @mutual_recursion_0(i16 0)
184 ; CHECK-NEXT:    ret void
186   call void @mutual_recursion_0(i16 0)
187   ret void
190 !llvm.module.flags = !{!1}
191 !1 = !{i32 1, !"amdhsa_code_object_version", i32 400}
194 ; CHECK: attributes #[[ATTR0]] = { "amdgpu-no-agpr" "amdgpu-no-completion-action" "amdgpu-no-default-queue" "amdgpu-no-dispatch-id" "amdgpu-no-dispatch-ptr" "amdgpu-no-heap-ptr" "amdgpu-no-hostcall-ptr" "amdgpu-no-implicitarg-ptr" "amdgpu-no-multigrid-sync-arg" "amdgpu-no-workgroup-id-x" "amdgpu-no-workgroup-id-y" "amdgpu-no-workgroup-id-z" "amdgpu-no-workitem-id-x" "amdgpu-no-workitem-id-y" "amdgpu-no-workitem-id-z" "amdgpu-waves-per-eu"="4,10" "uniform-work-group-size"="false" }
195 ; CHECK: attributes #[[ATTR1]] = { "amdgpu-no-agpr" "amdgpu-no-completion-action" "amdgpu-no-default-queue" "amdgpu-no-dispatch-id" "amdgpu-no-dispatch-ptr" "amdgpu-no-heap-ptr" "amdgpu-no-hostcall-ptr" "amdgpu-no-implicitarg-ptr" "amdgpu-no-multigrid-sync-arg" "amdgpu-no-queue-ptr" "amdgpu-no-workgroup-id-x" "amdgpu-no-workgroup-id-y" "amdgpu-no-workgroup-id-z" "amdgpu-no-workitem-id-x" "amdgpu-no-workitem-id-y" "amdgpu-no-workitem-id-z" "amdgpu-waves-per-eu"="4,10" "uniform-work-group-size"="false" }
196 ; CHECK: attributes #[[ATTR2]] = { "amdgpu-lds-size"="2" "amdgpu-no-agpr" "amdgpu-no-completion-action" "amdgpu-no-default-queue" "amdgpu-no-dispatch-id" "amdgpu-no-dispatch-ptr" "amdgpu-no-heap-ptr" "amdgpu-no-hostcall-ptr" "amdgpu-no-implicitarg-ptr" "amdgpu-no-multigrid-sync-arg" "amdgpu-no-workgroup-id-x" "amdgpu-no-workgroup-id-y" "amdgpu-no-workgroup-id-z" "amdgpu-no-workitem-id-x" "amdgpu-no-workitem-id-y" "amdgpu-no-workitem-id-z" "amdgpu-waves-per-eu"="4,10" "uniform-work-group-size"="false" }
197 ; CHECK: attributes #[[ATTR3]] = { "amdgpu-lds-size"="4" "amdgpu-waves-per-eu"="4,10" "uniform-work-group-size"="false" }
198 ; CHECK: attributes #[[ATTR4]] = { "amdgpu-lds-size"="2" "amdgpu-no-agpr" "amdgpu-no-completion-action" "amdgpu-no-default-queue" "amdgpu-no-dispatch-id" "amdgpu-no-dispatch-ptr" "amdgpu-no-heap-ptr" "amdgpu-no-hostcall-ptr" "amdgpu-no-implicitarg-ptr" "amdgpu-no-lds-kernel-id" "amdgpu-no-multigrid-sync-arg" "amdgpu-no-queue-ptr" "amdgpu-no-workgroup-id-x" "amdgpu-no-workgroup-id-y" "amdgpu-no-workgroup-id-z" "amdgpu-no-workitem-id-x" "amdgpu-no-workitem-id-y" "amdgpu-no-workitem-id-z" "uniform-work-group-size"="false" }
199 ; CHECK: attributes #[[ATTR5:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(none) }
200 ; CHECK: attributes #[[ATTR6:[0-9]+]] = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
202 ; CHECK: [[META0:![0-9]+]] = !{i32 0, i32 1}
203 ; CHECK: [[META1:![0-9]+]] = !{i32 0}
204 ; CHECK: [[META2:![0-9]+]] = !{i32 1}
205 ; CHECK: [[META3:![0-9]+]] = !{!5}
206 ; CHECK: [[META4:![0-9]+]] = distinct !{!5, !6}
207 ; CHECK: [[META5:![0-9]+]] = distinct !{!6}
208 ; CHECK: [[META6:![0-9]+]] = !{!8}
209 ; CHECK: [[META7:![0-9]+]] = distinct !{!8, !6}
210 ; CHECK: [[META8:![0-9]+]] = !{i32 2}
212 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
213 ; TABLE: {{.*}}