1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes
2; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal  -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=17 -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=17 -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; Test1: Replace argument with constant
13define internal void @test1(i32 %a) {
14; CHECK-LABEL: define {{[^@]+}}@test1() {
15; CHECK-NEXT:    tail call void @f(i32 noundef 1)
16; CHECK-NEXT:    ret void
17;
18  tail call void @f(i32 %a)
19  ret void
20}
21
22define void @test1_helper() {
23; CHECK-LABEL: define {{[^@]+}}@test1_helper() {
24; CHECK-NEXT:    tail call void @test1()
25; CHECK-NEXT:    ret void
26;
27  tail call void @test1(i32 1)
28  ret void
29}
30
31; TEST 2 : Simplify return value
32define i32 @return0() {
33; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
34; IS__TUNIT____-LABEL: define {{[^@]+}}@return0
35; IS__TUNIT____-SAME: () [[ATTR1:#.*]] {
36; IS__TUNIT____-NEXT:    ret i32 0
37;
38; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
39; IS__CGSCC____-LABEL: define {{[^@]+}}@return0
40; IS__CGSCC____-SAME: () [[ATTR1:#.*]] {
41; IS__CGSCC____-NEXT:    ret i32 0
42;
43  ret i32 0
44}
45
46define i32 @return1() {
47; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
48; IS__TUNIT____-LABEL: define {{[^@]+}}@return1
49; IS__TUNIT____-SAME: () [[ATTR1]] {
50; IS__TUNIT____-NEXT:    ret i32 1
51;
52; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
53; IS__CGSCC____-LABEL: define {{[^@]+}}@return1
54; IS__CGSCC____-SAME: () [[ATTR1]] {
55; IS__CGSCC____-NEXT:    ret i32 1
56;
57  ret i32 1
58}
59
60define i32 @test2_1(i1 %c) {
61; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
62; IS__TUNIT____-LABEL: define {{[^@]+}}@test2_1
63; IS__TUNIT____-SAME: (i1 [[C:%.*]]) [[ATTR1]] {
64; IS__TUNIT____-NEXT:    br i1 [[C]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
65; IS__TUNIT____:       if.true:
66; IS__TUNIT____-NEXT:    [[RET0:%.*]] = add i32 0, 1
67; IS__TUNIT____-NEXT:    br label [[END:%.*]]
68; IS__TUNIT____:       if.false:
69; IS__TUNIT____-NEXT:    br label [[END]]
70; IS__TUNIT____:       end:
71; IS__TUNIT____-NEXT:    [[RET:%.*]] = phi i32 [ [[RET0]], [[IF_TRUE]] ], [ 1, [[IF_FALSE]] ]
72; IS__TUNIT____-NEXT:    ret i32 1
73;
74; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
75; IS__CGSCC____-LABEL: define {{[^@]+}}@test2_1
76; IS__CGSCC____-SAME: (i1 [[C:%.*]]) [[ATTR1]] {
77; IS__CGSCC____-NEXT:    br i1 [[C]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
78; IS__CGSCC____:       if.true:
79; IS__CGSCC____-NEXT:    [[RET0:%.*]] = add i32 0, 1
80; IS__CGSCC____-NEXT:    br label [[END:%.*]]
81; IS__CGSCC____:       if.false:
82; IS__CGSCC____-NEXT:    br label [[END]]
83; IS__CGSCC____:       end:
84; IS__CGSCC____-NEXT:    [[RET:%.*]] = phi i32 [ [[RET0]], [[IF_TRUE]] ], [ 1, [[IF_FALSE]] ]
85; IS__CGSCC____-NEXT:    ret i32 1
86;
87  br i1 %c, label %if.true, label %if.false
88if.true:
89  %call = tail call i32 @return0()
90  %ret0 = add i32 %call, 1
91  br label %end
92if.false:
93  %ret1 = tail call i32 @return1()
94  br label %end
95end:
96
97  %ret = phi i32 [ %ret0, %if.true ], [ %ret1, %if.false ]
98
99  ret i32 1
100}
101
102
103
104define i32 @test2_2(i1 %c) {
105; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
106; IS__TUNIT____-LABEL: define {{[^@]+}}@test2_2
107; IS__TUNIT____-SAME: (i1 [[C:%.*]]) [[ATTR1]] {
108; IS__TUNIT____-NEXT:    ret i32 1
109;
110; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
111; IS__CGSCC____-LABEL: define {{[^@]+}}@test2_2
112; IS__CGSCC____-SAME: (i1 [[C:%.*]]) [[ATTR1]] {
113; IS__CGSCC____-NEXT:    ret i32 1
114;
115  %ret = tail call i32 @test2_1(i1 %c)
116  ret i32 %ret
117}
118
119declare void @use(i32)
120define void @test3(i1 %c) {
121; CHECK-LABEL: define {{[^@]+}}@test3
122; CHECK-SAME: (i1 [[C:%.*]]) {
123; CHECK-NEXT:    br i1 [[C]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
124; CHECK:       if.true:
125; CHECK-NEXT:    br label [[END:%.*]]
126; CHECK:       if.false:
127; CHECK-NEXT:    br label [[END]]
128; CHECK:       end:
129; CHECK-NEXT:    [[R:%.*]] = phi i32 [ 1, [[IF_TRUE]] ], [ 1, [[IF_FALSE]] ]
130; CHECK-NEXT:    tail call void @use(i32 noundef 1)
131; CHECK-NEXT:    ret void
132;
133  br i1 %c, label %if.true, label %if.false
134if.true:
135  br label %end
136if.false:
137  %ret1 = tail call i32 @return1()
138  br label %end
139end:
140
141  %r = phi i32 [ 1, %if.true ], [ %ret1, %if.false ]
142
143  tail call void @use(i32 %r)
144  ret void
145}
146
147define void @test-select-phi(i1 %c) {
148; CHECK-LABEL: define {{[^@]+}}@test-select-phi
149; CHECK-SAME: (i1 [[C:%.*]]) {
150; CHECK-NEXT:    tail call void @use(i32 noundef 1)
151; CHECK-NEXT:    [[SELECT_NOT_SAME:%.*]] = select i1 [[C]], i32 1, i32 0
152; CHECK-NEXT:    tail call void @use(i32 noundef [[SELECT_NOT_SAME]])
153; CHECK-NEXT:    br i1 [[C]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
154; CHECK:       if-true:
155; CHECK-NEXT:    br label [[END:%.*]]
156; CHECK:       if-false:
157; CHECK-NEXT:    br label [[END]]
158; CHECK:       end:
159; CHECK-NEXT:    [[PHI_SAME:%.*]] = phi i32 [ 1, [[IF_TRUE]] ], [ 1, [[IF_FALSE]] ]
160; CHECK-NEXT:    [[PHI_NOT_SAME:%.*]] = phi i32 [ 0, [[IF_TRUE]] ], [ 1, [[IF_FALSE]] ]
161; CHECK-NEXT:    [[PHI_SAME_PROP:%.*]] = phi i32 [ 1, [[IF_TRUE]] ], [ 1, [[IF_FALSE]] ]
162; CHECK-NEXT:    [[PHI_SAME_UNDEF:%.*]] = phi i32 [ 1, [[IF_TRUE]] ], [ undef, [[IF_FALSE]] ]
163; CHECK-NEXT:    [[SELECT_NOT_SAME_UNDEF:%.*]] = select i1 [[C]], i32 [[PHI_NOT_SAME]], i32 undef
164; CHECK-NEXT:    tail call void @use(i32 noundef 1)
165; CHECK-NEXT:    tail call void @use(i32 noundef [[PHI_NOT_SAME]])
166; CHECK-NEXT:    tail call void @use(i32 noundef 1)
167; CHECK-NEXT:    tail call void @use(i32 1)
168; CHECK-NEXT:    tail call void @use(i32 [[SELECT_NOT_SAME_UNDEF]])
169; CHECK-NEXT:    ret void
170;
171  %select-same = select i1 %c, i32 1, i32 1
172  tail call void @use(i32 %select-same)
173
174  %select-not-same = select i1 %c, i32 1, i32 0
175  tail call void @use(i32 %select-not-same)
176  br i1 %c, label %if-true, label %if-false
177if-true:
178  br label %end
179if-false:
180  br label %end
181end:
182  %phi-same = phi i32 [ 1, %if-true ], [ 1, %if-false ]
183  %phi-not-same = phi i32 [ 0, %if-true ], [ 1, %if-false ]
184  %phi-same-prop = phi i32 [ 1, %if-true ], [ %select-same, %if-false ]
185  %phi-same-undef = phi i32 [ 1, %if-true ], [ undef, %if-false ]
186  %select-not-same-undef = select i1 %c, i32 %phi-not-same, i32 undef
187
188
189  tail call void @use(i32 %phi-same)
190
191  tail call void @use(i32 %phi-not-same)
192
193  tail call void @use(i32 %phi-same-prop)
194
195  tail call void @use(i32 %phi-same-undef)
196
197  tail call void @use(i32 %select-not-same-undef)
198
199  ret void
200
201}
202
203define i32 @ipccp1(i32 %a) {
204; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
205; IS__TUNIT____-LABEL: define {{[^@]+}}@ipccp1
206; IS__TUNIT____-SAME: (i32 returned [[A:%.*]]) [[ATTR1]] {
207; IS__TUNIT____-NEXT:    br i1 true, label [[T:%.*]], label [[F:%.*]]
208; IS__TUNIT____:       t:
209; IS__TUNIT____-NEXT:    ret i32 [[A]]
210; IS__TUNIT____:       f:
211; IS__TUNIT____-NEXT:    unreachable
212;
213; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
214; IS__CGSCC____-LABEL: define {{[^@]+}}@ipccp1
215; IS__CGSCC____-SAME: (i32 returned [[A:%.*]]) [[ATTR1]] {
216; IS__CGSCC____-NEXT:    br i1 true, label [[T:%.*]], label [[F:%.*]]
217; IS__CGSCC____:       t:
218; IS__CGSCC____-NEXT:    ret i32 [[A]]
219; IS__CGSCC____:       f:
220; IS__CGSCC____-NEXT:    unreachable
221;
222  br i1 true, label %t, label %f
223t:
224  ret i32 %a
225f:
226  %r = call i32 @ipccp1(i32 5)
227  ret i32 %r
228}
229
230define internal i1 @ipccp2i(i1 %a) {
231; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
232; IS__CGSCC____-LABEL: define {{[^@]+}}@ipccp2i
233; IS__CGSCC____-SAME: () [[ATTR1]] {
234; IS__CGSCC____-NEXT:    br label [[T:%.*]]
235; IS__CGSCC____:       t:
236; IS__CGSCC____-NEXT:    ret i1 undef
237; IS__CGSCC____:       f:
238; IS__CGSCC____-NEXT:    unreachable
239;
240  br i1 %a, label %t, label %f
241t:
242  ret i1 %a
243f:
244  %r = call i1 @ipccp2i(i1 false)
245  ret i1 %r
246}
247
248define i1 @ipccp2() {
249; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
250; IS__TUNIT____-LABEL: define {{[^@]+}}@ipccp2
251; IS__TUNIT____-SAME: () [[ATTR1]] {
252; IS__TUNIT____-NEXT:    ret i1 true
253;
254; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
255; IS__CGSCC____-LABEL: define {{[^@]+}}@ipccp2
256; IS__CGSCC____-SAME: () [[ATTR1]] {
257; IS__CGSCC____-NEXT:    ret i1 true
258;
259  %r = call i1 @ipccp2i(i1 true)
260  ret i1 %r
261}
262
263define internal i1 @ipccp2ib(i1 %a) {
264; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
265; IS__CGSCC____-LABEL: define {{[^@]+}}@ipccp2ib
266; IS__CGSCC____-SAME: () [[ATTR1]] {
267; IS__CGSCC____-NEXT:    br label [[T:%.*]]
268; IS__CGSCC____:       t:
269; IS__CGSCC____-NEXT:    ret i1 undef
270; IS__CGSCC____:       f:
271; IS__CGSCC____-NEXT:    unreachable
272;
273  br i1 %a, label %t, label %f
274t:
275  ret i1 true
276f:
277  %r = call i1 @ipccp2ib(i1 false)
278  ret i1 %r
279}
280
281define i1 @ipccp2b() {
282; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
283; IS__TUNIT____-LABEL: define {{[^@]+}}@ipccp2b
284; IS__TUNIT____-SAME: () [[ATTR1]] {
285; IS__TUNIT____-NEXT:    ret i1 true
286;
287; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
288; IS__CGSCC____-LABEL: define {{[^@]+}}@ipccp2b
289; IS__CGSCC____-SAME: () [[ATTR1]] {
290; IS__CGSCC____-NEXT:    ret i1 true
291;
292  %r = call i1 @ipccp2ib(i1 true)
293  ret i1 %r
294}
295
296define internal i32 @ipccp3i(i32 %a) {
297; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
298; IS__CGSCC____-LABEL: define {{[^@]+}}@ipccp3i
299; IS__CGSCC____-SAME: () [[ATTR1]] {
300; IS__CGSCC____-NEXT:    br label [[T:%.*]]
301; IS__CGSCC____:       t:
302; IS__CGSCC____-NEXT:    ret i32 undef
303; IS__CGSCC____:       f:
304; IS__CGSCC____-NEXT:    unreachable
305;
306  %c = icmp eq i32 %a, 7
307  br i1 %c, label %t, label %f
308t:
309  ret i32 %a
310f:
311  %r = call i32 @ipccp3i(i32 5)
312  ret i32 %r
313}
314
315define i32 @ipccp3() {
316; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
317; IS__TUNIT____-LABEL: define {{[^@]+}}@ipccp3
318; IS__TUNIT____-SAME: () [[ATTR1]] {
319; IS__TUNIT____-NEXT:    ret i32 7
320;
321; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
322; IS__CGSCC____-LABEL: define {{[^@]+}}@ipccp3
323; IS__CGSCC____-SAME: () [[ATTR1]] {
324; IS__CGSCC____-NEXT:    ret i32 7
325;
326  %r = call i32 @ipccp3i(i32 7)
327  ret i32 %r
328}
329
330; Do not touch complicated arguments (for now)
331%struct.X = type { i8* }
332define internal i32* @test_inalloca(i32* inalloca %a) {
333; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
334; IS__TUNIT____-LABEL: define {{[^@]+}}@test_inalloca
335; IS__TUNIT____-SAME: (i32* inalloca noalias nofree nonnull returned writeonly dereferenceable(4) "no-capture-maybe-returned" [[A:%.*]]) [[ATTR1]] {
336; IS__TUNIT____-NEXT:    ret i32* [[A]]
337;
338; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
339; IS__CGSCC____-LABEL: define {{[^@]+}}@test_inalloca
340; IS__CGSCC____-SAME: (i32* inalloca noalias nofree noundef nonnull returned writeonly dereferenceable(4) "no-capture-maybe-returned" [[A:%.*]]) [[ATTR1]] {
341; IS__CGSCC____-NEXT:    ret i32* [[A]]
342;
343  ret i32* %a
344}
345define i32* @complicated_args_inalloca(i32* %arg) {
346; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
347; IS__TUNIT____-LABEL: define {{[^@]+}}@complicated_args_inalloca
348; IS__TUNIT____-SAME: (i32* nofree readnone returned "no-capture-maybe-returned" [[ARG:%.*]]) [[ATTR1]] {
349; IS__TUNIT____-NEXT:    [[CALL:%.*]] = call i32* @test_inalloca(i32* noalias nofree writeonly "no-capture-maybe-returned" [[ARG]]) [[ATTR1]]
350; IS__TUNIT____-NEXT:    ret i32* [[CALL]]
351;
352; IS__CGSCC_OPM: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
353; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@complicated_args_inalloca
354; IS__CGSCC_OPM-SAME: (i32* nofree noundef nonnull readnone returned dereferenceable(4) "no-capture-maybe-returned" [[ARG:%.*]]) [[ATTR1:#.*]] {
355; IS__CGSCC_OPM-NEXT:    [[CALL:%.*]] = call i32* @test_inalloca(i32* noalias nofree noundef nonnull writeonly dereferenceable(4) "no-capture-maybe-returned" [[ARG]]) [[ATTR5:#.*]]
356; IS__CGSCC_OPM-NEXT:    ret i32* [[CALL]]
357;
358; IS__CGSCC_NPM: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
359; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@complicated_args_inalloca
360; IS__CGSCC_NPM-SAME: (i32* nofree noundef nonnull readnone returned dereferenceable(4) "no-capture-maybe-returned" [[ARG:%.*]]) [[ATTR1:#.*]] {
361; IS__CGSCC_NPM-NEXT:    [[CALL:%.*]] = call i32* @test_inalloca(i32* noalias nofree noundef nonnull writeonly dereferenceable(4) "no-capture-maybe-returned" [[ARG]]) [[ATTR4:#.*]]
362; IS__CGSCC_NPM-NEXT:    ret i32* [[CALL]]
363;
364  %call = call i32* @test_inalloca(i32* %arg)
365  ret i32* %call
366}
367
368define internal i32* @test_preallocated(i32* preallocated(i32) %a) {
369; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
370; IS__TUNIT____-LABEL: define {{[^@]+}}@test_preallocated
371; IS__TUNIT____-SAME: (i32* noalias nofree noundef nonnull returned writeonly preallocated(i32) align 536870912 dereferenceable(4) "no-capture-maybe-returned" [[A:%.*]]) [[ATTR1]] {
372; IS__TUNIT____-NEXT:    ret i32* [[A]]
373;
374; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
375; IS__CGSCC____-LABEL: define {{[^@]+}}@test_preallocated
376; IS__CGSCC____-SAME: (i32* noalias nofree noundef nonnull returned writeonly preallocated(i32) align 536870912 dereferenceable(4) "no-capture-maybe-returned" [[A:%.*]]) [[ATTR1]] {
377; IS__CGSCC____-NEXT:    ret i32* [[A]]
378;
379  ret i32* %a
380}
381define i32* @complicated_args_preallocated() {
382; IS__TUNIT_OPM: Function Attrs: nofree nosync nounwind willreturn
383; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@complicated_args_preallocated
384; IS__TUNIT_OPM-SAME: () [[ATTR0:#.*]] {
385; IS__TUNIT_OPM-NEXT:    [[C:%.*]] = call token @llvm.call.preallocated.setup(i32 noundef 1) [[ATTR5:#.*]]
386; IS__TUNIT_OPM-NEXT:    [[CALL:%.*]] = call i32* @test_preallocated(i32* noalias nocapture nofree noundef writeonly preallocated(i32) align 536870912 null) [[ATTR1:#.*]] [ "preallocated"(token [[C]]) ]
387; IS__TUNIT_OPM-NEXT:    ret i32* [[CALL]]
388;
389; IS__TUNIT_NPM: Function Attrs: nofree nosync nounwind willreturn
390; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@complicated_args_preallocated
391; IS__TUNIT_NPM-SAME: () [[ATTR0:#.*]] {
392; IS__TUNIT_NPM-NEXT:    [[C:%.*]] = call token @llvm.call.preallocated.setup(i32 noundef 1) [[ATTR4:#.*]]
393; IS__TUNIT_NPM-NEXT:    [[CALL:%.*]] = call i32* @test_preallocated(i32* noalias nocapture nofree noundef writeonly preallocated(i32) align 536870912 null) [[ATTR1:#.*]] [ "preallocated"(token [[C]]) ]
394; IS__TUNIT_NPM-NEXT:    ret i32* [[CALL]]
395;
396; IS__CGSCC_OPM: Function Attrs: nofree nosync nounwind willreturn
397; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@complicated_args_preallocated
398; IS__CGSCC_OPM-SAME: () [[ATTR0:#.*]] {
399; IS__CGSCC_OPM-NEXT:    [[C:%.*]] = call token @llvm.call.preallocated.setup(i32 noundef 1) [[ATTR5]]
400; IS__CGSCC_OPM-NEXT:    [[CALL:%.*]] = call i32* @test_preallocated(i32* noalias nocapture nofree noundef writeonly preallocated(i32) align 536870912 null) [[ATTR6:#.*]] [ "preallocated"(token [[C]]) ]
401; IS__CGSCC_OPM-NEXT:    ret i32* [[CALL]]
402;
403; IS__CGSCC_NPM: Function Attrs: nofree nosync nounwind willreturn
404; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@complicated_args_preallocated
405; IS__CGSCC_NPM-SAME: () [[ATTR0:#.*]] {
406; IS__CGSCC_NPM-NEXT:    [[C:%.*]] = call token @llvm.call.preallocated.setup(i32 noundef 1) [[ATTR4]]
407; IS__CGSCC_NPM-NEXT:    [[CALL:%.*]] = call i32* @test_preallocated(i32* noalias nocapture nofree noundef writeonly preallocated(i32) align 536870912 null) [[ATTR5:#.*]] [ "preallocated"(token [[C]]) ]
408; IS__CGSCC_NPM-NEXT:    ret i32* [[CALL]]
409;
410  %c = call token @llvm.call.preallocated.setup(i32 1)
411  %call = call i32* @test_preallocated(i32* preallocated(i32) null) ["preallocated"(token %c)]
412  ret i32* %call
413}
414
415define internal void @test_sret(%struct.X* sret(%struct.X) %a, %struct.X** %b) {
416;
417; IS__TUNIT____: Function Attrs: argmemonly nofree nosync nounwind willreturn writeonly
418; IS__TUNIT____-LABEL: define {{[^@]+}}@test_sret
419; IS__TUNIT____-SAME: (%struct.X* noalias nofree noundef nonnull writeonly sret(%struct.X) align 536870912 dereferenceable(8) [[A:%.*]], %struct.X** nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[B:%.*]]) [[ATTR2:#.*]] {
420; IS__TUNIT____-NEXT:    store %struct.X* [[A]], %struct.X** [[B]], align 8
421; IS__TUNIT____-NEXT:    ret void
422;
423; IS__CGSCC____: Function Attrs: argmemonly nofree norecurse nosync nounwind willreturn writeonly
424; IS__CGSCC____-LABEL: define {{[^@]+}}@test_sret
425; IS__CGSCC____-SAME: (%struct.X* noalias nofree noundef nonnull writeonly sret(%struct.X) align 536870912 dereferenceable(8) [[A:%.*]], %struct.X** nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[B:%.*]]) [[ATTR2:#.*]] {
426; IS__CGSCC____-NEXT:    store %struct.X* [[A]], %struct.X** [[B]], align 8
427; IS__CGSCC____-NEXT:    ret void
428;
429  store %struct.X* %a, %struct.X** %b
430  ret void
431}
432; FIXME: Alignment and dereferenceability are not propagated to the argument
433define void @complicated_args_sret(%struct.X** %b) {
434;
435; IS__TUNIT_OPM: Function Attrs: argmemonly nofree nosync nounwind willreturn writeonly
436; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@complicated_args_sret
437; IS__TUNIT_OPM-SAME: (%struct.X** nocapture nofree writeonly [[B:%.*]]) [[ATTR2:#.*]] {
438; IS__TUNIT_OPM-NEXT:    call void @test_sret(%struct.X* noalias nocapture nofree noundef writeonly align 536870912 null, %struct.X** nocapture nofree writeonly align 8 [[B]]) [[ATTR6:#.*]]
439; IS__TUNIT_OPM-NEXT:    ret void
440;
441; IS__TUNIT_NPM: Function Attrs: argmemonly nofree nosync nounwind willreturn writeonly
442; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@complicated_args_sret
443; IS__TUNIT_NPM-SAME: (%struct.X** nocapture nofree writeonly [[B:%.*]]) [[ATTR2:#.*]] {
444; IS__TUNIT_NPM-NEXT:    call void @test_sret(%struct.X* noalias nocapture nofree noundef writeonly align 536870912 null, %struct.X** nocapture nofree writeonly align 8 [[B]]) [[ATTR5:#.*]]
445; IS__TUNIT_NPM-NEXT:    ret void
446;
447; IS__CGSCC____: Function Attrs: argmemonly nofree norecurse nosync nounwind willreturn writeonly
448; IS__CGSCC____-LABEL: define {{[^@]+}}@complicated_args_sret
449; IS__CGSCC____-SAME: (%struct.X** nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[B:%.*]]) [[ATTR2]] {
450; IS__CGSCC____-NEXT:    unreachable
451;
452  call void @test_sret(%struct.X* null, %struct.X** %b)
453  ret void
454}
455
456define internal %struct.X* @test_nest(%struct.X* nest %a) {
457; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
458; IS__TUNIT____-LABEL: define {{[^@]+}}@test_nest
459; IS__TUNIT____-SAME: (%struct.X* nest noalias nofree noundef readnone returned align 536870912 "no-capture-maybe-returned" [[A:%.*]]) [[ATTR1]] {
460; IS__TUNIT____-NEXT:    ret %struct.X* [[A]]
461;
462; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
463; IS__CGSCC____-LABEL: define {{[^@]+}}@test_nest
464; IS__CGSCC____-SAME: (%struct.X* nest noalias nofree noundef readnone returned align 536870912 "no-capture-maybe-returned" [[A:%.*]]) [[ATTR1]] {
465; IS__CGSCC____-NEXT:    ret %struct.X* [[A]]
466;
467  ret %struct.X* %a
468}
469define %struct.X* @complicated_args_nest() {
470; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
471; IS__TUNIT____-LABEL: define {{[^@]+}}@complicated_args_nest
472; IS__TUNIT____-SAME: () [[ATTR1]] {
473; IS__TUNIT____-NEXT:    [[CALL:%.*]] = call %struct.X* @test_nest(%struct.X* noalias nocapture nofree noundef readnone align 536870912 null) [[ATTR1]]
474; IS__TUNIT____-NEXT:    ret %struct.X* [[CALL]]
475;
476; IS__CGSCC_OPM: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
477; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@complicated_args_nest
478; IS__CGSCC_OPM-SAME: () [[ATTR1]] {
479; IS__CGSCC_OPM-NEXT:    [[CALL:%.*]] = call %struct.X* @test_nest(%struct.X* noalias nocapture nofree noundef readnone align 536870912 null) [[ATTR5]]
480; IS__CGSCC_OPM-NEXT:    ret %struct.X* [[CALL]]
481;
482; IS__CGSCC_NPM: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
483; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@complicated_args_nest
484; IS__CGSCC_NPM-SAME: () [[ATTR1]] {
485; IS__CGSCC_NPM-NEXT:    [[CALL:%.*]] = call %struct.X* @test_nest(%struct.X* noalias nocapture nofree noundef readnone align 536870912 null) [[ATTR4]]
486; IS__CGSCC_NPM-NEXT:    ret %struct.X* [[CALL]]
487;
488  %call = call %struct.X* @test_nest(%struct.X* null)
489  ret %struct.X* %call
490}
491
492@S = external global %struct.X
493define internal void @test_byval(%struct.X* byval(%struct.X) %a) {
494; IS__CGSCC_OPM: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
495; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@test_byval
496; IS__CGSCC_OPM-SAME: (%struct.X* noalias nocapture nofree noundef nonnull writeonly byval(%struct.X) align 8 dereferenceable(8) [[A:%.*]]) [[ATTR1]] {
497; IS__CGSCC_OPM-NEXT:    [[G0:%.*]] = getelementptr [[STRUCT_X:%.*]], %struct.X* [[A]], i32 0, i32 0
498; IS__CGSCC_OPM-NEXT:    store i8* null, i8** [[G0]], align 8
499; IS__CGSCC_OPM-NEXT:    ret void
500;
501; IS__CGSCC_NPM: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
502; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@test_byval
503; IS__CGSCC_NPM-SAME: (i8* noalias nocapture nofree readnone [[TMP0:%.*]]) [[ATTR1]] {
504; IS__CGSCC_NPM-NEXT:    [[A_PRIV:%.*]] = alloca [[STRUCT_X:%.*]], align 8
505; IS__CGSCC_NPM-NEXT:    [[A_PRIV_CAST:%.*]] = bitcast %struct.X* [[A_PRIV]] to i8**
506; IS__CGSCC_NPM-NEXT:    store i8* [[TMP0]], i8** [[A_PRIV_CAST]], align 8
507; IS__CGSCC_NPM-NEXT:    [[G0:%.*]] = getelementptr [[STRUCT_X]], %struct.X* [[A_PRIV]], i32 0, i32 0
508; IS__CGSCC_NPM-NEXT:    store i8* null, i8** [[G0]], align 8
509; IS__CGSCC_NPM-NEXT:    ret void
510;
511  %g0 = getelementptr %struct.X, %struct.X* %a, i32 0, i32 0
512  store i8* null, i8** %g0
513  ret void
514}
515define void @complicated_args_byval() {
516; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
517; IS__TUNIT____-LABEL: define {{[^@]+}}@complicated_args_byval
518; IS__TUNIT____-SAME: () [[ATTR1]] {
519; IS__TUNIT____-NEXT:    ret void
520;
521; IS__CGSCC_OPM: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
522; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@complicated_args_byval
523; IS__CGSCC_OPM-SAME: () [[ATTR1]] {
524; IS__CGSCC_OPM-NEXT:    ret void
525;
526; IS__CGSCC_NPM: Function Attrs: nofree norecurse nosync nounwind readonly willreturn
527; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@complicated_args_byval
528; IS__CGSCC_NPM-SAME: () [[ATTR3:#.*]] {
529; IS__CGSCC_NPM-NEXT:    ret void
530;
531  call void @test_byval(%struct.X* @S)
532  ret void
533}
534
535define internal i8*@test_byval2(%struct.X* byval(%struct.X) %a) {
536; IS__TUNIT____: Function Attrs: nofree nosync nounwind readonly willreturn
537; IS__TUNIT____-LABEL: define {{[^@]+}}@test_byval2
538; IS__TUNIT____-SAME: () [[ATTR3:#.*]] {
539; IS__TUNIT____-NEXT:    [[G0:%.*]] = getelementptr [[STRUCT_X:%.*]], %struct.X* @S, i32 0, i32 0
540; IS__TUNIT____-NEXT:    [[L:%.*]] = load i8*, i8** [[G0]], align 8
541; IS__TUNIT____-NEXT:    ret i8* [[L]]
542;
543; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readonly willreturn
544; IS__CGSCC____-LABEL: define {{[^@]+}}@test_byval2
545; IS__CGSCC____-SAME: () [[ATTR3:#.*]] {
546; IS__CGSCC____-NEXT:    [[G0:%.*]] = getelementptr [[STRUCT_X:%.*]], %struct.X* @S, i32 0, i32 0
547; IS__CGSCC____-NEXT:    [[L:%.*]] = load i8*, i8** [[G0]], align 8
548; IS__CGSCC____-NEXT:    ret i8* [[L]]
549;
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; IS__TUNIT____: Function Attrs: nofree nosync nounwind readonly willreturn
556; IS__TUNIT____-LABEL: define {{[^@]+}}@complicated_args_byval2
557; IS__TUNIT____-SAME: () [[ATTR3]] {
558; IS__TUNIT____-NEXT:    [[C:%.*]] = call i8* @test_byval2() [[ATTR3]]
559; IS__TUNIT____-NEXT:    ret i8* [[C]]
560;
561; IS__CGSCC_OPM: Function Attrs: nofree norecurse nosync nounwind readonly willreturn
562; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@complicated_args_byval2
563; IS__CGSCC_OPM-SAME: () [[ATTR3:#.*]] {
564; IS__CGSCC_OPM-NEXT:    [[C:%.*]] = call i8* @test_byval2() [[ATTR7:#.*]]
565; IS__CGSCC_OPM-NEXT:    ret i8* [[C]]
566;
567; IS__CGSCC_NPM: Function Attrs: nofree norecurse nosync nounwind readonly willreturn
568; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@complicated_args_byval2
569; IS__CGSCC_NPM-SAME: () [[ATTR3]] {
570; IS__CGSCC_NPM-NEXT:    [[C:%.*]] = call i8* @test_byval2() [[ATTR6:#.*]]
571; IS__CGSCC_NPM-NEXT:    ret i8* [[C]]
572;
573  %c = call i8* @test_byval2(%struct.X* @S)
574  ret i8* %c
575}
576
577define void @fixpoint_changed(i32* %p) {
578; IS__TUNIT_OPM: Function Attrs: argmemonly nofree nosync nounwind writeonly
579; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@fixpoint_changed
580; IS__TUNIT_OPM-SAME: (i32* nocapture nofree writeonly [[P:%.*]]) [[ATTR4:#.*]] {
581; IS__TUNIT_OPM-NEXT:  entry:
582; IS__TUNIT_OPM-NEXT:    br label [[FOR_COND:%.*]]
583; IS__TUNIT_OPM:       for.cond:
584; IS__TUNIT_OPM-NEXT:    [[J_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[SW_EPILOG:%.*]] ]
585; IS__TUNIT_OPM-NEXT:    [[CMP:%.*]] = icmp slt i32 [[J_0]], 30
586; IS__TUNIT_OPM-NEXT:    br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
587; IS__TUNIT_OPM:       for.body:
588; IS__TUNIT_OPM-NEXT:    switch i32 [[J_0]], label [[SW_EPILOG]] [
589; IS__TUNIT_OPM-NEXT:    i32 1, label [[SW_BB:%.*]]
590; IS__TUNIT_OPM-NEXT:    ]
591; IS__TUNIT_OPM:       sw.bb:
592; IS__TUNIT_OPM-NEXT:    br label [[SW_EPILOG]]
593; IS__TUNIT_OPM:       sw.epilog:
594; IS__TUNIT_OPM-NEXT:    [[X_0:%.*]] = phi i32 [ 255, [[FOR_BODY]] ], [ 253, [[SW_BB]] ]
595; IS__TUNIT_OPM-NEXT:    store i32 [[X_0]], i32* [[P]], align 4
596; IS__TUNIT_OPM-NEXT:    [[INC]] = add nsw i32 [[J_0]], 1
597; IS__TUNIT_OPM-NEXT:    br label [[FOR_COND]]
598; IS__TUNIT_OPM:       for.end:
599; IS__TUNIT_OPM-NEXT:    ret void
600;
601; IS__TUNIT_NPM: Function Attrs: argmemonly nofree nosync nounwind willreturn writeonly
602; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@fixpoint_changed
603; IS__TUNIT_NPM-SAME: (i32* nocapture nofree writeonly [[P:%.*]]) [[ATTR2]] {
604; IS__TUNIT_NPM-NEXT:  entry:
605; IS__TUNIT_NPM-NEXT:    br label [[FOR_COND:%.*]]
606; IS__TUNIT_NPM:       for.cond:
607; IS__TUNIT_NPM-NEXT:    [[J_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[SW_EPILOG:%.*]] ]
608; IS__TUNIT_NPM-NEXT:    [[CMP:%.*]] = icmp slt i32 [[J_0]], 30
609; IS__TUNIT_NPM-NEXT:    br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
610; IS__TUNIT_NPM:       for.body:
611; IS__TUNIT_NPM-NEXT:    switch i32 [[J_0]], label [[SW_EPILOG]] [
612; IS__TUNIT_NPM-NEXT:    i32 1, label [[SW_BB:%.*]]
613; IS__TUNIT_NPM-NEXT:    ]
614; IS__TUNIT_NPM:       sw.bb:
615; IS__TUNIT_NPM-NEXT:    br label [[SW_EPILOG]]
616; IS__TUNIT_NPM:       sw.epilog:
617; IS__TUNIT_NPM-NEXT:    [[X_0:%.*]] = phi i32 [ 255, [[FOR_BODY]] ], [ 253, [[SW_BB]] ]
618; IS__TUNIT_NPM-NEXT:    store i32 [[X_0]], i32* [[P]], align 4
619; IS__TUNIT_NPM-NEXT:    [[INC]] = add nsw i32 [[J_0]], 1
620; IS__TUNIT_NPM-NEXT:    br label [[FOR_COND]]
621; IS__TUNIT_NPM:       for.end:
622; IS__TUNIT_NPM-NEXT:    ret void
623;
624; IS__CGSCC_OPM: Function Attrs: argmemonly nofree norecurse nosync nounwind writeonly
625; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@fixpoint_changed
626; IS__CGSCC_OPM-SAME: (i32* nocapture nofree writeonly [[P:%.*]]) [[ATTR4:#.*]] {
627; IS__CGSCC_OPM-NEXT:  entry:
628; IS__CGSCC_OPM-NEXT:    br label [[FOR_COND:%.*]]
629; IS__CGSCC_OPM:       for.cond:
630; IS__CGSCC_OPM-NEXT:    [[J_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[SW_EPILOG:%.*]] ]
631; IS__CGSCC_OPM-NEXT:    [[CMP:%.*]] = icmp slt i32 [[J_0]], 30
632; IS__CGSCC_OPM-NEXT:    br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
633; IS__CGSCC_OPM:       for.body:
634; IS__CGSCC_OPM-NEXT:    switch i32 [[J_0]], label [[SW_EPILOG]] [
635; IS__CGSCC_OPM-NEXT:    i32 1, label [[SW_BB:%.*]]
636; IS__CGSCC_OPM-NEXT:    ]
637; IS__CGSCC_OPM:       sw.bb:
638; IS__CGSCC_OPM-NEXT:    br label [[SW_EPILOG]]
639; IS__CGSCC_OPM:       sw.epilog:
640; IS__CGSCC_OPM-NEXT:    [[X_0:%.*]] = phi i32 [ 255, [[FOR_BODY]] ], [ 253, [[SW_BB]] ]
641; IS__CGSCC_OPM-NEXT:    store i32 [[X_0]], i32* [[P]], align 4
642; IS__CGSCC_OPM-NEXT:    [[INC]] = add nsw i32 [[J_0]], 1
643; IS__CGSCC_OPM-NEXT:    br label [[FOR_COND]]
644; IS__CGSCC_OPM:       for.end:
645; IS__CGSCC_OPM-NEXT:    ret void
646;
647; IS__CGSCC_NPM: Function Attrs: argmemonly nofree norecurse nosync nounwind willreturn writeonly
648; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@fixpoint_changed
649; IS__CGSCC_NPM-SAME: (i32* nocapture nofree writeonly [[P:%.*]]) [[ATTR2:#.*]] {
650; IS__CGSCC_NPM-NEXT:  entry:
651; IS__CGSCC_NPM-NEXT:    br label [[FOR_COND:%.*]]
652; IS__CGSCC_NPM:       for.cond:
653; IS__CGSCC_NPM-NEXT:    [[J_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[SW_EPILOG:%.*]] ]
654; IS__CGSCC_NPM-NEXT:    [[CMP:%.*]] = icmp slt i32 [[J_0]], 30
655; IS__CGSCC_NPM-NEXT:    br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
656; IS__CGSCC_NPM:       for.body:
657; IS__CGSCC_NPM-NEXT:    switch i32 [[J_0]], label [[SW_EPILOG]] [
658; IS__CGSCC_NPM-NEXT:    i32 1, label [[SW_BB:%.*]]
659; IS__CGSCC_NPM-NEXT:    ]
660; IS__CGSCC_NPM:       sw.bb:
661; IS__CGSCC_NPM-NEXT:    br label [[SW_EPILOG]]
662; IS__CGSCC_NPM:       sw.epilog:
663; IS__CGSCC_NPM-NEXT:    [[X_0:%.*]] = phi i32 [ 255, [[FOR_BODY]] ], [ 253, [[SW_BB]] ]
664; IS__CGSCC_NPM-NEXT:    store i32 [[X_0]], i32* [[P]], align 4
665; IS__CGSCC_NPM-NEXT:    [[INC]] = add nsw i32 [[J_0]], 1
666; IS__CGSCC_NPM-NEXT:    br label [[FOR_COND]]
667; IS__CGSCC_NPM:       for.end:
668; IS__CGSCC_NPM-NEXT:    ret void
669;
670entry:
671  br label %for.cond
672
673for.cond:
674  %j.0 = phi i32 [ 0, %entry ], [ %inc, %sw.epilog ]
675  %cmp = icmp slt i32 %j.0, 30
676  br i1 %cmp, label %for.body, label %for.end
677
678for.body:
679  switch i32 %j.0, label %sw.epilog [
680  i32 1, label %sw.bb
681  ]
682
683sw.bb:
684  br label %sw.epilog
685
686sw.epilog:
687  %x.0 = phi i32 [ 255, %for.body ], [ 253, %sw.bb ]
688  store i32 %x.0, i32* %p
689  %inc = add nsw i32 %j.0, 1
690  br label %for.cond
691
692for.end:
693  ret void
694}
695
696; Check we merge undef and a constant properly.
697define i8 @caller0() {
698; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
699; IS__TUNIT____-LABEL: define {{[^@]+}}@caller0
700; IS__TUNIT____-SAME: () [[ATTR1]] {
701; IS__TUNIT____-NEXT:    ret i8 49
702;
703; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
704; IS__CGSCC____-LABEL: define {{[^@]+}}@caller0
705; IS__CGSCC____-SAME: () [[ATTR1]] {
706; IS__CGSCC____-NEXT:    ret i8 49
707;
708  %c = call i8 @callee(i8 undef)
709  ret i8 %c
710}
711define i8 @caller1() {
712; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
713; IS__TUNIT____-LABEL: define {{[^@]+}}@caller1
714; IS__TUNIT____-SAME: () [[ATTR1]] {
715; IS__TUNIT____-NEXT:    ret i8 49
716;
717; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
718; IS__CGSCC____-LABEL: define {{[^@]+}}@caller1
719; IS__CGSCC____-SAME: () [[ATTR1]] {
720; IS__CGSCC____-NEXT:    ret i8 49
721;
722  %c = call i8 @callee(i8 undef)
723  ret i8 %c
724}
725define i8 @caller2() {
726; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
727; IS__TUNIT____-LABEL: define {{[^@]+}}@caller2
728; IS__TUNIT____-SAME: () [[ATTR1]] {
729; IS__TUNIT____-NEXT:    ret i8 49
730;
731; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
732; IS__CGSCC____-LABEL: define {{[^@]+}}@caller2
733; IS__CGSCC____-SAME: () [[ATTR1]] {
734; IS__CGSCC____-NEXT:    ret i8 49
735;
736  %c = call i8 @callee(i8 undef)
737  ret i8 %c
738}
739define i8 @caller_middle() {
740; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
741; IS__TUNIT____-LABEL: define {{[^@]+}}@caller_middle
742; IS__TUNIT____-SAME: () [[ATTR1]] {
743; IS__TUNIT____-NEXT:    ret i8 49
744;
745; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
746; IS__CGSCC____-LABEL: define {{[^@]+}}@caller_middle
747; IS__CGSCC____-SAME: () [[ATTR1]] {
748; IS__CGSCC____-NEXT:    ret i8 49
749;
750  %c = call i8 @callee(i8 42)
751  ret i8 %c
752}
753define i8 @caller3() {
754; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
755; IS__TUNIT____-LABEL: define {{[^@]+}}@caller3
756; IS__TUNIT____-SAME: () [[ATTR1]] {
757; IS__TUNIT____-NEXT:    ret i8 49
758;
759; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
760; IS__CGSCC____-LABEL: define {{[^@]+}}@caller3
761; IS__CGSCC____-SAME: () [[ATTR1]] {
762; IS__CGSCC____-NEXT:    ret i8 49
763;
764  %c = call i8 @callee(i8 undef)
765  ret i8 %c
766}
767define i8 @caller4() {
768; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
769; IS__TUNIT____-LABEL: define {{[^@]+}}@caller4
770; IS__TUNIT____-SAME: () [[ATTR1]] {
771; IS__TUNIT____-NEXT:    ret i8 49
772;
773; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
774; IS__CGSCC____-LABEL: define {{[^@]+}}@caller4
775; IS__CGSCC____-SAME: () [[ATTR1]] {
776; IS__CGSCC____-NEXT:    ret i8 49
777;
778  %c = call i8 @callee(i8 undef)
779  ret i8 %c
780}
781define internal i8 @callee(i8 %a) {
782; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
783; IS__CGSCC____-LABEL: define {{[^@]+}}@callee
784; IS__CGSCC____-SAME: () [[ATTR1]] {
785; IS__CGSCC____-NEXT:    ret i8 undef
786;
787  %c = add i8 %a, 7
788  ret i8 %c
789}
790
791
792define i1 @icmp() {
793; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
794; IS__TUNIT____-LABEL: define {{[^@]+}}@icmp
795; IS__TUNIT____-SAME: () [[ATTR1]] {
796; IS__TUNIT____-NEXT:    ret i1 true
797;
798; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
799; IS__CGSCC____-LABEL: define {{[^@]+}}@icmp
800; IS__CGSCC____-SAME: () [[ATTR1]] {
801; IS__CGSCC____-NEXT:    ret i1 true
802;
803  %c = icmp eq i8* null, null
804  ret i1 %c
805}
806