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