[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / Transforms / OpenMP / replace_globalization.ll
blob4dc10eba524134b7da47e47962f8a415565e075f
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes --check-globals --include-generated-funcs
2 ; RUN: opt -S -passes='openmp-opt' < %s | FileCheck %s
3 ; RUN: opt -passes=openmp-opt -pass-remarks=openmp-opt -disable-output < %s 2>&1 | FileCheck %s -check-prefix=CHECK-REMARKS
4 ; RUN: opt -passes=openmp-opt -pass-remarks=openmp-opt -pass-remarks-missed=openmp-opt -disable-output -openmp-opt-shared-limit=4 < %s 2>&1 | FileCheck %s -check-prefix=CHECK-LIMIT
5 target datalayout = "e-i64:64-i128:128-v16:16-v32:32-n16:32:64"
6 target triple = "nvptx64"
8 ; UTC_ARGS: --disable
9 ; CHECK-REMARKS: remark: replace_globalization.c:5:7: Replaced globalized variable with 16 bytes of shared memory
10 ; CHECK-REMARKS: remark: replace_globalization.c:5:14: Replaced globalized variable with 4 bytes of shared memory
11 ; CHECK-REMARKS-NOT: 6 bytes
12 ; CHECK-LIMIT: remark: replace_globalization.c:5:14: Replaced globalized variable with 4 bytes of shared memory
13 ; CHECK-LIMIT: remark: replace_globalization.c:5:7: Found thread data sharing on the GPU. Expect degraded performance due to data globalization
14 ; UTC_ARGS: --enable
16 %struct.ident_t = type { i32, i32, i32, i32, ptr }
17 %struct.KernelEnvironmentTy = type { %struct.ConfigurationEnvironmentTy, ptr, ptr }
18 %struct.ConfigurationEnvironmentTy = type { i8, i8, i8, i32, i32, i32, i32 }
20 @S = external local_unnamed_addr global ptr
21 @0 = private unnamed_addr constant [113 x i8] c";llvm/test/Transforms/OpenMP/custom_state_machines_remarks.c;__omp_offloading_2a_d80d3d_test_fallback_l11;11;1;;\00", align 1
22 @1 = private unnamed_addr constant %struct.ident_t { i32 0, i32 2, i32 0, i32 0, ptr @0 }, align 8
23 @foo_kernel_environment = local_unnamed_addr constant %struct.KernelEnvironmentTy { %struct.ConfigurationEnvironmentTy { i8 0, i8 0, i8 1, i32 0, i32 0, i32 0, i32 0 }, ptr @1, ptr null }
24 @bar_kernel_environment = local_unnamed_addr constant %struct.KernelEnvironmentTy { %struct.ConfigurationEnvironmentTy { i8 0, i8 0, i8 1, i32 0, i32 0, i32 0, i32 0 }, ptr @1, ptr null }
25 @baz_kernel_environment = local_unnamed_addr constant %struct.KernelEnvironmentTy { %struct.ConfigurationEnvironmentTy { i8 0, i8 0, i8 2, i32 0, i32 0, i32 0, i32 0 }, ptr @1, ptr null }
28 define dso_local void @foo(ptr %dyn) "kernel" {
29 entry:
30   %c = call i32 @__kmpc_target_init(ptr @foo_kernel_environment, ptr %dyn)
31   %x = call align 4 ptr @__kmpc_alloc_shared(i64 4)
32   call void @unknown_no_openmp()
33   call void @use(ptr %x)
34   call void @__kmpc_free_shared(ptr %x, i64 4)
35   call void @__kmpc_target_deinit()
36   ret void
39 define void @bar(ptr %dyn) "kernel" {
40   %c = call i32 @__kmpc_target_init(ptr @bar_kernel_environment, ptr %dyn)
41   call void @unknown_no_openmp()
42   %cmp = icmp eq i32 %c, -1
43   br i1 %cmp, label %master1, label %exit
44 master1:
45   %x = call align 4 ptr @__kmpc_alloc_shared(i64 16), !dbg !11
46   call void @use(ptr %x)
47   call void @__kmpc_free_shared(ptr %x, i64 16)
48   br label %next
49 next:
50   call void @unknown_no_openmp()
51   %b0 = icmp eq i32 %c, -1
52   br i1 %b0, label %master2, label %exit
53 master2:
54   %y = call align 4 ptr @__kmpc_alloc_shared(i64 4), !dbg !12
55   call void @use(ptr %y)
56   call void @__kmpc_free_shared(ptr %y, i64 4)
57   br label %exit
58 exit:
59   call void @__kmpc_target_deinit()
60   ret void
63 define void @baz_spmd(ptr %dyn) "kernel" {
64   %c = call i32 @__kmpc_target_init(ptr @baz_kernel_environment, ptr %dyn)
65   call void @unknown_no_openmp()
66   %c0 = icmp eq i32 %c, -1
67   br i1 %c0, label %master3, label %exit
68 master3:
69   %z = call align 4 ptr @__kmpc_alloc_shared(i64 24), !dbg !12
70   call void @use(ptr %z)
71   call void @__kmpc_free_shared(ptr %z, i64 24)
72   br label %exit
73 exit:
74   call void @__kmpc_target_deinit()
75   ret void
78 define void @use(ptr %x) {
79 entry:
80   store ptr %x, ptr @S
81   ret void
84 @offset =global i32 undef
85 @stack = internal addrspace(3) global [1024 x i8] undef
86 define private ptr @__kmpc_alloc_shared(i64) {
87   %ac = addrspacecast ptr addrspace(3) @stack to ptr
88   %l = load i32, ptr @offset
89   %gep = getelementptr i8, ptr %ac, i32 %l
90   ret ptr %gep
93 declare void @__kmpc_free_shared(ptr, i64)
95 declare i32 @llvm.nvvm.read.ptx.sreg.tid.x()
97 declare i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
99 declare i32 @llvm.nvvm.read.ptx.sreg.warpsize()
101 ; Make it a weak definition so we will apply custom state machine rewriting but can't use the body in the reasoning.
102 define weak i32 @__kmpc_target_init(ptr, ptr) {
103   ret i32 0
106 declare void @__kmpc_target_deinit()
108 declare void @unknown_no_openmp() "llvm.assume"="omp_no_openmp"
110 !llvm.dbg.cu = !{!0}
111 !llvm.module.flags = !{!3, !4, !5, !6}
112 !nvvm.annotations = !{!7, !8, !13}
114 !0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 12.0.0", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, splitDebugInlining: false, nameTableKind: None)
115 !1 = !DIFile(filename: "replace_globalization.c", directory: "/tmp/replace_globalization.c")
116 !2 = !{}
117 !3 = !{i32 2, !"Debug Info Version", i32 3}
118 !4 = !{i32 1, !"wchar_size", i32 4}
119 !5 = !{i32 7, !"openmp", i32 50}
120 !6 = !{i32 7, !"openmp-device", i32 50}
121 !7 = !{ptr @foo, !"kernel", i32 1}
122 !8 = !{ptr @bar, !"kernel", i32 1}
123 !13 = !{ptr @baz_spmd, !"kernel", i32 1}
124 !9 = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 1, type: !10, scopeLine: 1, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !2)
125 !10 = !DISubroutineType(types: !2)
126 !11 = !DILocation(line: 5, column: 7, scope: !9)
127 !12 = !DILocation(line: 5, column: 14, scope: !9)
129 ; CHECK: @[[S:[a-zA-Z0-9_$"\\.-]+]] = external local_unnamed_addr global ptr
130 ; CHECK: @[[GLOB0:[0-9]+]] = private unnamed_addr constant [113 x i8] c"
131 ; CHECK: @[[GLOB1:[0-9]+]] = private unnamed_addr constant [[STRUCT_IDENT_T:%.*]] { i32 0, i32 2, i32 0, i32 0, ptr @[[GLOB0]] }, align 8
132 ; CHECK: @[[FOO_KERNEL_ENVIRONMENT:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr constant [[STRUCT_KERNELENVIRONMENTTY:%.*]] { [[STRUCT_CONFIGURATIONENVIRONMENTTY:%.*]] { i8 0, i8 0, i8 1, i32 0, i32 0, i32 0, i32 0 }, ptr @[[GLOB1]], ptr null }
133 ; CHECK: @[[BAR_KERNEL_ENVIRONMENT:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr constant [[STRUCT_KERNELENVIRONMENTTY:%.*]] { [[STRUCT_CONFIGURATIONENVIRONMENTTY:%.*]] { i8 0, i8 0, i8 1, i32 0, i32 0, i32 0, i32 0 }, ptr @[[GLOB1]], ptr null }
134 ; CHECK: @[[BAZ_KERNEL_ENVIRONMENT:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr constant [[STRUCT_KERNELENVIRONMENTTY:%.*]] { [[STRUCT_CONFIGURATIONENVIRONMENTTY:%.*]] { i8 0, i8 0, i8 2, i32 0, i32 0, i32 0, i32 0 }, ptr @[[GLOB1]], ptr null }
135 ; CHECK: @[[OFFSET:[a-zA-Z0-9_$"\\.-]+]] = global i32 undef
136 ; CHECK: @[[STACK:[a-zA-Z0-9_$"\\.-]+]] = internal addrspace(3) global [1024 x i8] undef
137 ; CHECK: @[[X_SHARED:[a-zA-Z0-9_$"\\.-]+]] = internal addrspace(3) global [16 x i8] poison, align 4
138 ; CHECK: @[[Y_SHARED:[a-zA-Z0-9_$"\\.-]+]] = internal addrspace(3) global [4 x i8] poison, align 4
140 ; CHECK-LABEL: define {{[^@]+}}@foo
141 ; CHECK-SAME: (ptr [[DYN:%.*]]) #[[ATTR0:[0-9]+]] {
142 ; CHECK-NEXT:  entry:
143 ; CHECK-NEXT:    [[C:%.*]] = call i32 @__kmpc_target_init(ptr @foo_kernel_environment, ptr [[DYN]])
144 ; CHECK-NEXT:    [[X:%.*]] = call align 4 ptr @__kmpc_alloc_shared(i64 4) #[[ATTR6:[0-9]+]]
145 ; CHECK-NEXT:    call void @unknown_no_openmp() #[[ATTR5:[0-9]+]]
146 ; CHECK-NEXT:    call void @use.internalized(ptr nofree [[X]]) #[[ATTR7:[0-9]+]]
147 ; CHECK-NEXT:    call void @__kmpc_free_shared(ptr [[X]], i64 4) #[[ATTR8:[0-9]+]]
148 ; CHECK-NEXT:    call void @__kmpc_target_deinit()
149 ; CHECK-NEXT:    ret void
152 ; CHECK-LABEL: define {{[^@]+}}@bar
153 ; CHECK-SAME: (ptr [[DYN:%.*]]) #[[ATTR0]] {
154 ; CHECK-NEXT:    [[C:%.*]] = call i32 @__kmpc_target_init(ptr @bar_kernel_environment, ptr [[DYN]])
155 ; CHECK-NEXT:    call void @unknown_no_openmp() #[[ATTR5]]
156 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[C]], -1
157 ; CHECK-NEXT:    br i1 [[CMP]], label [[MASTER1:%.*]], label [[EXIT:%.*]]
158 ; CHECK:       master1:
159 ; CHECK-NEXT:    call void @use.internalized(ptr nofree addrspacecast (ptr addrspace(3) @x_shared to ptr)) #[[ATTR7]]
160 ; CHECK-NEXT:    br label [[NEXT:%.*]]
161 ; CHECK:       next:
162 ; CHECK-NEXT:    call void @unknown_no_openmp() #[[ATTR5]]
163 ; CHECK-NEXT:    [[B0:%.*]] = icmp eq i32 [[C]], -1
164 ; CHECK-NEXT:    br i1 [[B0]], label [[MASTER2:%.*]], label [[EXIT]]
165 ; CHECK:       master2:
166 ; CHECK-NEXT:    call void @use.internalized(ptr nofree addrspacecast (ptr addrspace(3) @y_shared to ptr)) #[[ATTR7]]
167 ; CHECK-NEXT:    br label [[EXIT]]
168 ; CHECK:       exit:
169 ; CHECK-NEXT:    call void @__kmpc_target_deinit()
170 ; CHECK-NEXT:    ret void
173 ; CHECK-LABEL: define {{[^@]+}}@baz_spmd
174 ; CHECK-SAME: (ptr [[DYN:%.*]]) #[[ATTR0]] {
175 ; CHECK-NEXT:    [[C:%.*]] = call i32 @__kmpc_target_init(ptr @baz_kernel_environment, ptr [[DYN]])
176 ; CHECK-NEXT:    call void @unknown_no_openmp() #[[ATTR5]]
177 ; CHECK-NEXT:    [[C0:%.*]] = icmp eq i32 [[C]], -1
178 ; CHECK-NEXT:    br i1 [[C0]], label [[MASTER3:%.*]], label [[EXIT:%.*]]
179 ; CHECK:       master3:
180 ; CHECK-NEXT:    [[Z:%.*]] = call align 4 ptr @__kmpc_alloc_shared(i64 24) #[[ATTR6]], !dbg [[DBG10:![0-9]+]]
181 ; CHECK-NEXT:    call void @use.internalized(ptr nofree [[Z]]) #[[ATTR7]]
182 ; CHECK-NEXT:    call void @__kmpc_free_shared(ptr [[Z]], i64 24) #[[ATTR8]]
183 ; CHECK-NEXT:    br label [[EXIT]]
184 ; CHECK:       exit:
185 ; CHECK-NEXT:    call void @__kmpc_target_deinit()
186 ; CHECK-NEXT:    ret void
189 ; CHECK: Function Attrs: nofree norecurse nosync nounwind memory(write)
190 ; CHECK-LABEL: define {{[^@]+}}@use.internalized
191 ; CHECK-SAME: (ptr nofree [[X:%.*]]) #[[ATTR1:[0-9]+]] {
192 ; CHECK-NEXT:  entry:
193 ; CHECK-NEXT:    store ptr [[X]], ptr @S, align 8
194 ; CHECK-NEXT:    ret void
197 ; CHECK-LABEL: define {{[^@]+}}@use
198 ; CHECK-SAME: (ptr [[X:%.*]]) {
199 ; CHECK-NEXT:  entry:
200 ; CHECK-NEXT:    store ptr [[X]], ptr @S, align 8
201 ; CHECK-NEXT:    ret void
204 ; CHECK: Function Attrs: norecurse nosync nounwind allocsize(0) memory(read)
205 ; CHECK-LABEL: define {{[^@]+}}@__kmpc_alloc_shared
206 ; CHECK-SAME: (i64 [[TMP0:%.*]]) #[[ATTR2:[0-9]+]] {
207 ; CHECK-NEXT:    [[L:%.*]] = load i32, ptr @offset, align 4
208 ; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i8, ptr addrspacecast (ptr addrspace(3) @stack to ptr), i32 [[L]]
209 ; CHECK-NEXT:    ret ptr [[GEP]]
212 ; CHECK-LABEL: define {{[^@]+}}@__kmpc_target_init
213 ; CHECK-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) {
214 ; CHECK-NEXT:    ret i32 0
217 ; CHECK: attributes #[[ATTR0]] = { "kernel" }
218 ; CHECK: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind memory(write) }
219 ; CHECK: attributes #[[ATTR2]] = { norecurse nosync nounwind allocsize(0) memory(read) }
220 ; CHECK: attributes #[[ATTR3:[0-9]+]] = { nosync nounwind }
221 ; CHECK: attributes #[[ATTR4:[0-9]+]] = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
222 ; CHECK: attributes #[[ATTR5]] = { "llvm.assume"="omp_no_openmp" }
223 ; CHECK: attributes #[[ATTR6]] = { nounwind memory(read) }
224 ; CHECK: attributes #[[ATTR7]] = { nosync nounwind memory(write) }
225 ; CHECK: attributes #[[ATTR8]] = { nounwind }
227 ; CHECK: [[META0:![0-9]+]] = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 12.0.0", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, splitDebugInlining: false, nameTableKind: None)
228 ; CHECK: [[META1:![0-9]+]] = !DIFile(filename: "replace_globalization.c", directory: "/tmp/replace_globalization.c")
229 ; CHECK: [[META2:![0-9]+]] = !{}
230 ; CHECK: [[META3:![0-9]+]] = !{i32 2, !"Debug Info Version", i32 3}
231 ; CHECK: [[META4:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
232 ; CHECK: [[META5:![0-9]+]] = !{i32 7, !"openmp", i32 50}
233 ; CHECK: [[META6:![0-9]+]] = !{i32 7, !"openmp-device", i32 50}
234 ; CHECK: [[META7:![0-9]+]] = !{ptr @foo, !"kernel", i32 1}
235 ; CHECK: [[META8:![0-9]+]] = !{ptr @bar, !"kernel", i32 1}
236 ; CHECK: [[META9:![0-9]+]] = !{ptr @baz_spmd, !"kernel", i32 1}
237 ; CHECK: [[DBG10]] = !DILocation(line: 5, column: 14, scope: !11)
238 ; CHECK: [[META11:![0-9]+]] = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 1, type: !12, scopeLine: 1, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !2)
239 ; CHECK: [[META12:![0-9]+]] = !DISubroutineType(types: !2)
241 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
242 ; CHECK-LIMIT: {{.*}}
243 ; CHECK-REMARKS: {{.*}}