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