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=2 -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=2 -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:e-i64:64-f80:128-n8:16:32:64-S128"
8
9; Test cases specifically designed for the "undefined behavior" abstract function attribute.
10; We want to verify that whenever undefined behavior is assumed, the code becomes unreachable.
11; We use FIXME's to indicate problems and missing attributes.
12
13; -- Load tests --
14
15define void @load_wholly_unreachable() {
16; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
17; IS__TUNIT____-LABEL: define {{[^@]+}}@load_wholly_unreachable
18; IS__TUNIT____-SAME: () #[[ATTR0:[0-9]+]] {
19; IS__TUNIT____-NEXT:    unreachable
20;
21; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
22; IS__CGSCC____-LABEL: define {{[^@]+}}@load_wholly_unreachable
23; IS__CGSCC____-SAME: () #[[ATTR0:[0-9]+]] {
24; IS__CGSCC____-NEXT:    unreachable
25;
26  %a = load i32, i32* null
27  ret void
28}
29
30define void @loads_wholly_unreachable() {
31; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
32; IS__TUNIT____-LABEL: define {{[^@]+}}@loads_wholly_unreachable
33; IS__TUNIT____-SAME: () #[[ATTR0]] {
34; IS__TUNIT____-NEXT:    unreachable
35;
36; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
37; IS__CGSCC____-LABEL: define {{[^@]+}}@loads_wholly_unreachable
38; IS__CGSCC____-SAME: () #[[ATTR0]] {
39; IS__CGSCC____-NEXT:    unreachable
40;
41  %a = load i32, i32* null
42  %b = load i32, i32* null
43  ret void
44}
45
46
47define void @load_single_bb_unreachable(i1 %cond) {
48; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
49; IS__TUNIT____-LABEL: define {{[^@]+}}@load_single_bb_unreachable
50; IS__TUNIT____-SAME: (i1 [[COND:%.*]]) #[[ATTR0]] {
51; IS__TUNIT____-NEXT:    br i1 [[COND]], label [[T:%.*]], label [[E:%.*]]
52; IS__TUNIT____:       t:
53; IS__TUNIT____-NEXT:    unreachable
54; IS__TUNIT____:       e:
55; IS__TUNIT____-NEXT:    ret void
56;
57; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
58; IS__CGSCC____-LABEL: define {{[^@]+}}@load_single_bb_unreachable
59; IS__CGSCC____-SAME: (i1 [[COND:%.*]]) #[[ATTR0]] {
60; IS__CGSCC____-NEXT:    br i1 [[COND]], label [[T:%.*]], label [[E:%.*]]
61; IS__CGSCC____:       t:
62; IS__CGSCC____-NEXT:    unreachable
63; IS__CGSCC____:       e:
64; IS__CGSCC____-NEXT:    ret void
65;
66  br i1 %cond, label %t, label %e
67t:
68  %b = load i32, i32* null
69  br label %e
70e:
71  ret void
72}
73
74; Note that while the load is removed (because it's unused), the block
75; is not changed to unreachable
76define void @load_null_pointer_is_defined() null_pointer_is_valid {
77; IS__TUNIT____: Function Attrs: nofree nosync nounwind null_pointer_is_valid readnone willreturn
78; IS__TUNIT____-LABEL: define {{[^@]+}}@load_null_pointer_is_defined
79; IS__TUNIT____-SAME: () #[[ATTR1:[0-9]+]] {
80; IS__TUNIT____-NEXT:    ret void
81;
82; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind null_pointer_is_valid readnone willreturn
83; IS__CGSCC____-LABEL: define {{[^@]+}}@load_null_pointer_is_defined
84; IS__CGSCC____-SAME: () #[[ATTR1:[0-9]+]] {
85; IS__CGSCC____-NEXT:    ret void
86;
87  %a = load i32, i32* null
88  ret void
89}
90
91define internal i32* @ret_null() {
92; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
93; IS__CGSCC____-LABEL: define {{[^@]+}}@ret_null
94; IS__CGSCC____-SAME: () #[[ATTR0]] {
95; IS__CGSCC____-NEXT:    ret i32* undef
96;
97  ret i32* null
98}
99
100define void @load_null_propagated() {
101; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
102; IS__TUNIT____-LABEL: define {{[^@]+}}@load_null_propagated
103; IS__TUNIT____-SAME: () #[[ATTR0]] {
104; IS__TUNIT____-NEXT:    unreachable
105;
106; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
107; IS__CGSCC____-LABEL: define {{[^@]+}}@load_null_propagated
108; IS__CGSCC____-SAME: () #[[ATTR0]] {
109; IS__CGSCC____-NEXT:    unreachable
110;
111  %ptr = call i32* @ret_null()
112  %a = load i32, i32* %ptr
113  ret void
114}
115
116; -- Store tests --
117
118define void @store_wholly_unreachable() {
119; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
120; IS__TUNIT____-LABEL: define {{[^@]+}}@store_wholly_unreachable
121; IS__TUNIT____-SAME: () #[[ATTR0]] {
122; IS__TUNIT____-NEXT:    unreachable
123;
124; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
125; IS__CGSCC____-LABEL: define {{[^@]+}}@store_wholly_unreachable
126; IS__CGSCC____-SAME: () #[[ATTR0]] {
127; IS__CGSCC____-NEXT:    unreachable
128;
129  store i32 5, i32* null
130  ret void
131}
132
133define void @store_wholly_unreachable_volatile() {
134; IS__TUNIT____: Function Attrs: nofree nounwind readnone willreturn
135; IS__TUNIT____-LABEL: define {{[^@]+}}@store_wholly_unreachable_volatile
136; IS__TUNIT____-SAME: () #[[ATTR2:[0-9]+]] {
137; IS__TUNIT____-NEXT:    store volatile i32 5, i32* null, align 4294967296
138; IS__TUNIT____-NEXT:    ret void
139;
140; IS__CGSCC____: Function Attrs: nofree norecurse nounwind readnone willreturn
141; IS__CGSCC____-LABEL: define {{[^@]+}}@store_wholly_unreachable_volatile
142; IS__CGSCC____-SAME: () #[[ATTR2:[0-9]+]] {
143; IS__CGSCC____-NEXT:    store volatile i32 5, i32* null, align 4294967296
144; IS__CGSCC____-NEXT:    ret void
145;
146  store volatile i32 5, i32* null
147  ret void
148}
149
150define void @store_single_bb_unreachable(i1 %cond) {
151; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
152; IS__TUNIT____-LABEL: define {{[^@]+}}@store_single_bb_unreachable
153; IS__TUNIT____-SAME: (i1 [[COND:%.*]]) #[[ATTR0]] {
154; IS__TUNIT____-NEXT:    br i1 [[COND]], label [[T:%.*]], label [[E:%.*]]
155; IS__TUNIT____:       t:
156; IS__TUNIT____-NEXT:    unreachable
157; IS__TUNIT____:       e:
158; IS__TUNIT____-NEXT:    ret void
159;
160; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
161; IS__CGSCC____-LABEL: define {{[^@]+}}@store_single_bb_unreachable
162; IS__CGSCC____-SAME: (i1 [[COND:%.*]]) #[[ATTR0]] {
163; IS__CGSCC____-NEXT:    br i1 [[COND]], label [[T:%.*]], label [[E:%.*]]
164; IS__CGSCC____:       t:
165; IS__CGSCC____-NEXT:    unreachable
166; IS__CGSCC____:       e:
167; IS__CGSCC____-NEXT:    ret void
168;
169  br i1 %cond, label %t, label %e
170t:
171  store i32 5, i32* null
172  br label %e
173e:
174  ret void
175}
176
177define void @store_null_pointer_is_defined() null_pointer_is_valid {
178; IS__TUNIT____: Function Attrs: nofree nosync nounwind null_pointer_is_valid willreturn writeonly
179; IS__TUNIT____-LABEL: define {{[^@]+}}@store_null_pointer_is_defined
180; IS__TUNIT____-SAME: () #[[ATTR3:[0-9]+]] {
181; IS__TUNIT____-NEXT:    store i32 5, i32* null, align 4294967296
182; IS__TUNIT____-NEXT:    ret void
183;
184; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind null_pointer_is_valid willreturn writeonly
185; IS__CGSCC____-LABEL: define {{[^@]+}}@store_null_pointer_is_defined
186; IS__CGSCC____-SAME: () #[[ATTR3:[0-9]+]] {
187; IS__CGSCC____-NEXT:    store i32 5, i32* null, align 4294967296
188; IS__CGSCC____-NEXT:    ret void
189;
190  store i32 5, i32* null
191  ret void
192}
193
194define void @store_null_propagated() {
195; ATTRIBUTOR-LABEL: @store_null_propagated(
196; ATTRIBUTOR-NEXT:    unreachable
197;
198; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
199; IS__TUNIT____-LABEL: define {{[^@]+}}@store_null_propagated
200; IS__TUNIT____-SAME: () #[[ATTR0]] {
201; IS__TUNIT____-NEXT:    unreachable
202;
203; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
204; IS__CGSCC____-LABEL: define {{[^@]+}}@store_null_propagated
205; IS__CGSCC____-SAME: () #[[ATTR0]] {
206; IS__CGSCC____-NEXT:    unreachable
207;
208  %ptr = call i32* @ret_null()
209  store i32 5, i32* %ptr
210  ret void
211}
212
213; -- AtomicRMW tests --
214
215define void @atomicrmw_wholly_unreachable() {
216; IS__TUNIT____: Function Attrs: nofree nounwind readnone willreturn
217; IS__TUNIT____-LABEL: define {{[^@]+}}@atomicrmw_wholly_unreachable
218; IS__TUNIT____-SAME: () #[[ATTR2]] {
219; IS__TUNIT____-NEXT:    unreachable
220;
221; IS__CGSCC____: Function Attrs: nofree norecurse nounwind readnone willreturn
222; IS__CGSCC____-LABEL: define {{[^@]+}}@atomicrmw_wholly_unreachable
223; IS__CGSCC____-SAME: () #[[ATTR2]] {
224; IS__CGSCC____-NEXT:    unreachable
225;
226  %a = atomicrmw add i32* null, i32 1 acquire
227  ret void
228}
229
230define void @atomicrmw_single_bb_unreachable(i1 %cond) {
231; IS__TUNIT____: Function Attrs: nofree nounwind readnone willreturn
232; IS__TUNIT____-LABEL: define {{[^@]+}}@atomicrmw_single_bb_unreachable
233; IS__TUNIT____-SAME: (i1 [[COND:%.*]]) #[[ATTR2]] {
234; IS__TUNIT____-NEXT:    br i1 [[COND]], label [[T:%.*]], label [[E:%.*]]
235; IS__TUNIT____:       t:
236; IS__TUNIT____-NEXT:    unreachable
237; IS__TUNIT____:       e:
238; IS__TUNIT____-NEXT:    ret void
239;
240; IS__CGSCC____: Function Attrs: nofree norecurse nounwind readnone willreturn
241; IS__CGSCC____-LABEL: define {{[^@]+}}@atomicrmw_single_bb_unreachable
242; IS__CGSCC____-SAME: (i1 [[COND:%.*]]) #[[ATTR2]] {
243; IS__CGSCC____-NEXT:    br i1 [[COND]], label [[T:%.*]], label [[E:%.*]]
244; IS__CGSCC____:       t:
245; IS__CGSCC____-NEXT:    unreachable
246; IS__CGSCC____:       e:
247; IS__CGSCC____-NEXT:    ret void
248;
249  br i1 %cond, label %t, label %e
250t:
251  %a = atomicrmw add i32* null, i32 1 acquire
252  br label %e
253e:
254  ret void
255}
256
257define void @atomicrmw_null_pointer_is_defined() null_pointer_is_valid {
258; IS__TUNIT____: Function Attrs: nofree nounwind null_pointer_is_valid willreturn
259; IS__TUNIT____-LABEL: define {{[^@]+}}@atomicrmw_null_pointer_is_defined
260; IS__TUNIT____-SAME: () #[[ATTR4:[0-9]+]] {
261; IS__TUNIT____-NEXT:    [[A:%.*]] = atomicrmw add i32* null, i32 1 acquire, align 4
262; IS__TUNIT____-NEXT:    ret void
263;
264; IS__CGSCC____: Function Attrs: nofree norecurse nounwind null_pointer_is_valid willreturn
265; IS__CGSCC____-LABEL: define {{[^@]+}}@atomicrmw_null_pointer_is_defined
266; IS__CGSCC____-SAME: () #[[ATTR4:[0-9]+]] {
267; IS__CGSCC____-NEXT:    [[A:%.*]] = atomicrmw add i32* null, i32 1 acquire, align 4
268; IS__CGSCC____-NEXT:    ret void
269;
270  %a = atomicrmw add i32* null, i32 1 acquire
271  ret void
272}
273
274define void @atomicrmw_null_propagated() {
275; ATTRIBUTOR-LABEL: @atomicrmw_null_propagated(
276; ATTRIBUTOR-NEXT:    unreachable
277;
278; IS__TUNIT____: Function Attrs: nofree nounwind readnone willreturn
279; IS__TUNIT____-LABEL: define {{[^@]+}}@atomicrmw_null_propagated
280; IS__TUNIT____-SAME: () #[[ATTR2]] {
281; IS__TUNIT____-NEXT:    unreachable
282;
283; IS__CGSCC____: Function Attrs: nofree norecurse nounwind readnone willreturn
284; IS__CGSCC____-LABEL: define {{[^@]+}}@atomicrmw_null_propagated
285; IS__CGSCC____-SAME: () #[[ATTR2]] {
286; IS__CGSCC____-NEXT:    unreachable
287;
288  %ptr = call i32* @ret_null()
289  %a = atomicrmw add i32* %ptr, i32 1 acquire
290  ret void
291}
292
293; -- AtomicCmpXchg tests --
294
295define void @atomiccmpxchg_wholly_unreachable() {
296; IS__TUNIT____: Function Attrs: nofree nounwind readnone willreturn
297; IS__TUNIT____-LABEL: define {{[^@]+}}@atomiccmpxchg_wholly_unreachable
298; IS__TUNIT____-SAME: () #[[ATTR2]] {
299; IS__TUNIT____-NEXT:    unreachable
300;
301; IS__CGSCC____: Function Attrs: nofree norecurse nounwind readnone willreturn
302; IS__CGSCC____-LABEL: define {{[^@]+}}@atomiccmpxchg_wholly_unreachable
303; IS__CGSCC____-SAME: () #[[ATTR2]] {
304; IS__CGSCC____-NEXT:    unreachable
305;
306  %a = cmpxchg i32* null, i32 2, i32 3 acq_rel monotonic
307  ret void
308}
309
310define void @atomiccmpxchg_single_bb_unreachable(i1 %cond) {
311; IS__TUNIT____: Function Attrs: nofree nounwind readnone willreturn
312; IS__TUNIT____-LABEL: define {{[^@]+}}@atomiccmpxchg_single_bb_unreachable
313; IS__TUNIT____-SAME: (i1 [[COND:%.*]]) #[[ATTR2]] {
314; IS__TUNIT____-NEXT:    br i1 [[COND]], label [[T:%.*]], label [[E:%.*]]
315; IS__TUNIT____:       t:
316; IS__TUNIT____-NEXT:    unreachable
317; IS__TUNIT____:       e:
318; IS__TUNIT____-NEXT:    ret void
319;
320; IS__CGSCC____: Function Attrs: nofree norecurse nounwind readnone willreturn
321; IS__CGSCC____-LABEL: define {{[^@]+}}@atomiccmpxchg_single_bb_unreachable
322; IS__CGSCC____-SAME: (i1 [[COND:%.*]]) #[[ATTR2]] {
323; IS__CGSCC____-NEXT:    br i1 [[COND]], label [[T:%.*]], label [[E:%.*]]
324; IS__CGSCC____:       t:
325; IS__CGSCC____-NEXT:    unreachable
326; IS__CGSCC____:       e:
327; IS__CGSCC____-NEXT:    ret void
328;
329  br i1 %cond, label %t, label %e
330t:
331  %a = cmpxchg i32* null, i32 2, i32 3 acq_rel monotonic
332  br label %e
333e:
334  ret void
335}
336
337define void @atomiccmpxchg_null_pointer_is_defined() null_pointer_is_valid {
338; IS__TUNIT____: Function Attrs: nofree nounwind null_pointer_is_valid willreturn
339; IS__TUNIT____-LABEL: define {{[^@]+}}@atomiccmpxchg_null_pointer_is_defined
340; IS__TUNIT____-SAME: () #[[ATTR4]] {
341; IS__TUNIT____-NEXT:    [[A:%.*]] = cmpxchg i32* null, i32 2, i32 3 acq_rel monotonic, align 4
342; IS__TUNIT____-NEXT:    ret void
343;
344; IS__CGSCC____: Function Attrs: nofree norecurse nounwind null_pointer_is_valid willreturn
345; IS__CGSCC____-LABEL: define {{[^@]+}}@atomiccmpxchg_null_pointer_is_defined
346; IS__CGSCC____-SAME: () #[[ATTR4]] {
347; IS__CGSCC____-NEXT:    [[A:%.*]] = cmpxchg i32* null, i32 2, i32 3 acq_rel monotonic, align 4
348; IS__CGSCC____-NEXT:    ret void
349;
350  %a = cmpxchg i32* null, i32 2, i32 3 acq_rel monotonic
351  ret void
352}
353
354define void @atomiccmpxchg_null_propagated() {
355; ATTRIBUTOR-LABEL: @atomiccmpxchg_null_propagated(
356; ATTRIBUTOR-NEXT:    unreachable
357;
358; IS__TUNIT____: Function Attrs: nofree nounwind readnone willreturn
359; IS__TUNIT____-LABEL: define {{[^@]+}}@atomiccmpxchg_null_propagated
360; IS__TUNIT____-SAME: () #[[ATTR2]] {
361; IS__TUNIT____-NEXT:    unreachable
362;
363; IS__CGSCC____: Function Attrs: nofree norecurse nounwind readnone willreturn
364; IS__CGSCC____-LABEL: define {{[^@]+}}@atomiccmpxchg_null_propagated
365; IS__CGSCC____-SAME: () #[[ATTR2]] {
366; IS__CGSCC____-NEXT:    unreachable
367;
368  %ptr = call i32* @ret_null()
369  %a = cmpxchg i32* %ptr, i32 2, i32 3 acq_rel monotonic
370  ret void
371}
372
373; -- Conditional branching tests --
374
375; Note: The unreachable on %t and %e is _not_ from AAUndefinedBehavior
376
377define i32 @cond_br_on_undef() {
378; IS__TUNIT____: Function Attrs: nofree noreturn nosync nounwind readnone willreturn
379; IS__TUNIT____-LABEL: define {{[^@]+}}@cond_br_on_undef
380; IS__TUNIT____-SAME: () #[[ATTR5:[0-9]+]] {
381; IS__TUNIT____-NEXT:    unreachable
382; IS__TUNIT____:       t:
383; IS__TUNIT____-NEXT:    unreachable
384; IS__TUNIT____:       e:
385; IS__TUNIT____-NEXT:    unreachable
386;
387; IS__CGSCC____: Function Attrs: nofree norecurse noreturn nosync nounwind readnone willreturn
388; IS__CGSCC____-LABEL: define {{[^@]+}}@cond_br_on_undef
389; IS__CGSCC____-SAME: () #[[ATTR5:[0-9]+]] {
390; IS__CGSCC____-NEXT:    unreachable
391; IS__CGSCC____:       t:
392; IS__CGSCC____-NEXT:    unreachable
393; IS__CGSCC____:       e:
394; IS__CGSCC____-NEXT:    unreachable
395;
396  br i1 undef, label %t, label %e
397t:
398  ret i32 1
399e:
400  ret i32 2
401}
402
403; More complicated branching
404  ; Valid branch - verify that this is not converted
405  ; to unreachable.
406define void @cond_br_on_undef2(i1 %cond) {
407; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
408; IS__TUNIT____-LABEL: define {{[^@]+}}@cond_br_on_undef2
409; IS__TUNIT____-SAME: (i1 [[COND:%.*]]) #[[ATTR0]] {
410; IS__TUNIT____-NEXT:    br i1 [[COND]], label [[T1:%.*]], label [[E1:%.*]]
411; IS__TUNIT____:       t1:
412; IS__TUNIT____-NEXT:    unreachable
413; IS__TUNIT____:       t2:
414; IS__TUNIT____-NEXT:    unreachable
415; IS__TUNIT____:       e2:
416; IS__TUNIT____-NEXT:    unreachable
417; IS__TUNIT____:       e1:
418; IS__TUNIT____-NEXT:    ret void
419;
420; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
421; IS__CGSCC____-LABEL: define {{[^@]+}}@cond_br_on_undef2
422; IS__CGSCC____-SAME: (i1 [[COND:%.*]]) #[[ATTR0]] {
423; IS__CGSCC____-NEXT:    br i1 [[COND]], label [[T1:%.*]], label [[E1:%.*]]
424; IS__CGSCC____:       t1:
425; IS__CGSCC____-NEXT:    unreachable
426; IS__CGSCC____:       t2:
427; IS__CGSCC____-NEXT:    unreachable
428; IS__CGSCC____:       e2:
429; IS__CGSCC____-NEXT:    unreachable
430; IS__CGSCC____:       e1:
431; IS__CGSCC____-NEXT:    ret void
432;
433  br i1 %cond, label %t1, label %e1
434t1:
435  br i1 undef, label %t2, label %e2
436t2:
437  ret void
438e2:
439  ret void
440e1:
441  ret void
442}
443
444define i1 @ret_undef() {
445; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
446; IS__TUNIT____-LABEL: define {{[^@]+}}@ret_undef
447; IS__TUNIT____-SAME: () #[[ATTR0]] {
448; IS__TUNIT____-NEXT:    ret i1 undef
449;
450; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
451; IS__CGSCC____-LABEL: define {{[^@]+}}@ret_undef
452; IS__CGSCC____-SAME: () #[[ATTR0]] {
453; IS__CGSCC____-NEXT:    ret i1 undef
454;
455  ret i1 undef
456}
457
458define void @cond_br_on_undef_interproc() {
459; IS__TUNIT____: Function Attrs: nofree noreturn nosync nounwind readnone willreturn
460; IS__TUNIT____-LABEL: define {{[^@]+}}@cond_br_on_undef_interproc
461; IS__TUNIT____-SAME: () #[[ATTR5]] {
462; IS__TUNIT____-NEXT:    unreachable
463; IS__TUNIT____:       t:
464; IS__TUNIT____-NEXT:    unreachable
465; IS__TUNIT____:       e:
466; IS__TUNIT____-NEXT:    unreachable
467;
468; IS__CGSCC____: Function Attrs: nofree norecurse noreturn nosync nounwind readnone willreturn
469; IS__CGSCC____-LABEL: define {{[^@]+}}@cond_br_on_undef_interproc
470; IS__CGSCC____-SAME: () #[[ATTR5]] {
471; IS__CGSCC____-NEXT:    unreachable
472; IS__CGSCC____:       t:
473; IS__CGSCC____-NEXT:    unreachable
474; IS__CGSCC____:       e:
475; IS__CGSCC____-NEXT:    unreachable
476;
477  %cond = call i1 @ret_undef()
478  br i1 %cond, label %t, label %e
479t:
480  ret void
481e:
482  ret void
483}
484
485define i1 @ret_undef2() {
486; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
487; IS__TUNIT____-LABEL: define {{[^@]+}}@ret_undef2
488; IS__TUNIT____-SAME: () #[[ATTR0]] {
489; IS__TUNIT____-NEXT:    br i1 true, label [[T:%.*]], label [[E:%.*]]
490; IS__TUNIT____:       t:
491; IS__TUNIT____-NEXT:    ret i1 undef
492; IS__TUNIT____:       e:
493; IS__TUNIT____-NEXT:    unreachable
494;
495; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
496; IS__CGSCC____-LABEL: define {{[^@]+}}@ret_undef2
497; IS__CGSCC____-SAME: () #[[ATTR0]] {
498; IS__CGSCC____-NEXT:    br i1 true, label [[T:%.*]], label [[E:%.*]]
499; IS__CGSCC____:       t:
500; IS__CGSCC____-NEXT:    ret i1 undef
501; IS__CGSCC____:       e:
502; IS__CGSCC____-NEXT:    unreachable
503;
504  br i1 true, label %t, label %e
505t:
506  ret i1 undef
507e:
508  ret i1 undef
509}
510
511; More complicated interproc deduction of undef
512define void @cond_br_on_undef_interproc2() {
513; IS__TUNIT____: Function Attrs: nofree noreturn nosync nounwind readnone willreturn
514; IS__TUNIT____-LABEL: define {{[^@]+}}@cond_br_on_undef_interproc2
515; IS__TUNIT____-SAME: () #[[ATTR5]] {
516; IS__TUNIT____-NEXT:    unreachable
517; IS__TUNIT____:       t:
518; IS__TUNIT____-NEXT:    unreachable
519; IS__TUNIT____:       e:
520; IS__TUNIT____-NEXT:    unreachable
521;
522; IS__CGSCC____: Function Attrs: nofree norecurse noreturn nosync nounwind readnone willreturn
523; IS__CGSCC____-LABEL: define {{[^@]+}}@cond_br_on_undef_interproc2
524; IS__CGSCC____-SAME: () #[[ATTR5]] {
525; IS__CGSCC____-NEXT:    unreachable
526; IS__CGSCC____:       t:
527; IS__CGSCC____-NEXT:    unreachable
528; IS__CGSCC____:       e:
529; IS__CGSCC____-NEXT:    unreachable
530;
531  %cond = call i1 @ret_undef2()
532  br i1 %cond, label %t, label %e
533t:
534  ret void
535e:
536  ret void
537}
538
539; Branch on undef that depends on propagation of
540; undef of a previous instruction.
541define i32 @cond_br_on_undef3() {
542; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
543; IS__TUNIT____-LABEL: define {{[^@]+}}@cond_br_on_undef3
544; IS__TUNIT____-SAME: () #[[ATTR0]] {
545; IS__TUNIT____-NEXT:    br label [[T:%.*]]
546; IS__TUNIT____:       t:
547; IS__TUNIT____-NEXT:    ret i32 1
548; IS__TUNIT____:       e:
549; IS__TUNIT____-NEXT:    unreachable
550;
551; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
552; IS__CGSCC____-LABEL: define {{[^@]+}}@cond_br_on_undef3
553; IS__CGSCC____-SAME: () #[[ATTR0]] {
554; IS__CGSCC____-NEXT:    br label [[T:%.*]]
555; IS__CGSCC____:       t:
556; IS__CGSCC____-NEXT:    ret i32 1
557; IS__CGSCC____:       e:
558; IS__CGSCC____-NEXT:    unreachable
559;
560  %cond = icmp ne i32 1, undef
561  br i1 %cond, label %t, label %e
562t:
563  ret i32 1
564e:
565  ret i32 2
566}
567
568; Branch on undef because of uninitialized value.
569; FIXME: Currently it doesn't propagate the undef.
570define i32 @cond_br_on_undef_uninit() {
571; IS__TUNIT____: Function Attrs: nofree noreturn nosync nounwind readnone willreturn
572; IS__TUNIT____-LABEL: define {{[^@]+}}@cond_br_on_undef_uninit
573; IS__TUNIT____-SAME: () #[[ATTR5]] {
574; IS__TUNIT____-NEXT:    unreachable
575; IS__TUNIT____:       t:
576; IS__TUNIT____-NEXT:    unreachable
577; IS__TUNIT____:       e:
578; IS__TUNIT____-NEXT:    unreachable
579;
580; IS__CGSCC____: Function Attrs: nofree norecurse noreturn nosync nounwind readnone willreturn
581; IS__CGSCC____-LABEL: define {{[^@]+}}@cond_br_on_undef_uninit
582; IS__CGSCC____-SAME: () #[[ATTR5]] {
583; IS__CGSCC____-NEXT:    unreachable
584; IS__CGSCC____:       t:
585; IS__CGSCC____-NEXT:    unreachable
586; IS__CGSCC____:       e:
587; IS__CGSCC____-NEXT:    unreachable
588;
589  %alloc = alloca i1
590  %cond = load i1, i1* %alloc
591  br i1 %cond, label %t, label %e
592t:
593  ret i32 1
594e:
595  ret i32 2
596}
597
598; Note that the `load` has UB (so it will be changed to unreachable)
599; and the branch is a terminator that can be constant-folded.
600; We want to test that doing both won't cause a segfault.
601; MODULE-NOT: @callee(
602define internal i32 @callee(i1 %C, i32* %A) {
603;
604; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
605; IS__CGSCC____-LABEL: define {{[^@]+}}@callee
606; IS__CGSCC____-SAME: () #[[ATTR0]] {
607; IS__CGSCC____-NEXT:  entry:
608; IS__CGSCC____-NEXT:    unreachable
609; IS__CGSCC____:       T:
610; IS__CGSCC____-NEXT:    unreachable
611; IS__CGSCC____:       F:
612; IS__CGSCC____-NEXT:    ret i32 undef
613;
614entry:
615  %A.0 = load i32, i32* null
616  br i1 %C, label %T, label %F
617
618T:
619  ret i32 %A.0
620
621F:
622  ret i32 1
623}
624
625define i32 @foo() {
626; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
627; IS__TUNIT____-LABEL: define {{[^@]+}}@foo
628; IS__TUNIT____-SAME: () #[[ATTR0]] {
629; IS__TUNIT____-NEXT:    ret i32 1
630;
631; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
632; IS__CGSCC____-LABEL: define {{[^@]+}}@foo
633; IS__CGSCC____-SAME: () #[[ATTR0]] {
634; IS__CGSCC____-NEXT:    ret i32 1
635;
636  %X = call i32 @callee(i1 false, i32* null)
637  ret i32 %X
638}
639
640; Tests for nonnull noundef attribute violation.
641;
642; Tests for argument position
643
644define void @arg_nonnull_1(i32* nonnull %a) {
645; IS__TUNIT____: Function Attrs: argmemonly nofree nosync nounwind willreturn writeonly
646; IS__TUNIT____-LABEL: define {{[^@]+}}@arg_nonnull_1
647; IS__TUNIT____-SAME: (i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR6:[0-9]+]] {
648; IS__TUNIT____-NEXT:    store i32 0, i32* [[A]], align 4
649; IS__TUNIT____-NEXT:    ret void
650;
651; IS__CGSCC____: Function Attrs: argmemonly nofree norecurse nosync nounwind willreturn writeonly
652; IS__CGSCC____-LABEL: define {{[^@]+}}@arg_nonnull_1
653; IS__CGSCC____-SAME: (i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR6:[0-9]+]] {
654; IS__CGSCC____-NEXT:    store i32 0, i32* [[A]], align 4
655; IS__CGSCC____-NEXT:    ret void
656;
657  store i32 0, i32* %a
658  ret void
659}
660
661define void @arg_nonnull_1_noundef_1(i32* nonnull noundef %a) {
662; IS__TUNIT____: Function Attrs: argmemonly nofree nosync nounwind willreturn writeonly
663; IS__TUNIT____-LABEL: define {{[^@]+}}@arg_nonnull_1_noundef_1
664; IS__TUNIT____-SAME: (i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR6]] {
665; IS__TUNIT____-NEXT:    store i32 0, i32* [[A]], align 4
666; IS__TUNIT____-NEXT:    ret void
667;
668; IS__CGSCC____: Function Attrs: argmemonly nofree norecurse nosync nounwind willreturn writeonly
669; IS__CGSCC____-LABEL: define {{[^@]+}}@arg_nonnull_1_noundef_1
670; IS__CGSCC____-SAME: (i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR6]] {
671; IS__CGSCC____-NEXT:    store i32 0, i32* [[A]], align 4
672; IS__CGSCC____-NEXT:    ret void
673;
674  store i32 0, i32* %a
675  ret void
676}
677
678define void @arg_nonnull_12(i32* nonnull %a, i32* nonnull %b, i32* %c) {
679; IS__TUNIT____: Function Attrs: argmemonly nofree nosync nounwind willreturn writeonly
680; IS__TUNIT____-LABEL: define {{[^@]+}}@arg_nonnull_12
681; IS__TUNIT____-SAME: (i32* nocapture nofree nonnull writeonly [[A:%.*]], i32* nocapture nofree nonnull writeonly [[B:%.*]], i32* nofree writeonly [[C:%.*]]) #[[ATTR6]] {
682; IS__TUNIT____-NEXT:    [[D:%.*]] = icmp eq i32* [[C]], null
683; IS__TUNIT____-NEXT:    br i1 [[D]], label [[T:%.*]], label [[F:%.*]]
684; IS__TUNIT____:       t:
685; IS__TUNIT____-NEXT:    store i32 0, i32* [[A]], align 4
686; IS__TUNIT____-NEXT:    br label [[RET:%.*]]
687; IS__TUNIT____:       f:
688; IS__TUNIT____-NEXT:    store i32 1, i32* [[B]], align 4
689; IS__TUNIT____-NEXT:    br label [[RET]]
690; IS__TUNIT____:       ret:
691; IS__TUNIT____-NEXT:    ret void
692;
693; IS__CGSCC____: Function Attrs: argmemonly nofree norecurse nosync nounwind willreturn writeonly
694; IS__CGSCC____-LABEL: define {{[^@]+}}@arg_nonnull_12
695; IS__CGSCC____-SAME: (i32* nocapture nofree nonnull writeonly [[A:%.*]], i32* nocapture nofree nonnull writeonly [[B:%.*]], i32* nofree writeonly [[C:%.*]]) #[[ATTR6]] {
696; IS__CGSCC____-NEXT:    [[D:%.*]] = icmp eq i32* [[C]], null
697; IS__CGSCC____-NEXT:    br i1 [[D]], label [[T:%.*]], label [[F:%.*]]
698; IS__CGSCC____:       t:
699; IS__CGSCC____-NEXT:    store i32 0, i32* [[A]], align 4
700; IS__CGSCC____-NEXT:    br label [[RET:%.*]]
701; IS__CGSCC____:       f:
702; IS__CGSCC____-NEXT:    store i32 1, i32* [[B]], align 4
703; IS__CGSCC____-NEXT:    br label [[RET]]
704; IS__CGSCC____:       ret:
705; IS__CGSCC____-NEXT:    ret void
706;
707  %d = icmp eq i32* %c, null
708  br i1 %d, label %t, label %f
709t:
710  store i32 0, i32* %a
711  br label %ret
712f:
713  store i32 1, i32* %b
714  br label %ret
715ret:
716  ret void
717}
718
719define void @arg_nonnull_12_noundef_2(i32* nonnull %a, i32* noundef nonnull %b, i32* %c) {
720; IS__TUNIT____: Function Attrs: argmemonly nofree nosync nounwind willreturn writeonly
721; IS__TUNIT____-LABEL: define {{[^@]+}}@arg_nonnull_12_noundef_2
722; IS__TUNIT____-SAME: (i32* nocapture nofree nonnull writeonly [[A:%.*]], i32* nocapture nofree noundef nonnull writeonly [[B:%.*]], i32* nofree writeonly [[C:%.*]]) #[[ATTR6]] {
723; IS__TUNIT____-NEXT:    [[D:%.*]] = icmp eq i32* [[C]], null
724; IS__TUNIT____-NEXT:    br i1 [[D]], label [[T:%.*]], label [[F:%.*]]
725; IS__TUNIT____:       t:
726; IS__TUNIT____-NEXT:    store i32 0, i32* [[A]], align 4
727; IS__TUNIT____-NEXT:    br label [[RET:%.*]]
728; IS__TUNIT____:       f:
729; IS__TUNIT____-NEXT:    store i32 1, i32* [[B]], align 4
730; IS__TUNIT____-NEXT:    br label [[RET]]
731; IS__TUNIT____:       ret:
732; IS__TUNIT____-NEXT:    ret void
733;
734; IS__CGSCC____: Function Attrs: argmemonly nofree norecurse nosync nounwind willreturn writeonly
735; IS__CGSCC____-LABEL: define {{[^@]+}}@arg_nonnull_12_noundef_2
736; IS__CGSCC____-SAME: (i32* nocapture nofree nonnull writeonly [[A:%.*]], i32* nocapture nofree noundef nonnull writeonly [[B:%.*]], i32* nofree writeonly [[C:%.*]]) #[[ATTR6]] {
737; IS__CGSCC____-NEXT:    [[D:%.*]] = icmp eq i32* [[C]], null
738; IS__CGSCC____-NEXT:    br i1 [[D]], label [[T:%.*]], label [[F:%.*]]
739; IS__CGSCC____:       t:
740; IS__CGSCC____-NEXT:    store i32 0, i32* [[A]], align 4
741; IS__CGSCC____-NEXT:    br label [[RET:%.*]]
742; IS__CGSCC____:       f:
743; IS__CGSCC____-NEXT:    store i32 1, i32* [[B]], align 4
744; IS__CGSCC____-NEXT:    br label [[RET]]
745; IS__CGSCC____:       ret:
746; IS__CGSCC____-NEXT:    ret void
747;
748  %d = icmp eq i32* %c, null
749  br i1 %d, label %t, label %f
750t:
751  store i32 0, i32* %a
752  br label %ret
753f:
754  store i32 1, i32* %b
755  br label %ret
756ret:
757  ret void
758}
759
760; Pass null directly to argument with nonnull attribute
761define void @arg_nonnull_violation1_1() {
762; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
763; IS__TUNIT____-LABEL: define {{[^@]+}}@arg_nonnull_violation1_1
764; IS__TUNIT____-SAME: () #[[ATTR0]] {
765; IS__TUNIT____-NEXT:    unreachable
766;
767; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
768; IS__CGSCC____-LABEL: define {{[^@]+}}@arg_nonnull_violation1_1
769; IS__CGSCC____-SAME: () #[[ATTR0]] {
770; IS__CGSCC____-NEXT:    unreachable
771;
772  call void @arg_nonnull_1(i32* null)
773  ret void
774}
775
776define void @arg_nonnull_violation1_2() {
777; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
778; IS__TUNIT____-LABEL: define {{[^@]+}}@arg_nonnull_violation1_2
779; IS__TUNIT____-SAME: () #[[ATTR0]] {
780; IS__TUNIT____-NEXT:    unreachable
781;
782; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
783; IS__CGSCC____-LABEL: define {{[^@]+}}@arg_nonnull_violation1_2
784; IS__CGSCC____-SAME: () #[[ATTR0]] {
785; IS__CGSCC____-NEXT:    unreachable
786;
787  call void @arg_nonnull_1_noundef_1(i32* null)
788  ret void
789}
790
791; A case that depends on value simplification
792define void @arg_nonnull_violation2_1(i1 %c) {
793; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
794; IS__TUNIT____-LABEL: define {{[^@]+}}@arg_nonnull_violation2_1
795; IS__TUNIT____-SAME: (i1 [[C:%.*]]) #[[ATTR0]] {
796; IS__TUNIT____-NEXT:    unreachable
797;
798; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
799; IS__CGSCC____-LABEL: define {{[^@]+}}@arg_nonnull_violation2_1
800; IS__CGSCC____-SAME: (i1 [[C:%.*]]) #[[ATTR0]] {
801; IS__CGSCC____-NEXT:    unreachable
802;
803  %null = getelementptr i32, i32* null, i32 0
804  %mustnull = select i1 %c, i32* null, i32* %null
805  call void @arg_nonnull_1(i32* %mustnull)
806  ret void
807}
808
809define void @arg_nonnull_violation2_2(i1 %c) {
810; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
811; IS__TUNIT____-LABEL: define {{[^@]+}}@arg_nonnull_violation2_2
812; IS__TUNIT____-SAME: (i1 [[C:%.*]]) #[[ATTR0]] {
813; IS__TUNIT____-NEXT:    unreachable
814;
815; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
816; IS__CGSCC____-LABEL: define {{[^@]+}}@arg_nonnull_violation2_2
817; IS__CGSCC____-SAME: (i1 [[C:%.*]]) #[[ATTR0]] {
818; IS__CGSCC____-NEXT:    unreachable
819;
820  %null = getelementptr i32, i32* null, i32 0
821  %mustnull = select i1 %c, i32* null, i32* %null
822  call void @arg_nonnull_1_noundef_1(i32* %mustnull)
823  ret void
824}
825
826; Cases for single and multiple violation at a callsite
827define void @arg_nonnull_violation3_1(i1 %c) {
828; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
829; IS__TUNIT____-LABEL: define {{[^@]+}}@arg_nonnull_violation3_1
830; IS__TUNIT____-SAME: (i1 [[C:%.*]]) #[[ATTR0]] {
831; IS__TUNIT____-NEXT:    [[PTR:%.*]] = alloca i32, align 4
832; IS__TUNIT____-NEXT:    br i1 [[C]], label [[T:%.*]], label [[F:%.*]]
833; IS__TUNIT____:       t:
834; IS__TUNIT____-NEXT:    call void @arg_nonnull_12(i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]], i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]], i32* nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]]) #[[ATTR7:[0-9]+]]
835; IS__TUNIT____-NEXT:    call void @arg_nonnull_12(i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]], i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]], i32* noalias nocapture nofree noundef writeonly align 4294967296 null) #[[ATTR7]]
836; IS__TUNIT____-NEXT:    unreachable
837; IS__TUNIT____:       f:
838; IS__TUNIT____-NEXT:    unreachable
839; IS__TUNIT____:       ret:
840; IS__TUNIT____-NEXT:    ret void
841;
842; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
843; IS__CGSCC____-LABEL: define {{[^@]+}}@arg_nonnull_violation3_1
844; IS__CGSCC____-SAME: (i1 [[C:%.*]]) #[[ATTR0]] {
845; IS__CGSCC____-NEXT:    [[PTR:%.*]] = alloca i32, align 4
846; IS__CGSCC____-NEXT:    br i1 [[C]], label [[T:%.*]], label [[F:%.*]]
847; IS__CGSCC____:       t:
848; IS__CGSCC____-NEXT:    call void @arg_nonnull_12(i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]], i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]], i32* nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]]) #[[ATTR7:[0-9]+]]
849; IS__CGSCC____-NEXT:    call void @arg_nonnull_12(i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]], i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]], i32* noalias nocapture nofree noundef writeonly align 4294967296 null) #[[ATTR7]]
850; IS__CGSCC____-NEXT:    unreachable
851; IS__CGSCC____:       f:
852; IS__CGSCC____-NEXT:    unreachable
853; IS__CGSCC____:       ret:
854; IS__CGSCC____-NEXT:    ret void
855;
856  %ptr = alloca i32
857  br i1 %c, label %t, label %f
858t:
859  call void @arg_nonnull_12(i32* %ptr, i32* %ptr, i32* %ptr)
860  call void @arg_nonnull_12(i32* %ptr, i32* %ptr, i32* null)
861  call void @arg_nonnull_12(i32* %ptr, i32* null, i32* %ptr)
862  call void @arg_nonnull_12(i32* %ptr, i32* null, i32* null)
863  br label %ret
864f:
865  call void @arg_nonnull_12(i32* null, i32* %ptr, i32* %ptr)
866  call void @arg_nonnull_12(i32* null, i32* %ptr, i32* null)
867  call void @arg_nonnull_12(i32* null, i32* null, i32* %ptr)
868  call void @arg_nonnull_12(i32* null, i32* null, i32* null)
869  br label %ret
870ret:
871  ret void
872}
873
874define void @arg_nonnull_violation3_2(i1 %c) {
875; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
876; IS__TUNIT____-LABEL: define {{[^@]+}}@arg_nonnull_violation3_2
877; IS__TUNIT____-SAME: (i1 [[C:%.*]]) #[[ATTR0]] {
878; IS__TUNIT____-NEXT:    [[PTR:%.*]] = alloca i32, align 4
879; IS__TUNIT____-NEXT:    br i1 [[C]], label [[T:%.*]], label [[F:%.*]]
880; IS__TUNIT____:       t:
881; IS__TUNIT____-NEXT:    call void @arg_nonnull_12_noundef_2(i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]], i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]], i32* nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]]) #[[ATTR7]]
882; IS__TUNIT____-NEXT:    call void @arg_nonnull_12_noundef_2(i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]], i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]], i32* noalias nocapture nofree noundef writeonly align 4294967296 null) #[[ATTR7]]
883; IS__TUNIT____-NEXT:    unreachable
884; IS__TUNIT____:       f:
885; IS__TUNIT____-NEXT:    unreachable
886; IS__TUNIT____:       ret:
887; IS__TUNIT____-NEXT:    ret void
888;
889; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
890; IS__CGSCC____-LABEL: define {{[^@]+}}@arg_nonnull_violation3_2
891; IS__CGSCC____-SAME: (i1 [[C:%.*]]) #[[ATTR0]] {
892; IS__CGSCC____-NEXT:    [[PTR:%.*]] = alloca i32, align 4
893; IS__CGSCC____-NEXT:    br i1 [[C]], label [[T:%.*]], label [[F:%.*]]
894; IS__CGSCC____:       t:
895; IS__CGSCC____-NEXT:    call void @arg_nonnull_12_noundef_2(i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]], i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]], i32* nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]]) #[[ATTR7]]
896; IS__CGSCC____-NEXT:    call void @arg_nonnull_12_noundef_2(i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]], i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[PTR]], i32* noalias nocapture nofree noundef writeonly align 4294967296 null) #[[ATTR7]]
897; IS__CGSCC____-NEXT:    unreachable
898; IS__CGSCC____:       f:
899; IS__CGSCC____-NEXT:    unreachable
900; IS__CGSCC____:       ret:
901; IS__CGSCC____-NEXT:    ret void
902;
903  %ptr = alloca i32
904  br i1 %c, label %t, label %f
905t:
906  call void @arg_nonnull_12_noundef_2(i32* %ptr, i32* %ptr, i32* %ptr)
907  call void @arg_nonnull_12_noundef_2(i32* %ptr, i32* %ptr, i32* null)
908  call void @arg_nonnull_12_noundef_2(i32* %ptr, i32* null, i32* %ptr)
909  call void @arg_nonnull_12_noundef_2(i32* %ptr, i32* null, i32* null)
910  br label %ret
911f:
912  call void @arg_nonnull_12_noundef_2(i32* null, i32* %ptr, i32* %ptr)
913  call void @arg_nonnull_12_noundef_2(i32* null, i32* %ptr, i32* null)
914  call void @arg_nonnull_12_noundef_2(i32* null, i32* null, i32* %ptr)
915  call void @arg_nonnull_12_noundef_2(i32* null, i32* null, i32* null)
916  br label %ret
917ret:
918  ret void
919}
920
921; Tests for returned position
922
923define nonnull i32* @returned_nonnnull(i32 %c) {
924; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
925; IS__TUNIT____-LABEL: define {{[^@]+}}@returned_nonnnull
926; IS__TUNIT____-SAME: (i32 [[C:%.*]]) #[[ATTR0]] {
927; IS__TUNIT____-NEXT:    switch i32 [[C]], label [[ONDEFAULT:%.*]] [
928; IS__TUNIT____-NEXT:    i32 0, label [[ONZERO:%.*]]
929; IS__TUNIT____-NEXT:    i32 1, label [[ONONE:%.*]]
930; IS__TUNIT____-NEXT:    ]
931; IS__TUNIT____:       onzero:
932; IS__TUNIT____-NEXT:    [[PTR:%.*]] = alloca i32, align 4
933; IS__TUNIT____-NEXT:    ret i32* [[PTR]]
934; IS__TUNIT____:       onone:
935; IS__TUNIT____-NEXT:    ret i32* null
936; IS__TUNIT____:       ondefault:
937; IS__TUNIT____-NEXT:    ret i32* undef
938;
939; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
940; IS__CGSCC____-LABEL: define {{[^@]+}}@returned_nonnnull
941; IS__CGSCC____-SAME: (i32 [[C:%.*]]) #[[ATTR0]] {
942; IS__CGSCC____-NEXT:    switch i32 [[C]], label [[ONDEFAULT:%.*]] [
943; IS__CGSCC____-NEXT:    i32 0, label [[ONZERO:%.*]]
944; IS__CGSCC____-NEXT:    i32 1, label [[ONONE:%.*]]
945; IS__CGSCC____-NEXT:    ]
946; IS__CGSCC____:       onzero:
947; IS__CGSCC____-NEXT:    [[PTR:%.*]] = alloca i32, align 4
948; IS__CGSCC____-NEXT:    ret i32* [[PTR]]
949; IS__CGSCC____:       onone:
950; IS__CGSCC____-NEXT:    ret i32* null
951; IS__CGSCC____:       ondefault:
952; IS__CGSCC____-NEXT:    ret i32* undef
953;
954  switch i32 %c, label %ondefault [ i32 0, label %onzero
955  i32 1, label %onone ]
956onzero:
957  %ptr = alloca i32
958  ret i32* %ptr
959onone:
960  ret i32* null
961ondefault:
962  ret i32* undef
963}
964
965define noundef i32* @returned_noundef(i32 %c) {
966; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
967; IS__TUNIT____-LABEL: define {{[^@]+}}@returned_noundef
968; IS__TUNIT____-SAME: (i32 [[C:%.*]]) #[[ATTR0]] {
969; IS__TUNIT____-NEXT:    switch i32 [[C]], label [[ONDEFAULT:%.*]] [
970; IS__TUNIT____-NEXT:    i32 0, label [[ONZERO:%.*]]
971; IS__TUNIT____-NEXT:    i32 1, label [[ONONE:%.*]]
972; IS__TUNIT____-NEXT:    ]
973; IS__TUNIT____:       onzero:
974; IS__TUNIT____-NEXT:    [[PTR:%.*]] = alloca i32, align 4
975; IS__TUNIT____-NEXT:    ret i32* [[PTR]]
976; IS__TUNIT____:       onone:
977; IS__TUNIT____-NEXT:    ret i32* null
978; IS__TUNIT____:       ondefault:
979; IS__TUNIT____-NEXT:    unreachable
980;
981; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
982; IS__CGSCC____-LABEL: define {{[^@]+}}@returned_noundef
983; IS__CGSCC____-SAME: (i32 [[C:%.*]]) #[[ATTR0]] {
984; IS__CGSCC____-NEXT:    switch i32 [[C]], label [[ONDEFAULT:%.*]] [
985; IS__CGSCC____-NEXT:    i32 0, label [[ONZERO:%.*]]
986; IS__CGSCC____-NEXT:    i32 1, label [[ONONE:%.*]]
987; IS__CGSCC____-NEXT:    ]
988; IS__CGSCC____:       onzero:
989; IS__CGSCC____-NEXT:    [[PTR:%.*]] = alloca i32, align 4
990; IS__CGSCC____-NEXT:    ret i32* [[PTR]]
991; IS__CGSCC____:       onone:
992; IS__CGSCC____-NEXT:    ret i32* null
993; IS__CGSCC____:       ondefault:
994; IS__CGSCC____-NEXT:    unreachable
995;
996  switch i32 %c, label %ondefault [ i32 0, label %onzero
997  i32 1, label %onone ]
998onzero:
999  %ptr = alloca i32
1000  ret i32* %ptr
1001onone:
1002  ret i32* null
1003ondefault:
1004  ret i32* undef
1005}
1006
1007define nonnull noundef i32* @returned_nonnnull_noundef(i32 %c) {
1008; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
1009; IS__TUNIT____-LABEL: define {{[^@]+}}@returned_nonnnull_noundef
1010; IS__TUNIT____-SAME: (i32 [[C:%.*]]) #[[ATTR0]] {
1011; IS__TUNIT____-NEXT:    switch i32 [[C]], label [[ONDEFAULT:%.*]] [
1012; IS__TUNIT____-NEXT:    i32 0, label [[ONZERO:%.*]]
1013; IS__TUNIT____-NEXT:    i32 1, label [[ONONE:%.*]]
1014; IS__TUNIT____-NEXT:    ]
1015; IS__TUNIT____:       onzero:
1016; IS__TUNIT____-NEXT:    [[PTR:%.*]] = alloca i32, align 4
1017; IS__TUNIT____-NEXT:    ret i32* [[PTR]]
1018; IS__TUNIT____:       onone:
1019; IS__TUNIT____-NEXT:    unreachable
1020; IS__TUNIT____:       ondefault:
1021; IS__TUNIT____-NEXT:    unreachable
1022;
1023; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
1024; IS__CGSCC____-LABEL: define {{[^@]+}}@returned_nonnnull_noundef
1025; IS__CGSCC____-SAME: (i32 [[C:%.*]]) #[[ATTR0]] {
1026; IS__CGSCC____-NEXT:    switch i32 [[C]], label [[ONDEFAULT:%.*]] [
1027; IS__CGSCC____-NEXT:    i32 0, label [[ONZERO:%.*]]
1028; IS__CGSCC____-NEXT:    i32 1, label [[ONONE:%.*]]
1029; IS__CGSCC____-NEXT:    ]
1030; IS__CGSCC____:       onzero:
1031; IS__CGSCC____-NEXT:    [[PTR:%.*]] = alloca i32, align 4
1032; IS__CGSCC____-NEXT:    ret i32* [[PTR]]
1033; IS__CGSCC____:       onone:
1034; IS__CGSCC____-NEXT:    unreachable
1035; IS__CGSCC____:       ondefault:
1036; IS__CGSCC____-NEXT:    unreachable
1037;
1038  switch i32 %c, label %ondefault [ i32 0, label %onzero
1039  i32 1, label %onone ]
1040onzero:
1041  %ptr = alloca i32
1042  ret i32* %ptr
1043onone:
1044  ret i32* null
1045ondefault:
1046  ret i32* undef
1047}
1048
1049define noundef i32 @returned_nonnnull_noundef_int() {
1050; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
1051; IS__TUNIT____-LABEL: define {{[^@]+}}@returned_nonnnull_noundef_int
1052; IS__TUNIT____-SAME: () #[[ATTR0]] {
1053; IS__TUNIT____-NEXT:    ret i32 0
1054;
1055; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
1056; IS__CGSCC____-LABEL: define {{[^@]+}}@returned_nonnnull_noundef_int
1057; IS__CGSCC____-SAME: () #[[ATTR0]] {
1058; IS__CGSCC____-NEXT:    ret i32 0
1059;
1060  ret i32 0
1061}
1062
1063declare void @callee_int_arg(i32)
1064
1065define void @callsite_noundef_1() {
1066; CHECK-LABEL: define {{[^@]+}}@callsite_noundef_1() {
1067; CHECK-NEXT:    call void @callee_int_arg(i32 noundef 0)
1068; CHECK-NEXT:    ret void
1069;
1070  call void @callee_int_arg(i32 noundef 0)
1071  ret void
1072}
1073
1074declare void @callee_ptr_arg(i32*)
1075
1076define void @callsite_noundef_2() {
1077; CHECK-LABEL: define {{[^@]+}}@callsite_noundef_2() {
1078; CHECK-NEXT:    unreachable
1079;
1080  call void @callee_ptr_arg(i32* noundef undef)
1081  ret void
1082}
1083
1084define i32 @argument_noundef1(i32 noundef %c) {
1085; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
1086; IS__TUNIT____-LABEL: define {{[^@]+}}@argument_noundef1
1087; IS__TUNIT____-SAME: (i32 noundef returned [[C:%.*]]) #[[ATTR0]] {
1088; IS__TUNIT____-NEXT:    ret i32 [[C]]
1089;
1090; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
1091; IS__CGSCC____-LABEL: define {{[^@]+}}@argument_noundef1
1092; IS__CGSCC____-SAME: (i32 noundef returned [[C:%.*]]) #[[ATTR0]] {
1093; IS__CGSCC____-NEXT:    ret i32 [[C]]
1094;
1095  ret i32 %c
1096}
1097
1098define i32 @violate_noundef_nonpointer() {
1099; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
1100; IS__TUNIT____-LABEL: define {{[^@]+}}@violate_noundef_nonpointer
1101; IS__TUNIT____-SAME: () #[[ATTR0]] {
1102; IS__TUNIT____-NEXT:    ret i32 undef
1103;
1104; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
1105; IS__CGSCC____-LABEL: define {{[^@]+}}@violate_noundef_nonpointer
1106; IS__CGSCC____-SAME: () #[[ATTR0]] {
1107; IS__CGSCC____-NEXT:    ret i32 undef
1108;
1109  %ret = call i32 @argument_noundef1(i32 undef)
1110  ret i32 %ret
1111}
1112
1113define i32* @argument_noundef2(i32* noundef %c) {
1114; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
1115; IS__TUNIT____-LABEL: define {{[^@]+}}@argument_noundef2
1116; IS__TUNIT____-SAME: (i32* nofree noundef readnone returned "no-capture-maybe-returned" [[C:%.*]]) #[[ATTR0]] {
1117; IS__TUNIT____-NEXT:    ret i32* [[C]]
1118;
1119; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
1120; IS__CGSCC____-LABEL: define {{[^@]+}}@argument_noundef2
1121; IS__CGSCC____-SAME: (i32* nofree noundef readnone returned "no-capture-maybe-returned" [[C:%.*]]) #[[ATTR0]] {
1122; IS__CGSCC____-NEXT:    ret i32* [[C]]
1123;
1124  ret i32* %c
1125}
1126
1127define i32* @violate_noundef_pointer() {
1128; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
1129; IS__TUNIT____-LABEL: define {{[^@]+}}@violate_noundef_pointer
1130; IS__TUNIT____-SAME: () #[[ATTR0]] {
1131; IS__TUNIT____-NEXT:    ret i32* undef
1132;
1133; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
1134; IS__CGSCC____-LABEL: define {{[^@]+}}@violate_noundef_pointer
1135; IS__CGSCC____-SAME: () #[[ATTR0]] {
1136; IS__CGSCC____-NEXT:    ret i32* undef
1137;
1138  %ret = call i32* @argument_noundef2(i32* undef)
1139  ret i32* %ret
1140}
1141;.
1142; IS__TUNIT____: attributes #[[ATTR0]] = { nofree nosync nounwind readnone willreturn }
1143; IS__TUNIT____: attributes #[[ATTR1]] = { nofree nosync nounwind null_pointer_is_valid readnone willreturn }
1144; IS__TUNIT____: attributes #[[ATTR2]] = { nofree nounwind readnone willreturn }
1145; IS__TUNIT____: attributes #[[ATTR3]] = { nofree nosync nounwind null_pointer_is_valid willreturn writeonly }
1146; IS__TUNIT____: attributes #[[ATTR4]] = { nofree nounwind null_pointer_is_valid willreturn }
1147; IS__TUNIT____: attributes #[[ATTR5]] = { nofree noreturn nosync nounwind readnone willreturn }
1148; IS__TUNIT____: attributes #[[ATTR6]] = { argmemonly nofree nosync nounwind willreturn writeonly }
1149; IS__TUNIT____: attributes #[[ATTR7]] = { nofree nosync nounwind willreturn writeonly }
1150;.
1151; IS__CGSCC____: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind readnone willreturn }
1152; IS__CGSCC____: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind null_pointer_is_valid readnone willreturn }
1153; IS__CGSCC____: attributes #[[ATTR2]] = { nofree norecurse nounwind readnone willreturn }
1154; IS__CGSCC____: attributes #[[ATTR3]] = { nofree norecurse nosync nounwind null_pointer_is_valid willreturn writeonly }
1155; IS__CGSCC____: attributes #[[ATTR4]] = { nofree norecurse nounwind null_pointer_is_valid willreturn }
1156; IS__CGSCC____: attributes #[[ATTR5]] = { nofree norecurse noreturn nosync nounwind readnone willreturn }
1157; IS__CGSCC____: attributes #[[ATTR6]] = { argmemonly nofree norecurse nosync nounwind willreturn writeonly }
1158; IS__CGSCC____: attributes #[[ATTR7]] = { nounwind willreturn writeonly }
1159;.
1160