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 [[TMP0]], i32 [[TMP1]], i32 noundef 42) #[[ATTR6:[0-9]+]]
116; IS__TUNIT____-NEXT:    ret void
117;
118; IS__CGSCC____: Function Attrs: norecurse nosync nounwind
119; IS__CGSCC____-LABEL: define {{[^@]+}}@level2Kernela
120; IS__CGSCC____-SAME: () #[[ATTR1]] {
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 [[TMP0]], i32 [[TMP1]], i32 noundef 42) #[[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 [[TMP0]], i32 [[TMP1]], i32 noundef 42) #[[ATTR6]]
144; IS__TUNIT____-NEXT:    ret void
145;
146; IS__CGSCC____: Function Attrs: norecurse nosync nounwind
147; IS__CGSCC____-LABEL: define {{[^@]+}}@level2Kernelb
148; IS__CGSCC____-SAME: () #[[ATTR1]] {
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 [[TMP0]], i32 [[TMP1]], i32 noundef 42) #[[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 readnone willreturn
172; IS__CGSCC____-LABEL: define {{[^@]+}}@level2Kernelall_late
173; IS__CGSCC____-SAME: () #[[ATTR3:[0-9]+]] {
174; IS__CGSCC____-NEXT:  entry:
175; IS__CGSCC____-NEXT:    ret void
176;
177entry:
178  store i32 1, i32 *addrspacecast (i32 addrspace(3)* @UnreachableKernel to i32*), align 4
179  ret void
180}
181
182@ReachableNonKernel = internal addrspace(3) global i32 0, align 4
183@UnreachableNonKernel = internal addrspace(3) global i32 0, align 4
184
185define dso_local void @non_kernel(i32 %C) norecurse {
186; IS__TUNIT____: Function Attrs: norecurse nosync nounwind
187; IS__TUNIT____-LABEL: define {{[^@]+}}@non_kernel
188; IS__TUNIT____-SAME: (i32 [[C:%.*]]) #[[ATTR1]] {
189; IS__TUNIT____-NEXT:  entry:
190; IS__TUNIT____-NEXT:    call void @level1(i32 [[C]]) #[[ATTR3]]
191; IS__TUNIT____-NEXT:    ret void
192;
193; IS__CGSCC____: Function Attrs: norecurse nosync nounwind
194; IS__CGSCC____-LABEL: define {{[^@]+}}@non_kernel
195; IS__CGSCC____-SAME: (i32 [[C:%.*]]) #[[ATTR1]] {
196; IS__CGSCC____-NEXT:  entry:
197; IS__CGSCC____-NEXT:    call void @level1(i32 [[C]]) #[[ATTR4]]
198; IS__CGSCC____-NEXT:    ret void
199;
200entry:
201  call void @level1(i32 %C)
202  ret void
203}
204
205define internal void @level1(i32 %C) {
206; IS__TUNIT____: Function Attrs: norecurse nosync nounwind
207; IS__TUNIT____-LABEL: define {{[^@]+}}@level1
208; IS__TUNIT____-SAME: (i32 [[C:%.*]]) #[[ATTR1]] {
209; IS__TUNIT____-NEXT:  entry:
210; IS__TUNIT____-NEXT:    [[LOCAL:%.*]] = alloca i32, align 4
211; IS__TUNIT____-NEXT:    call void @level2all_early(i32* noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[LOCAL]]) #[[ATTR4]]
212; IS__TUNIT____-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[C]], 0
213; IS__TUNIT____-NEXT:    br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
214; IS__TUNIT____:       if.then:
215; IS__TUNIT____-NEXT:    call void @level2a() #[[ATTR3]]
216; IS__TUNIT____-NEXT:    br label [[IF_END:%.*]]
217; IS__TUNIT____:       if.else:
218; IS__TUNIT____-NEXT:    call void @level2b() #[[ATTR3]]
219; IS__TUNIT____-NEXT:    br label [[IF_END]]
220; IS__TUNIT____:       if.end:
221; IS__TUNIT____-NEXT:    call void @level2all_late(i32* noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[LOCAL]]) #[[ATTR5]]
222; IS__TUNIT____-NEXT:    ret void
223;
224; IS__CGSCC_OPM: Function Attrs: norecurse nosync nounwind
225; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@level1
226; IS__CGSCC_OPM-SAME: (i32 [[C:%.*]]) #[[ATTR1]] {
227; IS__CGSCC_OPM-NEXT:  entry:
228; IS__CGSCC_OPM-NEXT:    [[LOCAL:%.*]] = alloca i32, align 4
229; IS__CGSCC_OPM-NEXT:    call void @level2all_early(i32* noalias nocapture nofree nonnull readnone align 4 dereferenceable(4) undef) #[[ATTR5]]
230; IS__CGSCC_OPM-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[C]], 0
231; IS__CGSCC_OPM-NEXT:    br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
232; IS__CGSCC_OPM:       if.then:
233; IS__CGSCC_OPM-NEXT:    call void @level2a(i32* noalias nocapture nofree nonnull readnone align 4 dereferenceable(4) undef) #[[ATTR4]]
234; IS__CGSCC_OPM-NEXT:    br label [[IF_END:%.*]]
235; IS__CGSCC_OPM:       if.else:
236; IS__CGSCC_OPM-NEXT:    call void @level2b(i32* noalias nocapture nofree nonnull readnone align 4 dereferenceable(4) undef) #[[ATTR4]]
237; IS__CGSCC_OPM-NEXT:    br label [[IF_END]]
238; IS__CGSCC_OPM:       if.end:
239; IS__CGSCC_OPM-NEXT:    call void @level2all_late(i32* noalias nocapture nofree nonnull readnone align 4 dereferenceable(4) undef) #[[ATTR7:[0-9]+]]
240; IS__CGSCC_OPM-NEXT:    ret void
241;
242; IS__CGSCC_NPM: Function Attrs: norecurse nosync nounwind
243; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@level1
244; IS__CGSCC_NPM-SAME: (i32 [[C:%.*]]) #[[ATTR1]] {
245; IS__CGSCC_NPM-NEXT:  entry:
246; IS__CGSCC_NPM-NEXT:    [[LOCAL:%.*]] = alloca i32, align 4
247; IS__CGSCC_NPM-NEXT:    call void @level2all_early(i32* noalias nocapture nofree nonnull readnone align 4 dereferenceable(4) undef) #[[ATTR5]]
248; IS__CGSCC_NPM-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[C]], 0
249; IS__CGSCC_NPM-NEXT:    br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
250; IS__CGSCC_NPM:       if.then:
251; IS__CGSCC_NPM-NEXT:    call void @level2a(i32 undef) #[[ATTR4]]
252; IS__CGSCC_NPM-NEXT:    br label [[IF_END:%.*]]
253; IS__CGSCC_NPM:       if.else:
254; IS__CGSCC_NPM-NEXT:    call void @level2b(i32 undef) #[[ATTR7:[0-9]+]]
255; IS__CGSCC_NPM-NEXT:    br label [[IF_END]]
256; IS__CGSCC_NPM:       if.end:
257; IS__CGSCC_NPM-NEXT:    call void @level2all_late(i32* noalias nocapture nofree nonnull readnone align 4 dereferenceable(4) undef) #[[ATTR8:[0-9]+]]
258; IS__CGSCC_NPM-NEXT:    ret void
259;
260entry:
261  %local = alloca i32
262  call void @level2all_early(i32* %local)
263  %tobool = icmp ne i32 %C, 0
264  br i1 %tobool, label %if.then, label %if.else
265
266if.then:                                          ; preds = %entry
267  call void @level2a(i32* %local)
268  br label %if.end
269
270if.else:                                          ; preds = %entry
271  call void @level2b(i32* %local)
272  br label %if.end
273
274if.end:                                           ; preds = %if.else, %if.then
275  call void @level2all_late(i32* %local)
276  ret void
277}
278
279define internal void @level2all_early(i32* %addr) {
280; IS__TUNIT____: Function Attrs: nofree norecurse nosync nounwind willreturn writeonly
281; IS__TUNIT____-LABEL: define {{[^@]+}}@level2all_early
282; IS__TUNIT____-SAME: (i32* noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[ADDR:%.*]]) #[[ATTR2]] {
283; IS__TUNIT____-NEXT:  entry:
284; IS__TUNIT____-NEXT:    store i32 1, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4
285; IS__TUNIT____-NEXT:    ret void
286;
287; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind willreturn writeonly
288; IS__CGSCC____-LABEL: define {{[^@]+}}@level2all_early
289; IS__CGSCC____-SAME: (i32* noalias nocapture nofree nonnull readnone align 4 dereferenceable(4) [[ADDR:%.*]]) #[[ATTR2]] {
290; IS__CGSCC____-NEXT:  entry:
291; IS__CGSCC____-NEXT:    store i32 1, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4
292; IS__CGSCC____-NEXT:    ret void
293;
294entry:
295  store i32 1, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4
296  store i32 17, i32* %addr, align 4
297  ret void
298}
299
300define internal void @level2a(i32* %addr) {
301; IS__TUNIT____: Function Attrs: norecurse nosync nounwind
302; IS__TUNIT____-LABEL: define {{[^@]+}}@level2a
303; IS__TUNIT____-SAME: () #[[ATTR1]] {
304; IS__TUNIT____-NEXT:  entry:
305; IS__TUNIT____-NEXT:    [[TMP0:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4
306; IS__TUNIT____-NEXT:    [[TMP1:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4
307; IS__TUNIT____-NEXT:    call void @use(i32 [[TMP0]], i32 [[TMP1]], i32 17) #[[ATTR6]]
308; IS__TUNIT____-NEXT:    ret void
309;
310; IS__CGSCC_OPM: Function Attrs: norecurse nosync nounwind
311; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@level2a
312; IS__CGSCC_OPM-SAME: (i32* noalias nocapture nofree nonnull readnone align 4 dereferenceable(4) [[ADDR:%.*]]) #[[ATTR1]] {
313; IS__CGSCC_OPM-NEXT:  entry:
314; IS__CGSCC_OPM-NEXT:    [[TMP0:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4
315; IS__CGSCC_OPM-NEXT:    [[TMP1:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4
316; IS__CGSCC_OPM-NEXT:    [[TMP2:%.*]] = load i32, i32* undef, align 4
317; IS__CGSCC_OPM-NEXT:    call void @use(i32 [[TMP0]], i32 [[TMP1]], i32 17) #[[ATTR4]]
318; IS__CGSCC_OPM-NEXT:    ret void
319;
320; IS__CGSCC_NPM: Function Attrs: norecurse nosync nounwind
321; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@level2a
322; IS__CGSCC_NPM-SAME: (i32 [[TMP0:%.*]]) #[[ATTR1]] {
323; IS__CGSCC_NPM-NEXT:  entry:
324; IS__CGSCC_NPM-NEXT:    [[ADDR_PRIV:%.*]] = alloca i32, align 4
325; IS__CGSCC_NPM-NEXT:    [[TMP1:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4
326; IS__CGSCC_NPM-NEXT:    [[TMP2:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4
327; IS__CGSCC_NPM-NEXT:    [[TMP3:%.*]] = load i32, i32* [[ADDR_PRIV]], align 4
328; IS__CGSCC_NPM-NEXT:    call void @use(i32 [[TMP1]], i32 [[TMP2]], i32 17) #[[ATTR4]]
329; IS__CGSCC_NPM-NEXT:    ret void
330;
331entry:
332  %0 = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4
333  %1 = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4
334  %2 = load i32, i32* %addr
335  call void @use(i32 %0, i32 %1, i32 %2)
336  ret void
337}
338
339define internal void @level2b(i32* %addr) {
340; IS__TUNIT____: Function Attrs: norecurse nosync nounwind
341; IS__TUNIT____-LABEL: define {{[^@]+}}@level2b
342; IS__TUNIT____-SAME: () #[[ATTR1]] {
343; IS__TUNIT____-NEXT:  entry:
344; IS__TUNIT____-NEXT:    [[TMP0:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4
345; IS__TUNIT____-NEXT:    [[TMP1:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4
346; IS__TUNIT____-NEXT:    call void @use(i32 [[TMP0]], i32 [[TMP1]], i32 17) #[[ATTR6]]
347; IS__TUNIT____-NEXT:    ret void
348;
349; IS__CGSCC_OPM: Function Attrs: norecurse nosync nounwind
350; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@level2b
351; IS__CGSCC_OPM-SAME: (i32* noalias nocapture nofree nonnull readnone align 4 dereferenceable(4) [[ADDR:%.*]]) #[[ATTR1]] {
352; IS__CGSCC_OPM-NEXT:  entry:
353; IS__CGSCC_OPM-NEXT:    [[TMP0:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4
354; IS__CGSCC_OPM-NEXT:    [[TMP1:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4
355; IS__CGSCC_OPM-NEXT:    [[TMP2:%.*]] = load i32, i32* undef, align 4
356; IS__CGSCC_OPM-NEXT:    call void @use(i32 [[TMP0]], i32 [[TMP1]], i32 17) #[[ATTR4]]
357; IS__CGSCC_OPM-NEXT:    ret void
358;
359; IS__CGSCC_NPM: Function Attrs: norecurse nosync nounwind
360; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@level2b
361; IS__CGSCC_NPM-SAME: (i32 [[TMP0:%.*]]) #[[ATTR1]] {
362; IS__CGSCC_NPM-NEXT:  entry:
363; IS__CGSCC_NPM-NEXT:    [[ADDR_PRIV:%.*]] = alloca i32, align 4
364; IS__CGSCC_NPM-NEXT:    [[TMP1:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4
365; IS__CGSCC_NPM-NEXT:    [[TMP2:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4
366; IS__CGSCC_NPM-NEXT:    [[TMP3:%.*]] = load i32, i32* [[ADDR_PRIV]], align 4
367; IS__CGSCC_NPM-NEXT:    call void @use(i32 [[TMP1]], i32 [[TMP2]], i32 17) #[[ATTR4]]
368; IS__CGSCC_NPM-NEXT:    ret void
369;
370entry:
371  %0 = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4
372  %1 = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4
373  %2 = load i32, i32* %addr
374  call void @use(i32 %0, i32 %1, i32 %2)
375  ret void
376}
377
378define internal void @level2all_late(i32* %addr) {
379; IS__TUNIT____: Function Attrs: nofree norecurse nosync nounwind willreturn writeonly
380; IS__TUNIT____-LABEL: define {{[^@]+}}@level2all_late
381; IS__TUNIT____-SAME: (i32* noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[ADDR:%.*]]) #[[ATTR2]] {
382; IS__TUNIT____-NEXT:  entry:
383; IS__TUNIT____-NEXT:    store i32 1, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4
384; IS__TUNIT____-NEXT:    ret void
385;
386; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind willreturn writeonly
387; IS__CGSCC____-LABEL: define {{[^@]+}}@level2all_late
388; IS__CGSCC____-SAME: (i32* noalias nocapture nofree nonnull readnone align 4 dereferenceable(4) [[ADDR:%.*]]) #[[ATTR2]] {
389; IS__CGSCC____-NEXT:  entry:
390; IS__CGSCC____-NEXT:    store i32 1, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4
391; IS__CGSCC____-NEXT:    ret void
392;
393entry:
394  store i32 1, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4
395  store i32 5, i32* %addr, align 4
396  ret void
397}
398
399declare dso_local void @use(i32, i32, i32) nosync norecurse nounwind
400
401;.
402; IS__TUNIT____: attributes #[[ATTR0]] = { norecurse nosync nounwind "kernel" }
403; IS__TUNIT____: attributes #[[ATTR1]] = { norecurse nosync nounwind }
404; IS__TUNIT____: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind willreturn writeonly }
405; IS__TUNIT____: attributes #[[ATTR3]] = { nosync nounwind }
406; IS__TUNIT____: attributes #[[ATTR4]] = { nofree nosync nounwind willreturn writeonly }
407; IS__TUNIT____: attributes #[[ATTR5]] = { nosync nounwind writeonly }
408; IS__TUNIT____: attributes #[[ATTR6]] = { nounwind }
409;.
410; IS__CGSCC_OPM: attributes #[[ATTR0]] = { norecurse nosync nounwind "kernel" }
411; IS__CGSCC_OPM: attributes #[[ATTR1]] = { norecurse nosync nounwind }
412; IS__CGSCC_OPM: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind willreturn writeonly }
413; IS__CGSCC_OPM: attributes #[[ATTR3]] = { nofree norecurse nosync nounwind readnone willreturn }
414; IS__CGSCC_OPM: attributes #[[ATTR4]] = { nounwind }
415; IS__CGSCC_OPM: attributes #[[ATTR5]] = { nounwind willreturn writeonly }
416; IS__CGSCC_OPM: attributes #[[ATTR6]] = { nounwind readnone }
417; IS__CGSCC_OPM: attributes #[[ATTR7]] = { nounwind writeonly }
418;.
419; IS__CGSCC_NPM: attributes #[[ATTR0]] = { norecurse nosync nounwind "kernel" }
420; IS__CGSCC_NPM: attributes #[[ATTR1]] = { norecurse nosync nounwind }
421; IS__CGSCC_NPM: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind willreturn writeonly }
422; IS__CGSCC_NPM: attributes #[[ATTR3]] = { nofree norecurse nosync nounwind readnone willreturn }
423; IS__CGSCC_NPM: attributes #[[ATTR4]] = { nounwind }
424; IS__CGSCC_NPM: attributes #[[ATTR5]] = { nounwind willreturn writeonly }
425; IS__CGSCC_NPM: attributes #[[ATTR6]] = { nounwind readnone }
426; IS__CGSCC_NPM: attributes #[[ATTR7]] = { nosync nounwind }
427; IS__CGSCC_NPM: attributes #[[ATTR8]] = { nosync nounwind writeonly }
428;.
429