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=16 -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=16 -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 datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
8declare void @f(i32)
9declare token @llvm.call.preallocated.setup(i32)
10declare i8* @llvm.call.preallocated.arg(token, i32)
11
12@ConstAS3Ptr = addrspace(3) global i32 0, align 4
13
14;.
15; CHECK: @[[CONSTAS3PTR:[a-zA-Z0-9_$"\\.-]+]] = addrspace(3) global i32 0, align 4
16; CHECK: @[[S:[a-zA-Z0-9_$"\\.-]+]] = external global [[STRUCT_X:%.*]]
17;.
18define internal i32 addrspace(3)* @const_ptr_return_as3() {
19; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
20; IS__CGSCC____-LABEL: define {{[^@]+}}@const_ptr_return_as3
21; IS__CGSCC____-SAME: () #[[ATTR1:[0-9]+]] {
22; IS__CGSCC____-NEXT:    ret i32 addrspace(3)* undef
23;
24  ret i32 addrspace(3)* @ConstAS3Ptr
25}
26define internal i32* @const_ptr_return() {
27; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
28; IS__CGSCC____-LABEL: define {{[^@]+}}@const_ptr_return
29; IS__CGSCC____-SAME: () #[[ATTR1]] {
30; IS__CGSCC____-NEXT:    ret i32* undef
31;
32  ret i32* addrspacecast (i32 addrspace(3)* @ConstAS3Ptr to i32*)
33}
34
35; Test1: Replace argument with constant
36define internal void @test1(i32 %a) {
37; CHECK-LABEL: define {{[^@]+}}@test1() {
38; CHECK-NEXT:    tail call void @f(i32 noundef 1)
39; CHECK-NEXT:    ret void
40;
41  tail call void @f(i32 %a)
42  ret void
43}
44
45define void @test1_helper() {
46; CHECK-LABEL: define {{[^@]+}}@test1_helper() {
47; CHECK-NEXT:    tail call void @test1()
48; CHECK-NEXT:    ret void
49;
50  tail call void @test1(i32 1)
51  ret void
52}
53
54; TEST 2 : Simplify return value
55define i32 @return0() {
56; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
57; IS__TUNIT____-LABEL: define {{[^@]+}}@return0
58; IS__TUNIT____-SAME: () #[[ATTR1:[0-9]+]] {
59; IS__TUNIT____-NEXT:    ret i32 0
60;
61; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
62; IS__CGSCC____-LABEL: define {{[^@]+}}@return0
63; IS__CGSCC____-SAME: () #[[ATTR1]] {
64; IS__CGSCC____-NEXT:    ret i32 0
65;
66  ret i32 0
67}
68
69define i32 @return1() {
70; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
71; IS__TUNIT____-LABEL: define {{[^@]+}}@return1
72; IS__TUNIT____-SAME: () #[[ATTR1]] {
73; IS__TUNIT____-NEXT:    ret i32 1
74;
75; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
76; IS__CGSCC____-LABEL: define {{[^@]+}}@return1
77; IS__CGSCC____-SAME: () #[[ATTR1]] {
78; IS__CGSCC____-NEXT:    ret i32 1
79;
80  ret i32 1
81}
82
83define i32 @test2_1(i1 %c) {
84; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
85; IS__TUNIT____-LABEL: define {{[^@]+}}@test2_1
86; IS__TUNIT____-SAME: (i1 [[C:%.*]]) #[[ATTR1]] {
87; IS__TUNIT____-NEXT:    br i1 [[C]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
88; IS__TUNIT____:       if.true:
89; IS__TUNIT____-NEXT:    [[RET0:%.*]] = add i32 0, 1
90; IS__TUNIT____-NEXT:    br label [[END:%.*]]
91; IS__TUNIT____:       if.false:
92; IS__TUNIT____-NEXT:    br label [[END]]
93; IS__TUNIT____:       end:
94; IS__TUNIT____-NEXT:    [[RET:%.*]] = phi i32 [ [[RET0]], [[IF_TRUE]] ], [ 1, [[IF_FALSE]] ]
95; IS__TUNIT____-NEXT:    ret i32 1
96;
97; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
98; IS__CGSCC____-LABEL: define {{[^@]+}}@test2_1
99; IS__CGSCC____-SAME: (i1 [[C:%.*]]) #[[ATTR1]] {
100; IS__CGSCC____-NEXT:    br i1 [[C]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
101; IS__CGSCC____:       if.true:
102; IS__CGSCC____-NEXT:    [[RET0:%.*]] = add i32 0, 1
103; IS__CGSCC____-NEXT:    br label [[END:%.*]]
104; IS__CGSCC____:       if.false:
105; IS__CGSCC____-NEXT:    br label [[END]]
106; IS__CGSCC____:       end:
107; IS__CGSCC____-NEXT:    [[RET:%.*]] = phi i32 [ [[RET0]], [[IF_TRUE]] ], [ 1, [[IF_FALSE]] ]
108; IS__CGSCC____-NEXT:    ret i32 1
109;
110  br i1 %c, label %if.true, label %if.false
111if.true:
112  %call = tail call i32 @return0()
113  %ret0 = add i32 %call, 1
114  br label %end
115if.false:
116  %ret1 = tail call i32 @return1()
117  br label %end
118end:
119
120  %ret = phi i32 [ %ret0, %if.true ], [ %ret1, %if.false ]
121
122  ret i32 1
123}
124
125
126
127define i32 @test2_2(i1 %c) {
128; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
129; IS__TUNIT____-LABEL: define {{[^@]+}}@test2_2
130; IS__TUNIT____-SAME: (i1 [[C:%.*]]) #[[ATTR1]] {
131; IS__TUNIT____-NEXT:    ret i32 1
132;
133; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
134; IS__CGSCC____-LABEL: define {{[^@]+}}@test2_2
135; IS__CGSCC____-SAME: (i1 [[C:%.*]]) #[[ATTR1]] {
136; IS__CGSCC____-NEXT:    ret i32 1
137;
138  %ret = tail call i32 @test2_1(i1 %c)
139  ret i32 %ret
140}
141
142declare void @use(i32)
143define void @test3(i1 %c) {
144; CHECK-LABEL: define {{[^@]+}}@test3
145; CHECK-SAME: (i1 [[C:%.*]]) {
146; CHECK-NEXT:    br i1 [[C]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
147; CHECK:       if.true:
148; CHECK-NEXT:    br label [[END:%.*]]
149; CHECK:       if.false:
150; CHECK-NEXT:    br label [[END]]
151; CHECK:       end:
152; CHECK-NEXT:    [[R:%.*]] = phi i32 [ 1, [[IF_TRUE]] ], [ 1, [[IF_FALSE]] ]
153; CHECK-NEXT:    tail call void @use(i32 noundef 1)
154; CHECK-NEXT:    ret void
155;
156  br i1 %c, label %if.true, label %if.false
157if.true:
158  br label %end
159if.false:
160  %ret1 = tail call i32 @return1()
161  br label %end
162end:
163
164  %r = phi i32 [ 1, %if.true ], [ %ret1, %if.false ]
165
166  tail call void @use(i32 %r)
167  ret void
168}
169
170define void @test-select-phi(i1 %c) {
171; CHECK-LABEL: define {{[^@]+}}@test-select-phi
172; CHECK-SAME: (i1 [[C:%.*]]) {
173; CHECK-NEXT:    tail call void @use(i32 noundef 1)
174; CHECK-NEXT:    [[SELECT_NOT_SAME:%.*]] = select i1 [[C]], i32 1, i32 0
175; CHECK-NEXT:    tail call void @use(i32 noundef [[SELECT_NOT_SAME]])
176; CHECK-NEXT:    br i1 [[C]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
177; CHECK:       if-true:
178; CHECK-NEXT:    br label [[END:%.*]]
179; CHECK:       if-false:
180; CHECK-NEXT:    br label [[END]]
181; CHECK:       end:
182; CHECK-NEXT:    [[PHI_SAME:%.*]] = phi i32 [ 1, [[IF_TRUE]] ], [ 1, [[IF_FALSE]] ]
183; CHECK-NEXT:    [[PHI_NOT_SAME:%.*]] = phi i32 [ 0, [[IF_TRUE]] ], [ 1, [[IF_FALSE]] ]
184; CHECK-NEXT:    [[PHI_SAME_PROP:%.*]] = phi i32 [ 1, [[IF_TRUE]] ], [ 1, [[IF_FALSE]] ]
185; CHECK-NEXT:    [[PHI_SAME_UNDEF:%.*]] = phi i32 [ 1, [[IF_TRUE]] ], [ undef, [[IF_FALSE]] ]
186; CHECK-NEXT:    [[SELECT_NOT_SAME_UNDEF:%.*]] = select i1 [[C]], i32 [[PHI_NOT_SAME]], i32 undef
187; CHECK-NEXT:    tail call void @use(i32 noundef 1)
188; CHECK-NEXT:    tail call void @use(i32 noundef [[PHI_NOT_SAME]])
189; CHECK-NEXT:    tail call void @use(i32 noundef 1)
190; CHECK-NEXT:    tail call void @use(i32 1)
191; CHECK-NEXT:    tail call void @use(i32 [[SELECT_NOT_SAME_UNDEF]])
192; CHECK-NEXT:    ret void
193;
194  %select-same = select i1 %c, i32 1, i32 1
195  tail call void @use(i32 %select-same)
196
197  %select-not-same = select i1 %c, i32 1, i32 0
198  tail call void @use(i32 %select-not-same)
199  br i1 %c, label %if-true, label %if-false
200if-true:
201  br label %end
202if-false:
203  br label %end
204end:
205  %phi-same = phi i32 [ 1, %if-true ], [ 1, %if-false ]
206  %phi-not-same = phi i32 [ 0, %if-true ], [ 1, %if-false ]
207  %phi-same-prop = phi i32 [ 1, %if-true ], [ %select-same, %if-false ]
208  %phi-same-undef = phi i32 [ 1, %if-true ], [ undef, %if-false ]
209  %select-not-same-undef = select i1 %c, i32 %phi-not-same, i32 undef
210
211
212  tail call void @use(i32 %phi-same)
213
214  tail call void @use(i32 %phi-not-same)
215
216  tail call void @use(i32 %phi-same-prop)
217
218  tail call void @use(i32 %phi-same-undef)
219
220  tail call void @use(i32 %select-not-same-undef)
221
222  ret void
223
224}
225
226define i32 @ipccp1(i32 %a) {
227; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
228; IS__TUNIT____-LABEL: define {{[^@]+}}@ipccp1
229; IS__TUNIT____-SAME: (i32 returned [[A:%.*]]) #[[ATTR1]] {
230; IS__TUNIT____-NEXT:    br i1 true, label [[T:%.*]], label [[F:%.*]]
231; IS__TUNIT____:       t:
232; IS__TUNIT____-NEXT:    ret i32 [[A]]
233; IS__TUNIT____:       f:
234; IS__TUNIT____-NEXT:    unreachable
235;
236; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
237; IS__CGSCC____-LABEL: define {{[^@]+}}@ipccp1
238; IS__CGSCC____-SAME: (i32 returned [[A:%.*]]) #[[ATTR1]] {
239; IS__CGSCC____-NEXT:    br i1 true, label [[T:%.*]], label [[F:%.*]]
240; IS__CGSCC____:       t:
241; IS__CGSCC____-NEXT:    ret i32 [[A]]
242; IS__CGSCC____:       f:
243; IS__CGSCC____-NEXT:    unreachable
244;
245  br i1 true, label %t, label %f
246t:
247  ret i32 %a
248f:
249  %r = call i32 @ipccp1(i32 5)
250  ret i32 %r
251}
252
253define internal i1 @ipccp2i(i1 %a) {
254; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
255; IS__CGSCC____-LABEL: define {{[^@]+}}@ipccp2i
256; IS__CGSCC____-SAME: () #[[ATTR1]] {
257; IS__CGSCC____-NEXT:    br label [[T:%.*]]
258; IS__CGSCC____:       t:
259; IS__CGSCC____-NEXT:    ret i1 undef
260; IS__CGSCC____:       f:
261; IS__CGSCC____-NEXT:    unreachable
262;
263  br i1 %a, label %t, label %f
264t:
265  ret i1 %a
266f:
267  %r = call i1 @ipccp2i(i1 false)
268  ret i1 %r
269}
270
271define i1 @ipccp2() {
272; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
273; IS__TUNIT____-LABEL: define {{[^@]+}}@ipccp2
274; IS__TUNIT____-SAME: () #[[ATTR1]] {
275; IS__TUNIT____-NEXT:    ret i1 true
276;
277; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
278; IS__CGSCC____-LABEL: define {{[^@]+}}@ipccp2
279; IS__CGSCC____-SAME: () #[[ATTR1]] {
280; IS__CGSCC____-NEXT:    ret i1 true
281;
282  %r = call i1 @ipccp2i(i1 true)
283  ret i1 %r
284}
285
286define internal i1 @ipccp2ib(i1 %a) {
287; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
288; IS__CGSCC____-LABEL: define {{[^@]+}}@ipccp2ib
289; IS__CGSCC____-SAME: () #[[ATTR1]] {
290; IS__CGSCC____-NEXT:    br label [[T:%.*]]
291; IS__CGSCC____:       t:
292; IS__CGSCC____-NEXT:    ret i1 undef
293; IS__CGSCC____:       f:
294; IS__CGSCC____-NEXT:    unreachable
295;
296  br i1 %a, label %t, label %f
297t:
298  ret i1 true
299f:
300  %r = call i1 @ipccp2ib(i1 false)
301  ret i1 %r
302}
303
304define i1 @ipccp2b() {
305; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
306; IS__TUNIT____-LABEL: define {{[^@]+}}@ipccp2b
307; IS__TUNIT____-SAME: () #[[ATTR1]] {
308; IS__TUNIT____-NEXT:    ret i1 true
309;
310; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
311; IS__CGSCC____-LABEL: define {{[^@]+}}@ipccp2b
312; IS__CGSCC____-SAME: () #[[ATTR1]] {
313; IS__CGSCC____-NEXT:    ret i1 true
314;
315  %r = call i1 @ipccp2ib(i1 true)
316  ret i1 %r
317}
318
319define internal i32 @ipccp3i(i32 %a) {
320; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
321; IS__CGSCC____-LABEL: define {{[^@]+}}@ipccp3i
322; IS__CGSCC____-SAME: () #[[ATTR1]] {
323; IS__CGSCC____-NEXT:    br label [[T:%.*]]
324; IS__CGSCC____:       t:
325; IS__CGSCC____-NEXT:    ret i32 undef
326; IS__CGSCC____:       f:
327; IS__CGSCC____-NEXT:    unreachable
328;
329  %c = icmp eq i32 %a, 7
330  br i1 %c, label %t, label %f
331t:
332  ret i32 %a
333f:
334  %r = call i32 @ipccp3i(i32 5)
335  ret i32 %r
336}
337
338define i32 @ipccp3() {
339; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
340; IS__TUNIT____-LABEL: define {{[^@]+}}@ipccp3
341; IS__TUNIT____-SAME: () #[[ATTR1]] {
342; IS__TUNIT____-NEXT:    ret i32 7
343;
344; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
345; IS__CGSCC____-LABEL: define {{[^@]+}}@ipccp3
346; IS__CGSCC____-SAME: () #[[ATTR1]] {
347; IS__CGSCC____-NEXT:    ret i32 7
348;
349  %r = call i32 @ipccp3i(i32 7)
350  ret i32 %r
351}
352
353define internal i32 @ipccp4ia(i1 %c) {
354; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
355; IS__CGSCC____-LABEL: define {{[^@]+}}@ipccp4ia
356; IS__CGSCC____-SAME: () #[[ATTR1]] {
357; IS__CGSCC____-NEXT:    br label [[T:%.*]]
358; IS__CGSCC____:       t:
359; IS__CGSCC____-NEXT:    ret i32 undef
360; IS__CGSCC____:       f:
361; IS__CGSCC____-NEXT:    unreachable
362;
363  br i1 %c, label %t, label %f
364t:
365  ret i32 0
366f:
367  ret i32 1
368}
369define internal i32 @ipccp4ib(i32 %a) {
370; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
371; IS__CGSCC____-LABEL: define {{[^@]+}}@ipccp4ib
372; IS__CGSCC____-SAME: () #[[ATTR1]] {
373; IS__CGSCC____-NEXT:    [[C:%.*]] = icmp eq i32 7, 7
374; IS__CGSCC____-NEXT:    br i1 true, label [[T:%.*]], label [[F:%.*]]
375; IS__CGSCC____:       t:
376; IS__CGSCC____-NEXT:    ret i32 undef
377; IS__CGSCC____:       f:
378; IS__CGSCC____-NEXT:    unreachable
379;
380  %c = icmp eq i32 %a, 7
381  br i1 %c, label %t, label %f
382t:
383  %r = call i32 @ipccp4ia(i1 %c)
384  ret i32 %r
385f:
386  ret i32 1
387}
388
389define i32 @ipccp4(i1 %c) {
390; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone
391; IS__TUNIT____-LABEL: define {{[^@]+}}@ipccp4
392; IS__TUNIT____-SAME: (i1 [[C:%.*]]) #[[ATTR2:[0-9]+]] {
393; IS__TUNIT____-NEXT:    br i1 [[C]], label [[T:%.*]], label [[F:%.*]]
394; IS__TUNIT____:       t:
395; IS__TUNIT____-NEXT:    br label [[F]]
396; IS__TUNIT____:       f:
397; IS__TUNIT____-NEXT:    ret i32 0
398;
399; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
400; IS__CGSCC____-LABEL: define {{[^@]+}}@ipccp4
401; IS__CGSCC____-SAME: (i1 [[C:%.*]]) #[[ATTR1]] {
402; IS__CGSCC____-NEXT:    br i1 [[C]], label [[T:%.*]], label [[F:%.*]]
403; IS__CGSCC____:       t:
404; IS__CGSCC____-NEXT:    br label [[F]]
405; IS__CGSCC____:       f:
406; IS__CGSCC____-NEXT:    ret i32 0
407;
408  br i1 %c, label %t, label %f
409t:
410  %q = call i32 @ipccp4ia(i1 undef)
411  br label %f
412f:
413  %r = call i32 @ipccp4ib(i32 7)
414  ret i32 %r
415}
416
417; Do not touch complicated arguments (for now)
418%struct.X = type { i8* }
419define internal i32* @test_inalloca(i32* inalloca(i32) %a) {
420; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
421; IS__TUNIT____-LABEL: define {{[^@]+}}@test_inalloca
422; IS__TUNIT____-SAME: (i32* noalias nofree nonnull returned writeonly inalloca(i32) dereferenceable(4) "no-capture-maybe-returned" [[A:%.*]]) #[[ATTR1]] {
423; IS__TUNIT____-NEXT:    ret i32* [[A]]
424;
425; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
426; IS__CGSCC____-LABEL: define {{[^@]+}}@test_inalloca
427; IS__CGSCC____-SAME: (i32* noalias nofree noundef nonnull returned writeonly inalloca(i32) dereferenceable(4) "no-capture-maybe-returned" [[A:%.*]]) #[[ATTR1]] {
428; IS__CGSCC____-NEXT:    ret i32* [[A]]
429;
430  ret i32* %a
431}
432define i32* @complicated_args_inalloca(i32* %arg) {
433; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
434; IS__TUNIT____-LABEL: define {{[^@]+}}@complicated_args_inalloca
435; IS__TUNIT____-SAME: (i32* nofree readnone returned "no-capture-maybe-returned" [[ARG:%.*]]) #[[ATTR1]] {
436; IS__TUNIT____-NEXT:    [[CALL:%.*]] = call i32* @test_inalloca(i32* noalias nofree writeonly inalloca(i32) "no-capture-maybe-returned" [[ARG]]) #[[ATTR1]]
437; IS__TUNIT____-NEXT:    ret i32* [[CALL]]
438;
439; IS__CGSCC_OPM: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
440; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@complicated_args_inalloca
441; IS__CGSCC_OPM-SAME: (i32* nofree noundef nonnull readnone returned dereferenceable(4) "no-capture-maybe-returned" [[ARG:%.*]]) #[[ATTR1]] {
442; IS__CGSCC_OPM-NEXT:    [[CALL:%.*]] = call i32* @test_inalloca(i32* noalias nofree noundef nonnull writeonly inalloca(i32) dereferenceable(4) "no-capture-maybe-returned" [[ARG]]) #[[ATTR8:[0-9]+]]
443; IS__CGSCC_OPM-NEXT:    ret i32* [[CALL]]
444;
445; IS__CGSCC_NPM: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
446; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@complicated_args_inalloca
447; IS__CGSCC_NPM-SAME: (i32* nofree noundef nonnull readnone returned dereferenceable(4) "no-capture-maybe-returned" [[ARG:%.*]]) #[[ATTR1]] {
448; IS__CGSCC_NPM-NEXT:    [[CALL:%.*]] = call i32* @test_inalloca(i32* noalias nofree noundef nonnull writeonly inalloca(i32) dereferenceable(4) "no-capture-maybe-returned" [[ARG]]) #[[ATTR7:[0-9]+]]
449; IS__CGSCC_NPM-NEXT:    ret i32* [[CALL]]
450;
451  %call = call i32* @test_inalloca(i32* inalloca(i32) %arg)
452  ret i32* %call
453}
454
455define internal i32* @test_preallocated(i32* preallocated(i32) %a) {
456; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
457; IS__TUNIT____-LABEL: define {{[^@]+}}@test_preallocated
458; IS__TUNIT____-SAME: (i32* noalias nofree noundef nonnull returned writeonly preallocated(i32) align 536870912 dereferenceable(4) "no-capture-maybe-returned" [[A:%.*]]) #[[ATTR1]] {
459; IS__TUNIT____-NEXT:    ret i32* [[A]]
460;
461; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
462; IS__CGSCC____-LABEL: define {{[^@]+}}@test_preallocated
463; IS__CGSCC____-SAME: (i32* noalias nofree noundef nonnull returned writeonly preallocated(i32) align 536870912 dereferenceable(4) "no-capture-maybe-returned" [[A:%.*]]) #[[ATTR1]] {
464; IS__CGSCC____-NEXT:    ret i32* [[A]]
465;
466  ret i32* %a
467}
468define i32* @complicated_args_preallocated() {
469; IS__TUNIT_OPM: Function Attrs: nofree nosync nounwind willreturn
470; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@complicated_args_preallocated
471; IS__TUNIT_OPM-SAME: () #[[ATTR0:[0-9]+]] {
472; IS__TUNIT_OPM-NEXT:    [[C:%.*]] = call token @llvm.call.preallocated.setup(i32 noundef 1) #[[ATTR7:[0-9]+]]
473; IS__TUNIT_OPM-NEXT:    [[CALL:%.*]] = call i32* @test_preallocated(i32* noalias nocapture nofree noundef writeonly preallocated(i32) align 536870912 null) #[[ATTR1]] [ "preallocated"(token [[C]]) ]
474; IS__TUNIT_OPM-NEXT:    ret i32* [[CALL]]
475;
476; IS__TUNIT_NPM: Function Attrs: nofree nosync nounwind willreturn
477; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@complicated_args_preallocated
478; IS__TUNIT_NPM-SAME: () #[[ATTR0:[0-9]+]] {
479; IS__TUNIT_NPM-NEXT:    [[C:%.*]] = call token @llvm.call.preallocated.setup(i32 noundef 1) #[[ATTR6:[0-9]+]]
480; IS__TUNIT_NPM-NEXT:    [[CALL:%.*]] = call i32* @test_preallocated(i32* noalias nocapture nofree noundef writeonly preallocated(i32) align 536870912 null) #[[ATTR1]] [ "preallocated"(token [[C]]) ]
481; IS__TUNIT_NPM-NEXT:    ret i32* [[CALL]]
482;
483; IS__CGSCC_OPM: Function Attrs: nofree nosync nounwind willreturn
484; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@complicated_args_preallocated
485; IS__CGSCC_OPM-SAME: () #[[ATTR0:[0-9]+]] {
486; IS__CGSCC_OPM-NEXT:    [[C:%.*]] = call token @llvm.call.preallocated.setup(i32 noundef 1) #[[ATTR9:[0-9]+]]
487; IS__CGSCC_OPM-NEXT:    [[CALL:%.*]] = call i32* @test_preallocated(i32* noalias nocapture nofree noundef writeonly preallocated(i32) align 536870912 null) #[[ATTR10:[0-9]+]] [ "preallocated"(token [[C]]) ]
488; IS__CGSCC_OPM-NEXT:    ret i32* [[CALL]]
489;
490; IS__CGSCC_NPM: Function Attrs: nofree nosync nounwind willreturn
491; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@complicated_args_preallocated
492; IS__CGSCC_NPM-SAME: () #[[ATTR0:[0-9]+]] {
493; IS__CGSCC_NPM-NEXT:    [[C:%.*]] = call token @llvm.call.preallocated.setup(i32 noundef 1) #[[ATTR8:[0-9]+]]
494; IS__CGSCC_NPM-NEXT:    [[CALL:%.*]] = call i32* @test_preallocated(i32* noalias nocapture nofree noundef writeonly preallocated(i32) align 536870912 null) #[[ATTR9:[0-9]+]] [ "preallocated"(token [[C]]) ]
495; IS__CGSCC_NPM-NEXT:    ret i32* [[CALL]]
496;
497  %c = call token @llvm.call.preallocated.setup(i32 1)
498  %call = call i32* @test_preallocated(i32* preallocated(i32) null) ["preallocated"(token %c)]
499  ret i32* %call
500}
501
502define internal void @test_sret(%struct.X* sret(%struct.X) %a, %struct.X** %b) {
503;
504; IS__TUNIT____: Function Attrs: argmemonly nofree nosync nounwind willreturn writeonly
505; IS__TUNIT____-LABEL: define {{[^@]+}}@test_sret
506; IS__TUNIT____-SAME: (%struct.X* noalias nofree noundef nonnull writeonly sret([[STRUCT_X:%.*]]) align 536870912 dereferenceable(8) [[A:%.*]], %struct.X** nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[B:%.*]]) #[[ATTR3:[0-9]+]] {
507; IS__TUNIT____-NEXT:    store %struct.X* [[A]], %struct.X** [[B]], align 8
508; IS__TUNIT____-NEXT:    ret void
509;
510; IS__CGSCC____: Function Attrs: argmemonly nofree norecurse nosync nounwind willreturn writeonly
511; IS__CGSCC____-LABEL: define {{[^@]+}}@test_sret
512; IS__CGSCC____-SAME: (%struct.X* noalias nofree noundef nonnull writeonly sret([[STRUCT_X:%.*]]) align 536870912 dereferenceable(8) [[A:%.*]], %struct.X** nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[B:%.*]]) #[[ATTR2:[0-9]+]] {
513; IS__CGSCC____-NEXT:    store %struct.X* [[A]], %struct.X** [[B]], align 8
514; IS__CGSCC____-NEXT:    ret void
515;
516  store %struct.X* %a, %struct.X** %b
517  ret void
518}
519; FIXME: Alignment and dereferenceability are not propagated to the argument
520define void @complicated_args_sret(%struct.X** %b) {
521;
522; IS__TUNIT_OPM: Function Attrs: argmemonly nofree nosync nounwind willreturn writeonly
523; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@complicated_args_sret
524; IS__TUNIT_OPM-SAME: (%struct.X** nocapture nofree writeonly [[B:%.*]]) #[[ATTR3]] {
525; IS__TUNIT_OPM-NEXT:    call void @test_sret(%struct.X* noalias nocapture nofree noundef writeonly sret([[STRUCT_X:%.*]]) align 536870912 null, %struct.X** nocapture nofree writeonly align 8 [[B]]) #[[ATTR6:[0-9]+]]
526; IS__TUNIT_OPM-NEXT:    ret void
527;
528; IS__TUNIT_NPM: Function Attrs: argmemonly nofree nosync nounwind willreturn writeonly
529; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@complicated_args_sret
530; IS__TUNIT_NPM-SAME: (%struct.X** nocapture nofree writeonly [[B:%.*]]) #[[ATTR3]] {
531; IS__TUNIT_NPM-NEXT:    call void @test_sret(%struct.X* noalias nocapture nofree noundef writeonly sret([[STRUCT_X:%.*]]) align 536870912 null, %struct.X** nocapture nofree writeonly align 8 [[B]]) #[[ATTR5:[0-9]+]]
532; IS__TUNIT_NPM-NEXT:    ret void
533;
534; IS__CGSCC____: Function Attrs: argmemonly nofree norecurse nosync nounwind willreturn writeonly
535; IS__CGSCC____-LABEL: define {{[^@]+}}@complicated_args_sret
536; IS__CGSCC____-SAME: (%struct.X** nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[B:%.*]]) #[[ATTR2]] {
537; IS__CGSCC____-NEXT:    unreachable
538;
539  call void @test_sret(%struct.X* sret(%struct.X) null, %struct.X** %b)
540  ret void
541}
542
543define internal %struct.X* @test_nest(%struct.X* nest %a) {
544; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
545; IS__TUNIT____-LABEL: define {{[^@]+}}@test_nest
546; IS__TUNIT____-SAME: (%struct.X* nest noalias nofree noundef readnone returned align 536870912 "no-capture-maybe-returned" [[A:%.*]]) #[[ATTR1]] {
547; IS__TUNIT____-NEXT:    ret %struct.X* [[A]]
548;
549; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
550; IS__CGSCC____-LABEL: define {{[^@]+}}@test_nest
551; IS__CGSCC____-SAME: (%struct.X* nest noalias nofree noundef readnone returned align 536870912 "no-capture-maybe-returned" [[A:%.*]]) #[[ATTR1]] {
552; IS__CGSCC____-NEXT:    ret %struct.X* [[A]]
553;
554  ret %struct.X* %a
555}
556define %struct.X* @complicated_args_nest() {
557; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
558; IS__TUNIT____-LABEL: define {{[^@]+}}@complicated_args_nest
559; IS__TUNIT____-SAME: () #[[ATTR1]] {
560; IS__TUNIT____-NEXT:    [[CALL:%.*]] = call %struct.X* @test_nest(%struct.X* noalias nocapture nofree noundef readnone align 536870912 null) #[[ATTR1]]
561; IS__TUNIT____-NEXT:    ret %struct.X* [[CALL]]
562;
563; IS__CGSCC_OPM: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
564; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@complicated_args_nest
565; IS__CGSCC_OPM-SAME: () #[[ATTR1]] {
566; IS__CGSCC_OPM-NEXT:    [[CALL:%.*]] = call %struct.X* @test_nest(%struct.X* noalias nocapture nofree noundef readnone align 536870912 null) #[[ATTR8]]
567; IS__CGSCC_OPM-NEXT:    ret %struct.X* [[CALL]]
568;
569; IS__CGSCC_NPM: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
570; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@complicated_args_nest
571; IS__CGSCC_NPM-SAME: () #[[ATTR1]] {
572; IS__CGSCC_NPM-NEXT:    [[CALL:%.*]] = call %struct.X* @test_nest(%struct.X* noalias nocapture nofree noundef readnone align 536870912 null) #[[ATTR7]]
573; IS__CGSCC_NPM-NEXT:    ret %struct.X* [[CALL]]
574;
575  %call = call %struct.X* @test_nest(%struct.X* null)
576  ret %struct.X* %call
577}
578
579@S = external global %struct.X
580define internal void @test_byval(%struct.X* byval(%struct.X) %a) {
581; IS__CGSCC_OPM: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
582; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@test_byval
583; IS__CGSCC_OPM-SAME: (%struct.X* noalias nocapture nofree noundef nonnull writeonly byval([[STRUCT_X:%.*]]) align 8 dereferenceable(8) [[A:%.*]]) #[[ATTR1]] {
584; IS__CGSCC_OPM-NEXT:    [[G0:%.*]] = getelementptr [[STRUCT_X]], %struct.X* [[A]], i32 0, i32 0
585; IS__CGSCC_OPM-NEXT:    store i8* null, i8** [[G0]], align 8
586; IS__CGSCC_OPM-NEXT:    ret void
587;
588; IS__CGSCC_NPM: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
589; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@test_byval
590; IS__CGSCC_NPM-SAME: (i8* noalias nocapture nofree readnone [[TMP0:%.*]]) #[[ATTR1]] {
591; IS__CGSCC_NPM-NEXT:    [[A_PRIV:%.*]] = alloca [[STRUCT_X:%.*]], align 8
592; IS__CGSCC_NPM-NEXT:    [[A_PRIV_CAST:%.*]] = bitcast %struct.X* [[A_PRIV]] to i8**
593; IS__CGSCC_NPM-NEXT:    store i8* [[TMP0]], i8** [[A_PRIV_CAST]], align 8
594; IS__CGSCC_NPM-NEXT:    [[G0:%.*]] = getelementptr [[STRUCT_X]], %struct.X* [[A_PRIV]], i32 0, i32 0
595; IS__CGSCC_NPM-NEXT:    store i8* null, i8** [[G0]], align 8
596; IS__CGSCC_NPM-NEXT:    ret void
597;
598  %g0 = getelementptr %struct.X, %struct.X* %a, i32 0, i32 0
599  store i8* null, i8** %g0
600  ret void
601}
602define void @complicated_args_byval() {
603; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
604; IS__TUNIT____-LABEL: define {{[^@]+}}@complicated_args_byval
605; IS__TUNIT____-SAME: () #[[ATTR1]] {
606; IS__TUNIT____-NEXT:    ret void
607;
608; IS__CGSCC_OPM: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
609; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@complicated_args_byval
610; IS__CGSCC_OPM-SAME: () #[[ATTR1]] {
611; IS__CGSCC_OPM-NEXT:    ret void
612;
613; IS__CGSCC_NPM: Function Attrs: nofree norecurse nosync nounwind readonly willreturn
614; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@complicated_args_byval
615; IS__CGSCC_NPM-SAME: () #[[ATTR3:[0-9]+]] {
616; IS__CGSCC_NPM-NEXT:    ret void
617;
618  call void @test_byval(%struct.X* byval(%struct.X) @S)
619  ret void
620}
621
622define internal i8*@test_byval2(%struct.X* byval(%struct.X) %a) {
623; IS__TUNIT____: Function Attrs: nofree nosync nounwind readonly willreturn
624; IS__TUNIT____-LABEL: define {{[^@]+}}@test_byval2
625; IS__TUNIT____-SAME: () #[[ATTR4:[0-9]+]] {
626; IS__TUNIT____-NEXT:    [[L:%.*]] = load i8*, i8** getelementptr inbounds ([[STRUCT_X:%.*]], %struct.X* @S, i32 0, i32 0), align 8
627; IS__TUNIT____-NEXT:    ret i8* [[L]]
628;
629; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readonly willreturn
630; IS__CGSCC____-LABEL: define {{[^@]+}}@test_byval2
631; IS__CGSCC____-SAME: () #[[ATTR3:[0-9]+]] {
632; IS__CGSCC____-NEXT:    [[L:%.*]] = load i8*, i8** getelementptr inbounds ([[STRUCT_X:%.*]], %struct.X* @S, i32 0, i32 0), align 8
633; IS__CGSCC____-NEXT:    ret i8* [[L]]
634;
635  %g0 = getelementptr %struct.X, %struct.X* %a, i32 0, i32 0
636  %l = load i8*, i8** %g0
637  ret i8* %l
638}
639define i8* @complicated_args_byval2() {
640; IS__TUNIT____: Function Attrs: nofree nosync nounwind readonly willreturn
641; IS__TUNIT____-LABEL: define {{[^@]+}}@complicated_args_byval2
642; IS__TUNIT____-SAME: () #[[ATTR4]] {
643; IS__TUNIT____-NEXT:    [[C:%.*]] = call i8* @test_byval2() #[[ATTR4]]
644; IS__TUNIT____-NEXT:    ret i8* [[C]]
645;
646; IS__CGSCC_OPM: Function Attrs: nofree norecurse nosync nounwind readonly willreturn
647; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@complicated_args_byval2
648; IS__CGSCC_OPM-SAME: () #[[ATTR3]] {
649; IS__CGSCC_OPM-NEXT:    [[C:%.*]] = call i8* @test_byval2() #[[ATTR11:[0-9]+]]
650; IS__CGSCC_OPM-NEXT:    ret i8* [[C]]
651;
652; IS__CGSCC_NPM: Function Attrs: nofree norecurse nosync nounwind readonly willreturn
653; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@complicated_args_byval2
654; IS__CGSCC_NPM-SAME: () #[[ATTR3]] {
655; IS__CGSCC_NPM-NEXT:    [[C:%.*]] = call i8* @test_byval2() #[[ATTR10:[0-9]+]]
656; IS__CGSCC_NPM-NEXT:    ret i8* [[C]]
657;
658  %c = call i8* @test_byval2(%struct.X* byval(%struct.X) @S)
659  ret i8* %c
660}
661
662define void @fixpoint_changed(i32* %p) {
663; IS__TUNIT_OPM: Function Attrs: argmemonly nofree nosync nounwind writeonly
664; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@fixpoint_changed
665; IS__TUNIT_OPM-SAME: (i32* nocapture nofree writeonly [[P:%.*]]) #[[ATTR5:[0-9]+]] {
666; IS__TUNIT_OPM-NEXT:  entry:
667; IS__TUNIT_OPM-NEXT:    br label [[FOR_COND:%.*]]
668; IS__TUNIT_OPM:       for.cond:
669; IS__TUNIT_OPM-NEXT:    [[J_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[SW_EPILOG:%.*]] ]
670; IS__TUNIT_OPM-NEXT:    [[CMP:%.*]] = icmp slt i32 [[J_0]], 30
671; IS__TUNIT_OPM-NEXT:    br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
672; IS__TUNIT_OPM:       for.body:
673; IS__TUNIT_OPM-NEXT:    switch i32 [[J_0]], label [[SW_EPILOG]] [
674; IS__TUNIT_OPM-NEXT:    i32 1, label [[SW_BB:%.*]]
675; IS__TUNIT_OPM-NEXT:    ]
676; IS__TUNIT_OPM:       sw.bb:
677; IS__TUNIT_OPM-NEXT:    br label [[SW_EPILOG]]
678; IS__TUNIT_OPM:       sw.epilog:
679; IS__TUNIT_OPM-NEXT:    [[X_0:%.*]] = phi i32 [ 255, [[FOR_BODY]] ], [ 253, [[SW_BB]] ]
680; IS__TUNIT_OPM-NEXT:    store i32 [[X_0]], i32* [[P]], align 4
681; IS__TUNIT_OPM-NEXT:    [[INC]] = add nsw i32 [[J_0]], 1
682; IS__TUNIT_OPM-NEXT:    br label [[FOR_COND]]
683; IS__TUNIT_OPM:       for.end:
684; IS__TUNIT_OPM-NEXT:    ret void
685;
686; IS__TUNIT_NPM: Function Attrs: argmemonly nofree nosync nounwind willreturn writeonly
687; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@fixpoint_changed
688; IS__TUNIT_NPM-SAME: (i32* nocapture nofree writeonly [[P:%.*]]) #[[ATTR3]] {
689; IS__TUNIT_NPM-NEXT:  entry:
690; IS__TUNIT_NPM-NEXT:    br label [[FOR_COND:%.*]]
691; IS__TUNIT_NPM:       for.cond:
692; IS__TUNIT_NPM-NEXT:    [[J_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[SW_EPILOG:%.*]] ]
693; IS__TUNIT_NPM-NEXT:    [[CMP:%.*]] = icmp slt i32 [[J_0]], 30
694; IS__TUNIT_NPM-NEXT:    br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
695; IS__TUNIT_NPM:       for.body:
696; IS__TUNIT_NPM-NEXT:    switch i32 [[J_0]], label [[SW_EPILOG]] [
697; IS__TUNIT_NPM-NEXT:    i32 1, label [[SW_BB:%.*]]
698; IS__TUNIT_NPM-NEXT:    ]
699; IS__TUNIT_NPM:       sw.bb:
700; IS__TUNIT_NPM-NEXT:    br label [[SW_EPILOG]]
701; IS__TUNIT_NPM:       sw.epilog:
702; IS__TUNIT_NPM-NEXT:    [[X_0:%.*]] = phi i32 [ 255, [[FOR_BODY]] ], [ 253, [[SW_BB]] ]
703; IS__TUNIT_NPM-NEXT:    store i32 [[X_0]], i32* [[P]], align 4
704; IS__TUNIT_NPM-NEXT:    [[INC]] = add nsw i32 [[J_0]], 1
705; IS__TUNIT_NPM-NEXT:    br label [[FOR_COND]]
706; IS__TUNIT_NPM:       for.end:
707; IS__TUNIT_NPM-NEXT:    ret void
708;
709; IS__CGSCC_OPM: Function Attrs: argmemonly nofree norecurse nosync nounwind writeonly
710; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@fixpoint_changed
711; IS__CGSCC_OPM-SAME: (i32* nocapture nofree writeonly [[P:%.*]]) #[[ATTR4:[0-9]+]] {
712; IS__CGSCC_OPM-NEXT:  entry:
713; IS__CGSCC_OPM-NEXT:    br label [[FOR_COND:%.*]]
714; IS__CGSCC_OPM:       for.cond:
715; IS__CGSCC_OPM-NEXT:    [[J_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[SW_EPILOG:%.*]] ]
716; IS__CGSCC_OPM-NEXT:    [[CMP:%.*]] = icmp slt i32 [[J_0]], 30
717; IS__CGSCC_OPM-NEXT:    br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
718; IS__CGSCC_OPM:       for.body:
719; IS__CGSCC_OPM-NEXT:    switch i32 [[J_0]], label [[SW_EPILOG]] [
720; IS__CGSCC_OPM-NEXT:    i32 1, label [[SW_BB:%.*]]
721; IS__CGSCC_OPM-NEXT:    ]
722; IS__CGSCC_OPM:       sw.bb:
723; IS__CGSCC_OPM-NEXT:    br label [[SW_EPILOG]]
724; IS__CGSCC_OPM:       sw.epilog:
725; IS__CGSCC_OPM-NEXT:    [[X_0:%.*]] = phi i32 [ 255, [[FOR_BODY]] ], [ 253, [[SW_BB]] ]
726; IS__CGSCC_OPM-NEXT:    store i32 [[X_0]], i32* [[P]], align 4
727; IS__CGSCC_OPM-NEXT:    [[INC]] = add nsw i32 [[J_0]], 1
728; IS__CGSCC_OPM-NEXT:    br label [[FOR_COND]]
729; IS__CGSCC_OPM:       for.end:
730; IS__CGSCC_OPM-NEXT:    ret void
731;
732; IS__CGSCC_NPM: Function Attrs: argmemonly nofree norecurse nosync nounwind willreturn writeonly
733; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@fixpoint_changed
734; IS__CGSCC_NPM-SAME: (i32* nocapture nofree writeonly [[P:%.*]]) #[[ATTR2]] {
735; IS__CGSCC_NPM-NEXT:  entry:
736; IS__CGSCC_NPM-NEXT:    br label [[FOR_COND:%.*]]
737; IS__CGSCC_NPM:       for.cond:
738; IS__CGSCC_NPM-NEXT:    [[J_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[SW_EPILOG:%.*]] ]
739; IS__CGSCC_NPM-NEXT:    [[CMP:%.*]] = icmp slt i32 [[J_0]], 30
740; IS__CGSCC_NPM-NEXT:    br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
741; IS__CGSCC_NPM:       for.body:
742; IS__CGSCC_NPM-NEXT:    switch i32 [[J_0]], label [[SW_EPILOG]] [
743; IS__CGSCC_NPM-NEXT:    i32 1, label [[SW_BB:%.*]]
744; IS__CGSCC_NPM-NEXT:    ]
745; IS__CGSCC_NPM:       sw.bb:
746; IS__CGSCC_NPM-NEXT:    br label [[SW_EPILOG]]
747; IS__CGSCC_NPM:       sw.epilog:
748; IS__CGSCC_NPM-NEXT:    [[X_0:%.*]] = phi i32 [ 255, [[FOR_BODY]] ], [ 253, [[SW_BB]] ]
749; IS__CGSCC_NPM-NEXT:    store i32 [[X_0]], i32* [[P]], align 4
750; IS__CGSCC_NPM-NEXT:    [[INC]] = add nsw i32 [[J_0]], 1
751; IS__CGSCC_NPM-NEXT:    br label [[FOR_COND]]
752; IS__CGSCC_NPM:       for.end:
753; IS__CGSCC_NPM-NEXT:    ret void
754;
755entry:
756  br label %for.cond
757
758for.cond:
759  %j.0 = phi i32 [ 0, %entry ], [ %inc, %sw.epilog ]
760  %cmp = icmp slt i32 %j.0, 30
761  br i1 %cmp, label %for.body, label %for.end
762
763for.body:
764  switch i32 %j.0, label %sw.epilog [
765  i32 1, label %sw.bb
766  ]
767
768sw.bb:
769  br label %sw.epilog
770
771sw.epilog:
772  %x.0 = phi i32 [ 255, %for.body ], [ 253, %sw.bb ]
773  store i32 %x.0, i32* %p
774  %inc = add nsw i32 %j.0, 1
775  br label %for.cond
776
777for.end:
778  ret void
779}
780
781; Check we merge undef and a constant properly.
782define i8 @caller0() {
783; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
784; IS__TUNIT____-LABEL: define {{[^@]+}}@caller0
785; IS__TUNIT____-SAME: () #[[ATTR1]] {
786; IS__TUNIT____-NEXT:    ret i8 49
787;
788; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
789; IS__CGSCC____-LABEL: define {{[^@]+}}@caller0
790; IS__CGSCC____-SAME: () #[[ATTR1]] {
791; IS__CGSCC____-NEXT:    ret i8 49
792;
793  %c = call i8 @callee(i8 undef)
794  ret i8 %c
795}
796define i8 @caller1() {
797; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
798; IS__TUNIT____-LABEL: define {{[^@]+}}@caller1
799; IS__TUNIT____-SAME: () #[[ATTR1]] {
800; IS__TUNIT____-NEXT:    ret i8 49
801;
802; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
803; IS__CGSCC____-LABEL: define {{[^@]+}}@caller1
804; IS__CGSCC____-SAME: () #[[ATTR1]] {
805; IS__CGSCC____-NEXT:    ret i8 49
806;
807  %c = call i8 @callee(i8 undef)
808  ret i8 %c
809}
810define i8 @caller2() {
811; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
812; IS__TUNIT____-LABEL: define {{[^@]+}}@caller2
813; IS__TUNIT____-SAME: () #[[ATTR1]] {
814; IS__TUNIT____-NEXT:    ret i8 49
815;
816; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
817; IS__CGSCC____-LABEL: define {{[^@]+}}@caller2
818; IS__CGSCC____-SAME: () #[[ATTR1]] {
819; IS__CGSCC____-NEXT:    ret i8 49
820;
821  %c = call i8 @callee(i8 undef)
822  ret i8 %c
823}
824define i8 @caller_middle() {
825; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
826; IS__TUNIT____-LABEL: define {{[^@]+}}@caller_middle
827; IS__TUNIT____-SAME: () #[[ATTR1]] {
828; IS__TUNIT____-NEXT:    ret i8 49
829;
830; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
831; IS__CGSCC____-LABEL: define {{[^@]+}}@caller_middle
832; IS__CGSCC____-SAME: () #[[ATTR1]] {
833; IS__CGSCC____-NEXT:    ret i8 49
834;
835  %c = call i8 @callee(i8 42)
836  ret i8 %c
837}
838define i8 @caller3() {
839; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
840; IS__TUNIT____-LABEL: define {{[^@]+}}@caller3
841; IS__TUNIT____-SAME: () #[[ATTR1]] {
842; IS__TUNIT____-NEXT:    ret i8 49
843;
844; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
845; IS__CGSCC____-LABEL: define {{[^@]+}}@caller3
846; IS__CGSCC____-SAME: () #[[ATTR1]] {
847; IS__CGSCC____-NEXT:    ret i8 49
848;
849  %c = call i8 @callee(i8 undef)
850  ret i8 %c
851}
852define i8 @caller4() {
853; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
854; IS__TUNIT____-LABEL: define {{[^@]+}}@caller4
855; IS__TUNIT____-SAME: () #[[ATTR1]] {
856; IS__TUNIT____-NEXT:    ret i8 49
857;
858; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
859; IS__CGSCC____-LABEL: define {{[^@]+}}@caller4
860; IS__CGSCC____-SAME: () #[[ATTR1]] {
861; IS__CGSCC____-NEXT:    ret i8 49
862;
863  %c = call i8 @callee(i8 undef)
864  ret i8 %c
865}
866define internal i8 @callee(i8 %a) {
867; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
868; IS__CGSCC____-LABEL: define {{[^@]+}}@callee
869; IS__CGSCC____-SAME: () #[[ATTR1]] {
870; IS__CGSCC____-NEXT:    ret i8 undef
871;
872  %c = add i8 %a, 7
873  ret i8 %c
874}
875
876define void @user_as3() {
877; IS__TUNIT_OPM: Function Attrs: nofree nosync nounwind willreturn writeonly
878; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@user_as3
879; IS__TUNIT_OPM-SAME: () #[[ATTR6]] {
880; IS__TUNIT_OPM-NEXT:    store i32 0, i32 addrspace(3)* @ConstAS3Ptr, align 4
881; IS__TUNIT_OPM-NEXT:    ret void
882;
883; IS__TUNIT_NPM: Function Attrs: nofree nosync nounwind willreturn writeonly
884; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@user_as3
885; IS__TUNIT_NPM-SAME: () #[[ATTR5]] {
886; IS__TUNIT_NPM-NEXT:    store i32 0, i32 addrspace(3)* @ConstAS3Ptr, align 4
887; IS__TUNIT_NPM-NEXT:    ret void
888;
889; IS__CGSCC_OPM: Function Attrs: nofree norecurse nosync nounwind willreturn writeonly
890; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@user_as3
891; IS__CGSCC_OPM-SAME: () #[[ATTR5:[0-9]+]] {
892; IS__CGSCC_OPM-NEXT:    store i32 0, i32 addrspace(3)* @ConstAS3Ptr, align 4
893; IS__CGSCC_OPM-NEXT:    ret void
894;
895; IS__CGSCC_NPM: Function Attrs: nofree norecurse nosync nounwind willreturn writeonly
896; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@user_as3
897; IS__CGSCC_NPM-SAME: () #[[ATTR4:[0-9]+]] {
898; IS__CGSCC_NPM-NEXT:    store i32 0, i32 addrspace(3)* @ConstAS3Ptr, align 4
899; IS__CGSCC_NPM-NEXT:    ret void
900;
901  %call = call fastcc i32 addrspace(3)* @const_ptr_return_as3()
902  store i32 0, i32 addrspace(3)* %call
903  ret void
904}
905define void @user() {
906; IS__TUNIT_OPM: Function Attrs: nofree nosync nounwind willreturn writeonly
907; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@user
908; IS__TUNIT_OPM-SAME: () #[[ATTR6]] {
909; IS__TUNIT_OPM-NEXT:    store i32 0, i32* addrspacecast (i32 addrspace(3)* @ConstAS3Ptr to i32*), align 4
910; IS__TUNIT_OPM-NEXT:    ret void
911;
912; IS__TUNIT_NPM: Function Attrs: nofree nosync nounwind willreturn writeonly
913; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@user
914; IS__TUNIT_NPM-SAME: () #[[ATTR5]] {
915; IS__TUNIT_NPM-NEXT:    store i32 0, i32* addrspacecast (i32 addrspace(3)* @ConstAS3Ptr to i32*), align 4
916; IS__TUNIT_NPM-NEXT:    ret void
917;
918; IS__CGSCC_OPM: Function Attrs: nofree norecurse nosync nounwind willreturn writeonly
919; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@user
920; IS__CGSCC_OPM-SAME: () #[[ATTR5]] {
921; IS__CGSCC_OPM-NEXT:    store i32 0, i32* addrspacecast (i32 addrspace(3)* @ConstAS3Ptr to i32*), align 4
922; IS__CGSCC_OPM-NEXT:    ret void
923;
924; IS__CGSCC_NPM: Function Attrs: nofree norecurse nosync nounwind willreturn writeonly
925; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@user
926; IS__CGSCC_NPM-SAME: () #[[ATTR4]] {
927; IS__CGSCC_NPM-NEXT:    store i32 0, i32* addrspacecast (i32 addrspace(3)* @ConstAS3Ptr to i32*), align 4
928; IS__CGSCC_NPM-NEXT:    ret void
929;
930  %call = call fastcc i32* @const_ptr_return()
931  store i32 0, i32* %call
932  ret void
933}
934
935
936define i1 @test_merge_with_undef_values_ptr(i1 %c) {
937; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone
938; IS__TUNIT____-LABEL: define {{[^@]+}}@test_merge_with_undef_values_ptr
939; IS__TUNIT____-SAME: (i1 [[C:%.*]]) #[[ATTR2]] {
940; IS__TUNIT____-NEXT:    [[R1:%.*]] = call i1 @undef_then_null(i1 [[C]]) #[[ATTR2]]
941; IS__TUNIT____-NEXT:    ret i1 [[R1]]
942;
943; IS__CGSCC_OPM: Function Attrs: nofree nosync nounwind readnone
944; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@test_merge_with_undef_values_ptr
945; IS__CGSCC_OPM-SAME: (i1 [[C:%.*]]) #[[ATTR6:[0-9]+]] {
946; IS__CGSCC_OPM-NEXT:    [[R1:%.*]] = call noundef i1 @undef_then_null(i1 [[C]]) #[[ATTR12:[0-9]+]]
947; IS__CGSCC_OPM-NEXT:    ret i1 [[R1]]
948;
949; IS__CGSCC_NPM: Function Attrs: nofree nosync nounwind readnone
950; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@test_merge_with_undef_values_ptr
951; IS__CGSCC_NPM-SAME: (i1 [[C:%.*]]) #[[ATTR5:[0-9]+]] {
952; IS__CGSCC_NPM-NEXT:    [[R1:%.*]] = call noundef i1 @undef_then_null(i1 [[C]]) #[[ATTR11:[0-9]+]]
953; IS__CGSCC_NPM-NEXT:    ret i1 [[R1]]
954;
955  %r1 = call i1 @undef_then_null(i1 %c, i32* undef, i32* undef)
956  ret i1 %r1
957}
958define internal i1 @undef_then_null(i1 %c, i32* %i32Aptr, i32* %i32Bptr) {
959; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone
960; IS__TUNIT____-LABEL: define {{[^@]+}}@undef_then_null
961; IS__TUNIT____-SAME: (i1 [[C:%.*]]) #[[ATTR2]] {
962; IS__TUNIT____-NEXT:    [[CMP1:%.*]] = icmp eq i32* null, null
963; IS__TUNIT____-NEXT:    [[CMP2:%.*]] = icmp eq i1 [[CMP1]], false
964; IS__TUNIT____-NEXT:    [[OR:%.*]] = or i1 [[CMP2]], [[C]]
965; IS__TUNIT____-NEXT:    br i1 [[OR]], label [[A:%.*]], label [[B:%.*]]
966; IS__TUNIT____:       a:
967; IS__TUNIT____-NEXT:    [[R2:%.*]] = call i1 @undef_then_null(i1 noundef false) #[[ATTR2]]
968; IS__TUNIT____-NEXT:    ret i1 [[R2]]
969; IS__TUNIT____:       b:
970; IS__TUNIT____-NEXT:    ret i1 [[CMP2]]
971;
972; IS__CGSCC_OPM: Function Attrs: nofree nosync nounwind readnone
973; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@undef_then_null
974; IS__CGSCC_OPM-SAME: (i1 [[C:%.*]]) #[[ATTR6]] {
975; IS__CGSCC_OPM-NEXT:    [[CMP1:%.*]] = icmp eq i32* null, null
976; IS__CGSCC_OPM-NEXT:    [[CMP2:%.*]] = icmp eq i1 [[CMP1]], false
977; IS__CGSCC_OPM-NEXT:    [[OR:%.*]] = or i1 [[CMP2]], [[C]]
978; IS__CGSCC_OPM-NEXT:    br i1 [[OR]], label [[A:%.*]], label [[B:%.*]]
979; IS__CGSCC_OPM:       a:
980; IS__CGSCC_OPM-NEXT:    [[R2:%.*]] = call noundef i1 @undef_then_null(i1 noundef false) #[[ATTR6]]
981; IS__CGSCC_OPM-NEXT:    ret i1 [[R2]]
982; IS__CGSCC_OPM:       b:
983; IS__CGSCC_OPM-NEXT:    ret i1 [[CMP2]]
984;
985; IS__CGSCC_NPM: Function Attrs: nofree nosync nounwind readnone
986; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@undef_then_null
987; IS__CGSCC_NPM-SAME: (i1 [[C:%.*]]) #[[ATTR5]] {
988; IS__CGSCC_NPM-NEXT:    [[CMP1:%.*]] = icmp eq i32* null, null
989; IS__CGSCC_NPM-NEXT:    [[CMP2:%.*]] = icmp eq i1 [[CMP1]], false
990; IS__CGSCC_NPM-NEXT:    [[OR:%.*]] = or i1 [[CMP2]], [[C]]
991; IS__CGSCC_NPM-NEXT:    br i1 [[OR]], label [[A:%.*]], label [[B:%.*]]
992; IS__CGSCC_NPM:       a:
993; IS__CGSCC_NPM-NEXT:    [[R2:%.*]] = call noundef i1 @undef_then_null(i1 noundef false) #[[ATTR5]]
994; IS__CGSCC_NPM-NEXT:    ret i1 [[R2]]
995; IS__CGSCC_NPM:       b:
996; IS__CGSCC_NPM-NEXT:    ret i1 [[CMP2]]
997;
998  %cmp1 = icmp eq i32* %i32Aptr, %i32Bptr
999  %cmp2 = icmp eq i1 %cmp1, false
1000  %or = or i1 %cmp2, %c
1001  br i1 %or, label %a, label %b
1002a:
1003  %r2 = call i1 @undef_then_null(i1 false, i32* null, i32* null)
1004  ret i1 %r2
1005b:
1006  ret i1 %cmp2
1007}
1008
1009define i1 @test_merge_with_undef_values(i1 %c) {
1010; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone
1011; IS__TUNIT____-LABEL: define {{[^@]+}}@test_merge_with_undef_values
1012; IS__TUNIT____-SAME: (i1 [[C:%.*]]) #[[ATTR2]] {
1013; IS__TUNIT____-NEXT:    [[R1:%.*]] = call i1 @undef_then_1(i1 [[C]]) #[[ATTR2]]
1014; IS__TUNIT____-NEXT:    ret i1 [[R1]]
1015;
1016; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
1017; IS__CGSCC____-LABEL: define {{[^@]+}}@test_merge_with_undef_values
1018; IS__CGSCC____-SAME: (i1 [[C:%.*]]) #[[ATTR1]] {
1019; IS__CGSCC____-NEXT:    ret i1 false
1020;
1021  %r1 = call i1 @undef_then_1(i1 %c, i32 undef, i32 undef)
1022  ret i1 %r1
1023}
1024define internal i1 @undef_then_1(i1 %c, i32 %i32A, i32 %i32B) {
1025; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone
1026; IS__TUNIT____-LABEL: define {{[^@]+}}@undef_then_1
1027; IS__TUNIT____-SAME: (i1 [[C:%.*]]) #[[ATTR2]] {
1028; IS__TUNIT____-NEXT:    [[CMP1:%.*]] = icmp eq i32 1, 1
1029; IS__TUNIT____-NEXT:    [[CMP2:%.*]] = icmp eq i1 [[CMP1]], false
1030; IS__TUNIT____-NEXT:    [[OR:%.*]] = or i1 [[CMP2]], [[C]]
1031; IS__TUNIT____-NEXT:    br i1 [[OR]], label [[A:%.*]], label [[B:%.*]]
1032; IS__TUNIT____:       a:
1033; IS__TUNIT____-NEXT:    [[R2:%.*]] = call i1 @undef_then_1(i1 noundef false) #[[ATTR2]]
1034; IS__TUNIT____-NEXT:    ret i1 [[R2]]
1035; IS__TUNIT____:       b:
1036; IS__TUNIT____-NEXT:    ret i1 [[CMP2]]
1037;
1038; IS__CGSCC_OPM: Function Attrs: nofree nosync nounwind readnone willreturn
1039; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@undef_then_1
1040; IS__CGSCC_OPM-SAME: (i1 [[C:%.*]]) #[[ATTR7:[0-9]+]] {
1041; IS__CGSCC_OPM-NEXT:    [[CMP1:%.*]] = icmp eq i32 1, 1
1042; IS__CGSCC_OPM-NEXT:    [[CMP2:%.*]] = icmp eq i1 [[CMP1]], false
1043; IS__CGSCC_OPM-NEXT:    [[OR:%.*]] = or i1 false, [[C]]
1044; IS__CGSCC_OPM-NEXT:    br i1 [[OR]], label [[A:%.*]], label [[B:%.*]]
1045; IS__CGSCC_OPM:       a:
1046; IS__CGSCC_OPM-NEXT:    [[R2:%.*]] = call i1 @undef_then_1(i1 noundef false) #[[ATTR6]]
1047; IS__CGSCC_OPM-NEXT:    ret i1 undef
1048; IS__CGSCC_OPM:       b:
1049; IS__CGSCC_OPM-NEXT:    ret i1 undef
1050;
1051; IS__CGSCC_NPM: Function Attrs: nofree nosync nounwind readnone willreturn
1052; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@undef_then_1
1053; IS__CGSCC_NPM-SAME: (i1 [[C:%.*]]) #[[ATTR6:[0-9]+]] {
1054; IS__CGSCC_NPM-NEXT:    [[CMP1:%.*]] = icmp eq i32 1, 1
1055; IS__CGSCC_NPM-NEXT:    [[CMP2:%.*]] = icmp eq i1 [[CMP1]], false
1056; IS__CGSCC_NPM-NEXT:    [[OR:%.*]] = or i1 false, [[C]]
1057; IS__CGSCC_NPM-NEXT:    br i1 [[OR]], label [[A:%.*]], label [[B:%.*]]
1058; IS__CGSCC_NPM:       a:
1059; IS__CGSCC_NPM-NEXT:    [[R2:%.*]] = call i1 @undef_then_1(i1 noundef false) #[[ATTR5]]
1060; IS__CGSCC_NPM-NEXT:    ret i1 undef
1061; IS__CGSCC_NPM:       b:
1062; IS__CGSCC_NPM-NEXT:    ret i1 undef
1063;
1064  %cmp1 = icmp eq i32 %i32A, %i32B
1065  %cmp2 = icmp eq i1 %cmp1, false
1066  %or = or i1 %cmp2, %c
1067  br i1 %or, label %a, label %b
1068a:
1069  %r2 = call i1 @undef_then_1(i1 false, i32 1, i32 1)
1070  ret i1 %r2
1071b:
1072  ret i1 %cmp2
1073}
1074
1075define i1 @icmp() {
1076; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
1077; IS__TUNIT____-LABEL: define {{[^@]+}}@icmp
1078; IS__TUNIT____-SAME: () #[[ATTR1]] {
1079; IS__TUNIT____-NEXT:    ret i1 true
1080;
1081; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
1082; IS__CGSCC____-LABEL: define {{[^@]+}}@icmp
1083; IS__CGSCC____-SAME: () #[[ATTR1]] {
1084; IS__CGSCC____-NEXT:    ret i1 true
1085;
1086  %c = icmp eq i8* null, null
1087  ret i1 %c
1088}
1089;.
1090; IS__TUNIT_OPM: attributes #[[ATTR0]] = { nofree nosync nounwind willreturn }
1091; IS__TUNIT_OPM: attributes #[[ATTR1]] = { nofree nosync nounwind readnone willreturn }
1092; IS__TUNIT_OPM: attributes #[[ATTR2]] = { nofree nosync nounwind readnone }
1093; IS__TUNIT_OPM: attributes #[[ATTR3]] = { argmemonly nofree nosync nounwind willreturn writeonly }
1094; IS__TUNIT_OPM: attributes #[[ATTR4]] = { nofree nosync nounwind readonly willreturn }
1095; IS__TUNIT_OPM: attributes #[[ATTR5]] = { argmemonly nofree nosync nounwind writeonly }
1096; IS__TUNIT_OPM: attributes #[[ATTR6]] = { nofree nosync nounwind willreturn writeonly }
1097; IS__TUNIT_OPM: attributes #[[ATTR7]] = { willreturn }
1098;.
1099; IS__TUNIT_NPM: attributes #[[ATTR0]] = { nofree nosync nounwind willreturn }
1100; IS__TUNIT_NPM: attributes #[[ATTR1]] = { nofree nosync nounwind readnone willreturn }
1101; IS__TUNIT_NPM: attributes #[[ATTR2]] = { nofree nosync nounwind readnone }
1102; IS__TUNIT_NPM: attributes #[[ATTR3]] = { argmemonly nofree nosync nounwind willreturn writeonly }
1103; IS__TUNIT_NPM: attributes #[[ATTR4]] = { nofree nosync nounwind readonly willreturn }
1104; IS__TUNIT_NPM: attributes #[[ATTR5]] = { nofree nosync nounwind willreturn writeonly }
1105; IS__TUNIT_NPM: attributes #[[ATTR6]] = { willreturn }
1106;.
1107; IS__CGSCC_OPM: attributes #[[ATTR0]] = { nofree nosync nounwind willreturn }
1108; IS__CGSCC_OPM: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind readnone willreturn }
1109; IS__CGSCC_OPM: attributes #[[ATTR2]] = { argmemonly nofree norecurse nosync nounwind willreturn writeonly }
1110; IS__CGSCC_OPM: attributes #[[ATTR3]] = { nofree norecurse nosync nounwind readonly willreturn }
1111; IS__CGSCC_OPM: attributes #[[ATTR4]] = { argmemonly nofree norecurse nosync nounwind writeonly }
1112; IS__CGSCC_OPM: attributes #[[ATTR5]] = { nofree norecurse nosync nounwind willreturn writeonly }
1113; IS__CGSCC_OPM: attributes #[[ATTR6]] = { nofree nosync nounwind readnone }
1114; IS__CGSCC_OPM: attributes #[[ATTR7]] = { nofree nosync nounwind readnone willreturn }
1115; IS__CGSCC_OPM: attributes #[[ATTR8]] = { readnone willreturn }
1116; IS__CGSCC_OPM: attributes #[[ATTR9]] = { willreturn }
1117; IS__CGSCC_OPM: attributes #[[ATTR10]] = { nounwind readnone willreturn }
1118; IS__CGSCC_OPM: attributes #[[ATTR11]] = { readonly willreturn }
1119; IS__CGSCC_OPM: attributes #[[ATTR12]] = { nounwind readnone }
1120;.
1121; IS__CGSCC_NPM: attributes #[[ATTR0]] = { nofree nosync nounwind willreturn }
1122; IS__CGSCC_NPM: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind readnone willreturn }
1123; IS__CGSCC_NPM: attributes #[[ATTR2]] = { argmemonly nofree norecurse nosync nounwind willreturn writeonly }
1124; IS__CGSCC_NPM: attributes #[[ATTR3]] = { nofree norecurse nosync nounwind readonly willreturn }
1125; IS__CGSCC_NPM: attributes #[[ATTR4]] = { nofree norecurse nosync nounwind willreturn writeonly }
1126; IS__CGSCC_NPM: attributes #[[ATTR5]] = { nofree nosync nounwind readnone }
1127; IS__CGSCC_NPM: attributes #[[ATTR6]] = { nofree nosync nounwind readnone willreturn }
1128; IS__CGSCC_NPM: attributes #[[ATTR7]] = { readnone willreturn }
1129; IS__CGSCC_NPM: attributes #[[ATTR8]] = { willreturn }
1130; IS__CGSCC_NPM: attributes #[[ATTR9]] = { nounwind readnone willreturn }
1131; IS__CGSCC_NPM: attributes #[[ATTR10]] = { readonly willreturn }
1132; IS__CGSCC_NPM: attributes #[[ATTR11]] = { nounwind readnone }
1133;.
1134