1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes --check-globals
2; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal  -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=4 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
3; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal  -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=4 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
4; RUN: opt -attributor-cgscc -enable-new-pm=0 -attributor-manifest-internal  -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM
5; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal  -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM
6
7target triple = "amdgcn-amd-amdhsa"
8
9@ReachableKernel = internal addrspace(3) global i32 3, align 4
10@UnreachableKernel = internal addrspace(3) global i32 42, align 4
11@ReachableKernelAS0 = internal global i32 7, align 4
12
13;.
14; CHECK: @[[REACHABLEKERNEL:[a-zA-Z0-9_$"\\.-]+]] = internal addrspace(3) global i32 3, align 4
15; CHECK: @[[UNREACHABLEKERNEL:[a-zA-Z0-9_$"\\.-]+]] = internal addrspace(3) global i32 42, align 4
16; CHECK: @[[REACHABLEKERNELAS0:[a-zA-Z0-9_$"\\.-]+]] = internal global i32 7, align 4
17; CHECK: @[[REACHABLENONKERNEL:[a-zA-Z0-9_$"\\.-]+]] = internal addrspace(3) global i32 0, align 4
18; CHECK: @[[UNREACHABLENONKERNEL:[a-zA-Z0-9_$"\\.-]+]] = internal addrspace(3) global i32 0, align 4
19;.
20define dso_local void @kernel(i32 %C) norecurse "kernel" {
21; IS__TUNIT____: Function Attrs: norecurse nosync nounwind
22; IS__TUNIT____-LABEL: define {{[^@]+}}@kernel
23; IS__TUNIT____-SAME: (i32 [[C:%.*]]) #[[ATTR0:[0-9]+]] {
24; IS__TUNIT____-NEXT:  entry:
25; IS__TUNIT____-NEXT:    call void @level1Kernel(i32 [[C]]) #[[ATTR3:[0-9]+]]
26; IS__TUNIT____-NEXT:    ret void
27;
28; IS__CGSCC____: Function Attrs: norecurse nosync nounwind
29; IS__CGSCC____-LABEL: define {{[^@]+}}@kernel
30; IS__CGSCC____-SAME: (i32 [[C:%.*]]) #[[ATTR0:[0-9]+]] {
31; IS__CGSCC____-NEXT:  entry:
32; IS__CGSCC____-NEXT:    call void @level1Kernel(i32 [[C]]) #[[ATTR4:[0-9]+]]
33; IS__CGSCC____-NEXT:    ret void
34;
35entry:
36  call void @level1Kernel(i32 %C)
37  ret void
38}
39
40define internal void @level1Kernel(i32 %C) {
41; IS__TUNIT____: Function Attrs: norecurse nosync nounwind
42; IS__TUNIT____-LABEL: define {{[^@]+}}@level1Kernel
43; IS__TUNIT____-SAME: (i32 [[C:%.*]]) #[[ATTR1:[0-9]+]] {
44; IS__TUNIT____-NEXT:  entry:
45; IS__TUNIT____-NEXT:    call void @level2Kernelall_early() #[[ATTR4:[0-9]+]]
46; IS__TUNIT____-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[C]], 0
47; IS__TUNIT____-NEXT:    br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
48; IS__TUNIT____:       if.then:
49; IS__TUNIT____-NEXT:    call void @level2Kernela() #[[ATTR3]]
50; IS__TUNIT____-NEXT:    br label [[IF_END:%.*]]
51; IS__TUNIT____:       if.else:
52; IS__TUNIT____-NEXT:    call void @level2Kernelb() #[[ATTR3]]
53; IS__TUNIT____-NEXT:    br label [[IF_END]]
54; IS__TUNIT____:       if.end:
55; IS__TUNIT____-NEXT:    call void @level2Kernelall_late() #[[ATTR5:[0-9]+]]
56; IS__TUNIT____-NEXT:    ret void
57;
58; IS__CGSCC____: Function Attrs: norecurse nosync nounwind
59; IS__CGSCC____-LABEL: define {{[^@]+}}@level1Kernel
60; IS__CGSCC____-SAME: (i32 [[C:%.*]]) #[[ATTR1:[0-9]+]] {
61; IS__CGSCC____-NEXT:  entry:
62; IS__CGSCC____-NEXT:    call void @level2Kernelall_early() #[[ATTR5:[0-9]+]]
63; IS__CGSCC____-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[C]], 0
64; IS__CGSCC____-NEXT:    br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
65; IS__CGSCC____:       if.then:
66; IS__CGSCC____-NEXT:    call void @level2Kernela() #[[ATTR4]]
67; IS__CGSCC____-NEXT:    br label [[IF_END:%.*]]
68; IS__CGSCC____:       if.else:
69; IS__CGSCC____-NEXT:    call void @level2Kernelb() #[[ATTR4]]
70; IS__CGSCC____-NEXT:    br label [[IF_END]]
71; IS__CGSCC____:       if.end:
72; IS__CGSCC____-NEXT:    call void @level2Kernelall_late() #[[ATTR6:[0-9]+]]
73; IS__CGSCC____-NEXT:    ret void
74;
75entry:
76  call void @level2Kernelall_early()
77  %tobool = icmp ne i32 %C, 0
78  br i1 %tobool, label %if.then, label %if.else
79
80if.then:                                          ; preds = %entry
81  call void @level2Kernela()
82  br label %if.end
83
84if.else:                                          ; preds = %entry
85  call void @level2Kernelb()
86  br label %if.end
87
88if.end:                                           ; preds = %if.else, %if.then
89  call void @level2Kernelall_late()
90  ret void
91}
92
93define internal void @level2Kernelall_early() {
94; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn writeonly
95; CHECK-LABEL: define {{[^@]+}}@level2Kernelall_early
96; CHECK-SAME: () #[[ATTR2:[0-9]+]] {
97; CHECK-NEXT:  entry:
98; CHECK-NEXT:    store i32 1, i32* @ReachableKernelAS0, align 4
99; CHECK-NEXT:    store i32 1, i32* addrspacecast (i32 addrspace(3)* @ReachableKernel to i32*), align 4
100; CHECK-NEXT:    ret void
101;
102entry:
103  store i32 1, i32* @ReachableKernelAS0, align 4
104  store i32 1, i32* addrspacecast (i32 addrspace(3)* @ReachableKernel to i32*), align 4
105  ret void
106}
107
108define internal void @level2Kernela() {
109; IS__TUNIT____: Function Attrs: norecurse nosync nounwind
110; IS__TUNIT____-LABEL: define {{[^@]+}}@level2Kernela
111; IS__TUNIT____-SAME: () #[[ATTR1]] {
112; IS__TUNIT____-NEXT:  entry:
113; IS__TUNIT____-NEXT:    [[TMP0:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableKernel to i32*), align 4
114; IS__TUNIT____-NEXT:    [[TMP1:%.*]] = load i32, i32* @ReachableKernelAS0, align 4
115; IS__TUNIT____-NEXT:    call void @use(i32 noundef [[TMP0]], i32 noundef [[TMP1]], i32 noundef 42) #[[ATTR6:[0-9]+]]
116; IS__TUNIT____-NEXT:    ret void
117;
118; IS__CGSCC____: Function Attrs: nosync nounwind
119; IS__CGSCC____-LABEL: define {{[^@]+}}@level2Kernela
120; IS__CGSCC____-SAME: () #[[ATTR3:[0-9]+]] {
121; IS__CGSCC____-NEXT:  entry:
122; IS__CGSCC____-NEXT:    [[TMP0:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableKernel to i32*), align 4
123; IS__CGSCC____-NEXT:    [[TMP1:%.*]] = load i32, i32* @ReachableKernelAS0, align 4
124; IS__CGSCC____-NEXT:    [[TMP2:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableKernel to i32*), align 4
125; IS__CGSCC____-NEXT:    call void @use(i32 noundef [[TMP0]], i32 noundef [[TMP1]], i32 noundef [[TMP2]]) #[[ATTR4]]
126; IS__CGSCC____-NEXT:    ret void
127;
128entry:
129  %0 = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableKernel to i32*), align 4
130  %1 = load i32, i32* @ReachableKernelAS0, align 4
131  %2 = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableKernel to i32*), align 4
132  call void @use(i32 %0, i32 %1, i32 %2)
133  ret void
134}
135
136define internal void @level2Kernelb() {
137; IS__TUNIT____: Function Attrs: norecurse nosync nounwind
138; IS__TUNIT____-LABEL: define {{[^@]+}}@level2Kernelb
139; IS__TUNIT____-SAME: () #[[ATTR1]] {
140; IS__TUNIT____-NEXT:  entry:
141; IS__TUNIT____-NEXT:    [[TMP0:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableKernel to i32*), align 4
142; IS__TUNIT____-NEXT:    [[TMP1:%.*]] = load i32, i32* @ReachableKernelAS0, align 4
143; IS__TUNIT____-NEXT:    call void @use(i32 noundef [[TMP0]], i32 noundef [[TMP1]], i32 noundef 42) #[[ATTR6]]
144; IS__TUNIT____-NEXT:    ret void
145;
146; IS__CGSCC____: Function Attrs: nosync nounwind
147; IS__CGSCC____-LABEL: define {{[^@]+}}@level2Kernelb
148; IS__CGSCC____-SAME: () #[[ATTR3]] {
149; IS__CGSCC____-NEXT:  entry:
150; IS__CGSCC____-NEXT:    [[TMP0:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableKernel to i32*), align 4
151; IS__CGSCC____-NEXT:    [[TMP1:%.*]] = load i32, i32* @ReachableKernelAS0, align 4
152; IS__CGSCC____-NEXT:    [[TMP2:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableKernel to i32*), align 4
153; IS__CGSCC____-NEXT:    call void @use(i32 noundef [[TMP0]], i32 noundef [[TMP1]], i32 noundef [[TMP2]]) #[[ATTR4]]
154; IS__CGSCC____-NEXT:    ret void
155;
156entry:
157  %0 = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableKernel to i32*), align 4
158  %1 = load i32, i32* @ReachableKernelAS0, align 4
159  %2 = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableKernel to i32*), align 4
160  call void @use(i32 %0, i32 %1, i32 %2)
161  ret void
162}
163
164define internal void @level2Kernelall_late() {
165; IS__TUNIT____: Function Attrs: nofree norecurse nosync nounwind willreturn writeonly
166; IS__TUNIT____-LABEL: define {{[^@]+}}@level2Kernelall_late
167; IS__TUNIT____-SAME: () #[[ATTR2]] {
168; IS__TUNIT____-NEXT:  entry:
169; IS__TUNIT____-NEXT:    ret void
170;
171; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind willreturn writeonly
172; IS__CGSCC____-LABEL: define {{[^@]+}}@level2Kernelall_late
173; IS__CGSCC____-SAME: () #[[ATTR2]] {
174; IS__CGSCC____-NEXT:  entry:
175; IS__CGSCC____-NEXT:    store i32 1, i32* addrspacecast (i32 addrspace(3)* @UnreachableKernel to i32*), align 4
176; IS__CGSCC____-NEXT:    ret void
177;
178entry:
179  store i32 1, i32 *addrspacecast (i32 addrspace(3)* @UnreachableKernel to i32*), align 4
180  ret void
181}
182
183@ReachableNonKernel = internal addrspace(3) global i32 0, align 4
184@UnreachableNonKernel = internal addrspace(3) global i32 0, align 4
185
186define dso_local void @non_kernel(i32 %C) norecurse {
187; IS__TUNIT____: Function Attrs: norecurse nosync nounwind
188; IS__TUNIT____-LABEL: define {{[^@]+}}@non_kernel
189; IS__TUNIT____-SAME: (i32 [[C:%.*]]) #[[ATTR1]] {
190; IS__TUNIT____-NEXT:  entry:
191; IS__TUNIT____-NEXT:    call void @level1(i32 [[C]]) #[[ATTR3]]
192; IS__TUNIT____-NEXT:    ret void
193;
194; IS__CGSCC____: Function Attrs: norecurse nosync nounwind
195; IS__CGSCC____-LABEL: define {{[^@]+}}@non_kernel
196; IS__CGSCC____-SAME: (i32 [[C:%.*]]) #[[ATTR1]] {
197; IS__CGSCC____-NEXT:  entry:
198; IS__CGSCC____-NEXT:    call void @level1(i32 [[C]]) #[[ATTR4]]
199; IS__CGSCC____-NEXT:    ret void
200;
201entry:
202  call void @level1(i32 %C)
203  ret void
204}
205
206define internal void @level1(i32 %C) {
207; IS__TUNIT____: Function Attrs: norecurse nosync nounwind
208; IS__TUNIT____-LABEL: define {{[^@]+}}@level1
209; IS__TUNIT____-SAME: (i32 [[C:%.*]]) #[[ATTR1]] {
210; IS__TUNIT____-NEXT:  entry:
211; IS__TUNIT____-NEXT:    [[LOCAL:%.*]] = alloca i32, align 4
212; IS__TUNIT____-NEXT:    call void @level2all_early(i32* noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[LOCAL]]) #[[ATTR4]]
213; IS__TUNIT____-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[C]], 0
214; IS__TUNIT____-NEXT:    br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
215; IS__TUNIT____:       if.then:
216; IS__TUNIT____-NEXT:    call void @level2a() #[[ATTR3]]
217; IS__TUNIT____-NEXT:    br label [[IF_END:%.*]]
218; IS__TUNIT____:       if.else:
219; IS__TUNIT____-NEXT:    call void @level2b() #[[ATTR3]]
220; IS__TUNIT____-NEXT:    br label [[IF_END]]
221; IS__TUNIT____:       if.end:
222; IS__TUNIT____-NEXT:    call void @level2all_late(i32* noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[LOCAL]]) #[[ATTR5]]
223; IS__TUNIT____-NEXT:    ret void
224;
225; IS__CGSCC____: Function Attrs: norecurse nosync nounwind
226; IS__CGSCC____-LABEL: define {{[^@]+}}@level1
227; IS__CGSCC____-SAME: (i32 [[C:%.*]]) #[[ATTR1]] {
228; IS__CGSCC____-NEXT:  entry:
229; IS__CGSCC____-NEXT:    [[LOCAL:%.*]] = alloca i32, align 4
230; IS__CGSCC____-NEXT:    call void @level2all_early(i32* noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[LOCAL]]) #[[ATTR5]]
231; IS__CGSCC____-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[C]], 0
232; IS__CGSCC____-NEXT:    br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
233; IS__CGSCC____:       if.then:
234; IS__CGSCC____-NEXT:    call void @level2a(i32* noalias nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOCAL]]) #[[ATTR4]]
235; IS__CGSCC____-NEXT:    br label [[IF_END:%.*]]
236; IS__CGSCC____:       if.else:
237; IS__CGSCC____-NEXT:    call void @level2b(i32* noalias nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOCAL]]) #[[ATTR4]]
238; IS__CGSCC____-NEXT:    br label [[IF_END]]
239; IS__CGSCC____:       if.end:
240; IS__CGSCC____-NEXT:    call void @level2all_late(i32* noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[LOCAL]]) #[[ATTR6]]
241; IS__CGSCC____-NEXT:    ret void
242;
243entry:
244  %local = alloca i32
245  call void @level2all_early(i32* %local)
246  %tobool = icmp ne i32 %C, 0
247  br i1 %tobool, label %if.then, label %if.else
248
249if.then:                                          ; preds = %entry
250  call void @level2a(i32* %local)
251  br label %if.end
252
253if.else:                                          ; preds = %entry
254  call void @level2b(i32* %local)
255  br label %if.end
256
257if.end:                                           ; preds = %if.else, %if.then
258  call void @level2all_late(i32* %local)
259  ret void
260}
261
262define internal void @level2all_early(i32* %addr) {
263; IS__TUNIT____: Function Attrs: nofree norecurse nosync nounwind willreturn writeonly
264; IS__TUNIT____-LABEL: define {{[^@]+}}@level2all_early
265; IS__TUNIT____-SAME: (i32* noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[ADDR:%.*]]) #[[ATTR2]] {
266; IS__TUNIT____-NEXT:  entry:
267; IS__TUNIT____-NEXT:    store i32 1, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4
268; IS__TUNIT____-NEXT:    ret void
269;
270; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind willreturn writeonly
271; IS__CGSCC____-LABEL: define {{[^@]+}}@level2all_early
272; IS__CGSCC____-SAME: (i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[ADDR:%.*]]) #[[ATTR2]] {
273; IS__CGSCC____-NEXT:  entry:
274; IS__CGSCC____-NEXT:    store i32 1, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4
275; IS__CGSCC____-NEXT:    store i32 17, i32* [[ADDR]], align 4
276; IS__CGSCC____-NEXT:    ret void
277;
278entry:
279  store i32 1, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4
280  store i32 17, i32* %addr, align 4
281  ret void
282}
283
284define internal void @level2a(i32* %addr) {
285; IS__TUNIT____: Function Attrs: norecurse nosync nounwind
286; IS__TUNIT____-LABEL: define {{[^@]+}}@level2a
287; IS__TUNIT____-SAME: () #[[ATTR1]] {
288; IS__TUNIT____-NEXT:  entry:
289; IS__TUNIT____-NEXT:    [[TMP0:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4
290; IS__TUNIT____-NEXT:    [[TMP1:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4
291; IS__TUNIT____-NEXT:    call void @use(i32 noundef [[TMP0]], i32 noundef [[TMP1]], i32 17) #[[ATTR6]]
292; IS__TUNIT____-NEXT:    ret void
293;
294; IS__CGSCC____: Function Attrs: nosync nounwind
295; IS__CGSCC____-LABEL: define {{[^@]+}}@level2a
296; IS__CGSCC____-SAME: (i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[ADDR:%.*]]) #[[ATTR3]] {
297; IS__CGSCC____-NEXT:  entry:
298; IS__CGSCC____-NEXT:    [[TMP0:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4
299; IS__CGSCC____-NEXT:    [[TMP1:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4
300; IS__CGSCC____-NEXT:    [[QQQQ2:%.*]] = load i32, i32* [[ADDR]], align 4
301; IS__CGSCC____-NEXT:    call void @use(i32 noundef [[TMP0]], i32 noundef [[TMP1]], i32 [[QQQQ2]]) #[[ATTR4]]
302; IS__CGSCC____-NEXT:    ret void
303;
304entry:
305  %0 = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4
306  %1 = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4
307  %qqqq2 = load i32, i32* %addr
308  call void @use(i32 %0, i32 %1, i32 %qqqq2)
309  ret void
310}
311
312define internal void @level2b(i32* %addr) {
313; IS__TUNIT____: Function Attrs: norecurse nosync nounwind
314; IS__TUNIT____-LABEL: define {{[^@]+}}@level2b
315; IS__TUNIT____-SAME: () #[[ATTR1]] {
316; IS__TUNIT____-NEXT:  entry:
317; IS__TUNIT____-NEXT:    [[TMP0:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4
318; IS__TUNIT____-NEXT:    [[TMP1:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4
319; IS__TUNIT____-NEXT:    call void @use(i32 noundef [[TMP0]], i32 noundef [[TMP1]], i32 17) #[[ATTR6]]
320; IS__TUNIT____-NEXT:    ret void
321;
322; IS__CGSCC____: Function Attrs: nosync nounwind
323; IS__CGSCC____-LABEL: define {{[^@]+}}@level2b
324; IS__CGSCC____-SAME: (i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[ADDR:%.*]]) #[[ATTR3]] {
325; IS__CGSCC____-NEXT:  entry:
326; IS__CGSCC____-NEXT:    [[TMP0:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4
327; IS__CGSCC____-NEXT:    [[TMP1:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4
328; IS__CGSCC____-NEXT:    [[TMP2:%.*]] = load i32, i32* [[ADDR]], align 4
329; IS__CGSCC____-NEXT:    call void @use(i32 noundef [[TMP0]], i32 noundef [[TMP1]], i32 [[TMP2]]) #[[ATTR4]]
330; IS__CGSCC____-NEXT:    ret void
331;
332entry:
333  %0 = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4
334  %1 = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4
335  %2 = load i32, i32* %addr
336  call void @use(i32 %0, i32 %1, i32 %2)
337  ret void
338}
339
340define internal void @level2all_late(i32* %addr) {
341; IS__TUNIT____: Function Attrs: nofree norecurse nosync nounwind willreturn writeonly
342; IS__TUNIT____-LABEL: define {{[^@]+}}@level2all_late
343; IS__TUNIT____-SAME: (i32* noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[ADDR:%.*]]) #[[ATTR2]] {
344; IS__TUNIT____-NEXT:  entry:
345; IS__TUNIT____-NEXT:    store i32 1, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4
346; IS__TUNIT____-NEXT:    ret void
347;
348; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind willreturn writeonly
349; IS__CGSCC____-LABEL: define {{[^@]+}}@level2all_late
350; IS__CGSCC____-SAME: (i32* noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[ADDR:%.*]]) #[[ATTR2]] {
351; IS__CGSCC____-NEXT:  entry:
352; IS__CGSCC____-NEXT:    store i32 1, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4
353; IS__CGSCC____-NEXT:    store i32 5, i32* [[ADDR]], align 4
354; IS__CGSCC____-NEXT:    ret void
355;
356entry:
357  store i32 1, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4
358  store i32 5, i32* %addr, align 4
359  ret void
360}
361
362declare dso_local void @use(i32, i32, i32) nosync norecurse nounwind
363
364;.
365; IS__TUNIT____: attributes #[[ATTR0]] = { norecurse nosync nounwind "kernel" }
366; IS__TUNIT____: attributes #[[ATTR1]] = { norecurse nosync nounwind }
367; IS__TUNIT____: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind willreturn writeonly }
368; IS__TUNIT____: attributes #[[ATTR3]] = { nosync nounwind }
369; IS__TUNIT____: attributes #[[ATTR4]] = { nofree nosync nounwind willreturn writeonly }
370; IS__TUNIT____: attributes #[[ATTR5]] = { nosync nounwind writeonly }
371; IS__TUNIT____: attributes #[[ATTR6]] = { nounwind }
372;.
373; IS__CGSCC____: attributes #[[ATTR0]] = { norecurse nosync nounwind "kernel" }
374; IS__CGSCC____: attributes #[[ATTR1]] = { norecurse nosync nounwind }
375; IS__CGSCC____: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind willreturn writeonly }
376; IS__CGSCC____: attributes #[[ATTR3]] = { nosync nounwind }
377; IS__CGSCC____: attributes #[[ATTR4]] = { nounwind }
378; IS__CGSCC____: attributes #[[ATTR5]] = { nounwind willreturn writeonly }
379; IS__CGSCC____: attributes #[[ATTR6]] = { nounwind writeonly }
380;.
381