[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / Transforms / OpenMP / remove_globalization.ll
blob0c27e9c86c7fd022ef8bb3a972b67e20e20f19ab
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-globals
2 ; RUN: opt -S -passes=openmp-opt < %s | FileCheck %s
3 ; RUN: opt -passes=openmp-opt -pass-remarks=openmp-opt -pass-remarks-missed=openmp-opt -disable-output < %s 2>&1 | FileCheck %s -check-prefix=CHECK-REMARKS
4 ; RUN: opt -openmp-opt-disable-deglobalization -S -passes=openmp-opt < %s | FileCheck %s --check-prefix=CHECK-DISABLED
5 target datalayout = "e-i64:64-i128:128-v16:16-v32:32-n16:32:64"
6 target triple = "nvptx64"
8 @S = external local_unnamed_addr global ptr
9 %struct.KernelEnvironmentTy = type { %struct.ConfigurationEnvironmentTy, ptr, ptr }
10 %struct.ConfigurationEnvironmentTy = type { i8, i8, i8, i32, i32, i32, i32 }
11 @kernel_kernel_environment = local_unnamed_addr constant %struct.KernelEnvironmentTy { %struct.ConfigurationEnvironmentTy { i8 1, i8 0, i8 1, i32 0, i32 0, i32 0, i32 0 }, ptr null, ptr null }
14 ; UTC_ARGS: --disable
15 ; CHECK-REMARKS: remark: remove_globalization.c:4:2: Could not move globalized variable to the stack. Variable is potentially captured in call. Mark parameter as `__attribute__((noescape))` to override.
16 ; CHECK-REMARKS: remark: remove_globalization.c:2:2: Moving globalized variable to the stack.
17 ; CHECK-REMARKS: remark: remove_globalization.c:4:2: Moving globalized variable to the stack.
18 ; CHECK-REMARKS: remark: remove_globalization.c:10:2: Moving globalized variable to the stack.
19 ; CHECK-REMARKS: remark: remove_globalization.c:6:2: Moving globalized variable to the stack.
20 ; UTC_ARGS: --enable
22 ; Make it a weak definition so we will apply custom state machine rewriting but can't use the body in the reasoning.
24 ; CHECK: @[[S:[a-zA-Z0-9_$"\\.-]+]] = external local_unnamed_addr global ptr
25 ; CHECK: @[[KERNEL_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 null, ptr null }
27 ; CHECK-DISABLED: @[[S:[a-zA-Z0-9_$"\\.-]+]] = external local_unnamed_addr global ptr
28 ; CHECK-DISABLED: @[[KERNEL_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 null, ptr null }
30 define weak i32 @__kmpc_target_init(ptr %0, ptr) {
31 ; CHECK-LABEL: define {{[^@]+}}@__kmpc_target_init
32 ; CHECK-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) {
33 ; CHECK-NEXT:    ret i32 0
35 ; CHECK-DISABLED-LABEL: define {{[^@]+}}@__kmpc_target_init
36 ; CHECK-DISABLED-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) {
37 ; CHECK-DISABLED-NEXT:    ret i32 0
39   ret i32 0
41 declare void @__kmpc_target_deinit()
43 define void @kernel(ptr %dyn) "kernel" {
44 ; CHECK-LABEL: define {{[^@]+}}@kernel
45 ; CHECK-SAME: (ptr [[DYN:%.*]]) #[[ATTR0:[0-9]+]] {
46 ; CHECK-NEXT:  entry:
47 ; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @kernel_kernel_environment, ptr [[DYN]])
48 ; CHECK-NEXT:    call void @foo() #[[ATTR1:[0-9]+]]
49 ; CHECK-NEXT:    call void @bar() #[[ATTR1]]
50 ; CHECK-NEXT:    call void @convert_and_move_alloca() #[[ATTR1]]
51 ; CHECK-NEXT:    call void @unknown_no_openmp() #[[ATTR4:[0-9]+]]
52 ; CHECK-NEXT:    call void @__kmpc_target_deinit()
53 ; CHECK-NEXT:    ret void
55 ; CHECK-DISABLED-LABEL: define {{[^@]+}}@kernel
56 ; CHECK-DISABLED-SAME: (ptr [[DYN:%.*]]) #[[ATTR0:[0-9]+]] {
57 ; CHECK-DISABLED-NEXT:  entry:
58 ; CHECK-DISABLED-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @kernel_kernel_environment, ptr [[DYN]])
59 ; CHECK-DISABLED-NEXT:    call void @foo() #[[ATTR1:[0-9]+]]
60 ; CHECK-DISABLED-NEXT:    call void @bar() #[[ATTR1]]
61 ; CHECK-DISABLED-NEXT:    call void @convert_and_move_alloca() #[[ATTR1]]
62 ; CHECK-DISABLED-NEXT:    call void @unknown_no_openmp() #[[ATTR4:[0-9]+]]
63 ; CHECK-DISABLED-NEXT:    call void @__kmpc_target_deinit()
64 ; CHECK-DISABLED-NEXT:    ret void
66 entry:
67   %0 = call i32 @__kmpc_target_init(ptr @kernel_kernel_environment, ptr %dyn)
68   call void @foo()
69   call void @bar()
70   call void @convert_and_move_alloca()
71   call void @unknown_no_openmp()
72   call void @__kmpc_target_deinit()
73   ret void
76 define internal void @foo() {
77 ; CHECK-LABEL: define {{[^@]+}}@foo
78 ; CHECK-SAME: () #[[ATTR1]] {
79 ; CHECK-NEXT:  entry:
80 ; CHECK-NEXT:    [[DOTH2S:%.*]] = alloca i8, i64 4, align 4
81 ; CHECK-NEXT:    ret void
83 ; CHECK-DISABLED-LABEL: define {{[^@]+}}@foo
84 ; CHECK-DISABLED-SAME: () #[[ATTR1]] {
85 ; CHECK-DISABLED-NEXT:  entry:
86 ; CHECK-DISABLED-NEXT:    [[DOTH2S:%.*]] = alloca i8, i64 4, align 4
87 ; CHECK-DISABLED-NEXT:    ret void
89 entry:
90   %0 = call align 4 ptr @__kmpc_alloc_shared(i64 4), !dbg !12
91   call void @use(ptr %0)
92   call void @__kmpc_free_shared(ptr %0, i64 4)
93   ret void
96 define internal void @bar() {
97 ; CHECK-LABEL: define {{[^@]+}}@bar
98 ; CHECK-SAME: () #[[ATTR1]] {
99 ; CHECK-NEXT:  entry:
100 ; CHECK-NEXT:    [[DOTH2S:%.*]] = alloca i8, i64 4, align 4
101 ; CHECK-NEXT:    call void @share(ptr nofree [[DOTH2S]]) #[[ATTR5:[0-9]+]], !dbg [[DBG8:![0-9]+]]
102 ; CHECK-NEXT:    ret void
104 ; CHECK-DISABLED-LABEL: define {{[^@]+}}@bar
105 ; CHECK-DISABLED-SAME: () #[[ATTR1]] {
106 ; CHECK-DISABLED-NEXT:  entry:
107 ; CHECK-DISABLED-NEXT:    [[DOTH2S:%.*]] = alloca i8, i64 4, align 4
108 ; CHECK-DISABLED-NEXT:    call void @share(ptr nofree [[DOTH2S]]) #[[ATTR5:[0-9]+]], !dbg [[DBG8:![0-9]+]]
109 ; CHECK-DISABLED-NEXT:    ret void
111 entry:
112   %0 = call align 4 ptr @__kmpc_alloc_shared(i64 4), !dbg !13
113   call void @share(ptr %0), !dbg !13
114   call void @__kmpc_free_shared(ptr %0, i64 4)
115   ret void
118 define internal void @use(ptr %x) {
119 entry:
120   ret void
123 define internal void @share(ptr %x) {
124 ; CHECK-LABEL: define {{[^@]+}}@share
125 ; CHECK-SAME: (ptr nofree [[X:%.*]]) #[[ATTR2:[0-9]+]] {
126 ; CHECK-NEXT:  entry:
127 ; CHECK-NEXT:    store ptr [[X]], ptr @S, align 8
128 ; CHECK-NEXT:    ret void
130 ; CHECK-DISABLED-LABEL: define {{[^@]+}}@share
131 ; CHECK-DISABLED-SAME: (ptr nofree [[X:%.*]]) #[[ATTR2:[0-9]+]] {
132 ; CHECK-DISABLED-NEXT:  entry:
133 ; CHECK-DISABLED-NEXT:    store ptr [[X]], ptr @S, align 8
134 ; CHECK-DISABLED-NEXT:    ret void
136 entry:
137   store ptr %x, ptr @S
138   ret void
141 define void @unused() {
142 ; CHECK-LABEL: define {{[^@]+}}@unused() {
143 ; CHECK-NEXT:  entry:
144 ; CHECK-NEXT:    [[DOTH2S:%.*]] = alloca i8, i64 4, align 4
145 ; CHECK-NEXT:    ret void
147 ; CHECK-DISABLED-LABEL: define {{[^@]+}}@unused() {
148 ; CHECK-DISABLED-NEXT:  entry:
149 ; CHECK-DISABLED-NEXT:    [[TMP0:%.*]] = call align 4 ptr @__kmpc_alloc_shared(i64 4) #[[ATTR6:[0-9]+]], !dbg [[DBG11:![0-9]+]]
150 ; CHECK-DISABLED-NEXT:    call void @__kmpc_free_shared(ptr [[TMP0]], i64 4) #[[ATTR6]]
151 ; CHECK-DISABLED-NEXT:    ret void
153 entry:
154   %0 = call align 4 ptr @__kmpc_alloc_shared(i64 4), !dbg !14
155   call void @use(ptr %0)
156   call void @__kmpc_free_shared(ptr %0, i64 4)
157   ret void
160 define internal void @convert_and_move_alloca() {
161 ; CHECK-LABEL: define {{[^@]+}}@convert_and_move_alloca
162 ; CHECK-SAME: () #[[ATTR1]] {
163 ; CHECK-NEXT:  entry:
164 ; CHECK-NEXT:    [[DOTH2S:%.*]] = alloca i8, i64 4, align 4
165 ; CHECK-NEXT:    [[IV_PTR:%.*]] = alloca i32, align 4
166 ; CHECK-NEXT:    br label [[INITLOOP:%.*]]
167 ; CHECK:       initloop:
168 ; CHECK-NEXT:    store i32 0, ptr [[IV_PTR]], align 4
169 ; CHECK-NEXT:    br label [[LOOPBODY:%.*]]
170 ; CHECK:       loopbody:
171 ; CHECK-NEXT:    [[IV:%.*]] = load i32, ptr [[IV_PTR]], align 4
172 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i32 [[IV]], 10
173 ; CHECK-NEXT:    br i1 [[TMP0]], label [[EXIT:%.*]], label [[LOOPINC:%.*]]
174 ; CHECK:       loopinc:
175 ; CHECK-NEXT:    [[INC:%.*]] = add i32 [[IV]], 1
176 ; CHECK-NEXT:    store i32 [[INC]], ptr [[IV_PTR]], align 4
177 ; CHECK-NEXT:    br label [[LOOPBODY]]
178 ; CHECK:       exit:
179 ; CHECK-NEXT:    ret void
181 ; CHECK-DISABLED-LABEL: define {{[^@]+}}@convert_and_move_alloca
182 ; CHECK-DISABLED-SAME: () #[[ATTR1]] {
183 ; CHECK-DISABLED-NEXT:  entry:
184 ; CHECK-DISABLED-NEXT:    [[DOTH2S:%.*]] = alloca i8, i64 4, align 4
185 ; CHECK-DISABLED-NEXT:    [[IV_PTR:%.*]] = alloca i32, align 4
186 ; CHECK-DISABLED-NEXT:    br label [[INITLOOP:%.*]]
187 ; CHECK-DISABLED:       initloop:
188 ; CHECK-DISABLED-NEXT:    store i32 0, ptr [[IV_PTR]], align 4
189 ; CHECK-DISABLED-NEXT:    br label [[LOOPBODY:%.*]]
190 ; CHECK-DISABLED:       loopbody:
191 ; CHECK-DISABLED-NEXT:    [[IV:%.*]] = load i32, ptr [[IV_PTR]], align 4
192 ; CHECK-DISABLED-NEXT:    [[TMP0:%.*]] = icmp eq i32 [[IV]], 10
193 ; CHECK-DISABLED-NEXT:    br i1 [[TMP0]], label [[EXIT:%.*]], label [[LOOPINC:%.*]]
194 ; CHECK-DISABLED:       loopinc:
195 ; CHECK-DISABLED-NEXT:    [[INC:%.*]] = add i32 [[IV]], 1
196 ; CHECK-DISABLED-NEXT:    store i32 [[INC]], ptr [[IV_PTR]], align 4
197 ; CHECK-DISABLED-NEXT:    br label [[LOOPBODY]]
198 ; CHECK-DISABLED:       exit:
199 ; CHECK-DISABLED-NEXT:    ret void
201 entry:
202   %iv_ptr = alloca i32, align 4
203   %ub_ptr = alloca i32, align 4
204   store i32 10, ptr %ub_ptr
205   br label %initloop
207 initloop:
208   store i32 0, ptr %iv_ptr
209   %ub = load i32, ptr %ub_ptr
210   br label %loopbody
212 loopbody:
213   %0 = call align 4 ptr @__kmpc_alloc_shared(i64 4), !dbg !16
214   call void @use(ptr %0)
215   call void @__kmpc_free_shared(ptr %0, i64 4)
216   %iv = load i32, ptr %iv_ptr
217   %1 = icmp eq i32 %iv, %ub
218   br i1 %1, label %exit, label %loopinc
220 loopinc:
221   %inc = add i32 %iv, 1
222   store i32 %inc, ptr %iv_ptr
223   br label %loopbody
225 exit:
226   ret void
229 ; CHECK: declare noalias ptr @__kmpc_alloc_shared(i64)
230 declare ptr @__kmpc_alloc_shared(i64)
232 ; CHECK: declare void @__kmpc_free_shared(ptr allocptr nocapture, i64)
233 declare void @__kmpc_free_shared(ptr, i64)
235 declare void @unknown_no_openmp() "llvm.assume"="omp_no_openmp"
237 !llvm.dbg.cu = !{!0}
238 !llvm.module.flags = !{!3, !4, !6, !7}
239 !nvvm.annotations = !{!5}
241 !0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 13.0.0", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, splitDebugInlining: false, nameTableKind: None)
242 !1 = !DIFile(filename: "remove_globalization.c", directory: "/tmp/remove_globalization.c")
243 !2 = !{}
244 !3 = !{i32 2, !"Debug Info Version", i32 3}
245 !4 = !{i32 1, !"wchar_size", i32 4}
246 !5 = !{ptr @kernel, !"kernel", i32 1}
247 !6 = !{i32 7, !"openmp", i32 50}
248 !7 = !{i32 7, !"openmp-device", i32 50}
249 !8 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 1, type: !11, scopeLine: 1, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !2)
250 !9 = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 1, type: !11, scopeLine: 1, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !2)
251 !10 = distinct !DISubprogram(name: "unused", scope: !1, file: !1, line: 1, type: !11, scopeLine: 1, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !2)
252 !11 = !DISubroutineType(types: !2)
253 !12 = !DILocation(line: 2, column: 2, scope: !8)
254 !13 = !DILocation(line: 4, column: 2, scope: !9)
255 !14 = !DILocation(line: 6, column: 2, scope: !9)
256 !15 = !DILocation(line: 8, column: 2, scope: !9)
257 !16 = !DILocation(line: 10, column: 2, scope: !9)
259 ; CHECK: attributes #[[ATTR0]] = { "kernel" }
260 ; CHECK: attributes #[[ATTR1]] = { nosync nounwind }
261 ; CHECK: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind memory(write) }
262 ; CHECK: attributes #[[ATTR3:[0-9]+]] = { nosync nounwind allocsize(0) }
263 ; CHECK: attributes #[[ATTR4]] = { "llvm.assume"="omp_no_openmp" }
264 ; CHECK: attributes #[[ATTR5]] = { nosync nounwind memory(write) }
266 ; CHECK-DISABLED: attributes #[[ATTR0]] = { "kernel" }
267 ; CHECK-DISABLED: attributes #[[ATTR1]] = { nosync nounwind }
268 ; CHECK-DISABLED: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind memory(write) }
269 ; CHECK-DISABLED: attributes #[[ATTR3:[0-9]+]] = { nosync nounwind allocsize(0) }
270 ; CHECK-DISABLED: attributes #[[ATTR4]] = { "llvm.assume"="omp_no_openmp" }
271 ; CHECK-DISABLED: attributes #[[ATTR5]] = { nosync nounwind memory(write) }
272 ; CHECK-DISABLED: attributes #[[ATTR6]] = { nounwind }
274 ; CHECK: [[META0:![0-9]+]] = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 13.0.0", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, splitDebugInlining: false, nameTableKind: None)
275 ; CHECK: [[META1:![0-9]+]] = !DIFile(filename: "remove_globalization.c", directory: "/tmp/remove_globalization.c")
276 ; CHECK: [[META2:![0-9]+]] = !{}
277 ; CHECK: [[META3:![0-9]+]] = !{i32 2, !"Debug Info Version", i32 3}
278 ; CHECK: [[META4:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
279 ; CHECK: [[META5:![0-9]+]] = !{i32 7, !"openmp", i32 50}
280 ; CHECK: [[META6:![0-9]+]] = !{i32 7, !"openmp-device", i32 50}
281 ; CHECK: [[META7:![0-9]+]] = !{ptr @kernel, !"kernel", i32 1}
282 ; CHECK: [[DBG8]] = !DILocation(line: 4, column: 2, scope: !9)
283 ; CHECK: [[META9:![0-9]+]] = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 1, type: !10, scopeLine: 1, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !2)
284 ; CHECK: [[META10:![0-9]+]] = !DISubroutineType(types: !2)
286 ; CHECK-DISABLED: [[META0:![0-9]+]] = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 13.0.0", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, splitDebugInlining: false, nameTableKind: None)
287 ; CHECK-DISABLED: [[META1:![0-9]+]] = !DIFile(filename: "remove_globalization.c", directory: "/tmp/remove_globalization.c")
288 ; CHECK-DISABLED: [[META2:![0-9]+]] = !{}
289 ; CHECK-DISABLED: [[META3:![0-9]+]] = !{i32 2, !"Debug Info Version", i32 3}
290 ; CHECK-DISABLED: [[META4:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
291 ; CHECK-DISABLED: [[META5:![0-9]+]] = !{i32 7, !"openmp", i32 50}
292 ; CHECK-DISABLED: [[META6:![0-9]+]] = !{i32 7, !"openmp-device", i32 50}
293 ; CHECK-DISABLED: [[META7:![0-9]+]] = !{ptr @kernel, !"kernel", i32 1}
294 ; CHECK-DISABLED: [[DBG8]] = !DILocation(line: 4, column: 2, scope: !9)
295 ; CHECK-DISABLED: [[META9:![0-9]+]] = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 1, type: !10, scopeLine: 1, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !2)
296 ; CHECK-DISABLED: [[META10:![0-9]+]] = !DISubroutineType(types: !2)
297 ; CHECK-DISABLED: [[DBG11]] = !DILocation(line: 6, column: 2, scope: !9)
299 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
300 ; CHECK-REMARKS: {{.*}}