xref: /llvm-project/llvm/test/Transforms/Inline/access-attributes-prop.ll (revision 69a798a996e0cd9d521db38167cadf841d629d38)
1bf8d0392SNoah Goldstein; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes
2bf8d0392SNoah Goldstein; RUN: opt -S -passes=inline %s | FileCheck %s
3bf8d0392SNoah Goldstein; RUN: opt -S -passes='cgscc(inline)' %s | FileCheck %s
4bf8d0392SNoah Goldstein; RUN: opt -S -passes='module-inline' %s | FileCheck %s
5bf8d0392SNoah Goldstein
6bf8d0392SNoah Goldsteindeclare void @bar1(ptr %p)
7bf8d0392SNoah Goldsteindeclare void @bar2(ptr %p, ptr %p2)
8f8ff51e1SNoah Goldsteindeclare void @bar3(ptr writable %p)
9db03d9d3SNoah Goldsteindeclare void @bar4(ptr byval([4 x i32]) %p)
10bf8d0392SNoah Goldsteindefine dso_local void @foo1_rdonly(ptr readonly %p) {
11bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@foo1_rdonly
12bf8d0392SNoah Goldstein; CHECK-SAME: (ptr readonly [[P:%.*]]) {
13bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar1(ptr [[P]])
14bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
15bf8d0392SNoah Goldstein;
16bf8d0392SNoah Goldstein  call void @bar1(ptr %p)
17bf8d0392SNoah Goldstein  ret void
18bf8d0392SNoah Goldstein}
19bf8d0392SNoah Goldstein
20bf8d0392SNoah Goldsteindefine dso_local void @foo1(ptr %p) {
21bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@foo1
22bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
23bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar1(ptr [[P]])
24bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
25bf8d0392SNoah Goldstein;
26bf8d0392SNoah Goldstein  call void @bar1(ptr %p)
27bf8d0392SNoah Goldstein  ret void
28bf8d0392SNoah Goldstein}
29bf8d0392SNoah Goldstein
30f8ff51e1SNoah Goldsteindefine dso_local void @foo1_writable(ptr %p) {
31f8ff51e1SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@foo1_writable
32f8ff51e1SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
33f8ff51e1SNoah Goldstein; CHECK-NEXT:    call void @bar1(ptr writable [[P]])
34f8ff51e1SNoah Goldstein; CHECK-NEXT:    ret void
35f8ff51e1SNoah Goldstein;
36f8ff51e1SNoah Goldstein  call void @bar1(ptr writable %p)
37f8ff51e1SNoah Goldstein  ret void
38f8ff51e1SNoah Goldstein}
39f8ff51e1SNoah Goldstein
40f8ff51e1SNoah Goldsteindefine dso_local void @foo3_writable(ptr %p) {
41f8ff51e1SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@foo3_writable
42f8ff51e1SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
43f8ff51e1SNoah Goldstein; CHECK-NEXT:    call void @bar3(ptr [[P]])
44f8ff51e1SNoah Goldstein; CHECK-NEXT:    ret void
45f8ff51e1SNoah Goldstein;
46f8ff51e1SNoah Goldstein  call void @bar3(ptr %p)
47f8ff51e1SNoah Goldstein  ret void
48f8ff51e1SNoah Goldstein}
49f8ff51e1SNoah Goldstein
50bf8d0392SNoah Goldsteindefine dso_local void @foo1_bar_aligned64_deref512(ptr %p) {
51bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@foo1_bar_aligned64_deref512
52bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
53bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar1(ptr align 64 dereferenceable(512) [[P]])
54bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
55bf8d0392SNoah Goldstein;
56bf8d0392SNoah Goldstein  call void @bar1(ptr align 64 dereferenceable(512) %p)
57bf8d0392SNoah Goldstein  ret void
58bf8d0392SNoah Goldstein}
59bf8d0392SNoah Goldstein
60bf8d0392SNoah Goldsteindefine dso_local void @foo1_bar_aligned512_deref_or_null512(ptr %p) {
61bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@foo1_bar_aligned512_deref_or_null512
62bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
63bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar1(ptr align 512 dereferenceable_or_null(512) [[P]])
64bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
65bf8d0392SNoah Goldstein;
66bf8d0392SNoah Goldstein  call void @bar1(ptr align 512 dereferenceable_or_null(512) %p)
67bf8d0392SNoah Goldstein  ret void
68bf8d0392SNoah Goldstein}
69bf8d0392SNoah Goldstein
70bf8d0392SNoah Goldsteindefine dso_local void @foo2(ptr %p, ptr %p2) {
71bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@foo2
72bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) {
73bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar2(ptr [[P]], ptr [[P]])
74bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
75bf8d0392SNoah Goldstein;
76bf8d0392SNoah Goldstein  call void @bar2(ptr %p, ptr %p)
77bf8d0392SNoah Goldstein  ret void
78bf8d0392SNoah Goldstein}
79bf8d0392SNoah Goldstein
80bf8d0392SNoah Goldsteindefine dso_local void @foo2_2(ptr %p, ptr %p2) {
81bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@foo2_2
82bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) {
83bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar2(ptr [[P2]], ptr [[P2]])
84bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
85bf8d0392SNoah Goldstein;
86bf8d0392SNoah Goldstein  call void @bar2(ptr %p2, ptr %p2)
87bf8d0392SNoah Goldstein  ret void
88bf8d0392SNoah Goldstein}
89bf8d0392SNoah Goldstein
90bf8d0392SNoah Goldsteindefine dso_local void @foo2_3(ptr %p, ptr readnone %p2) {
91bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@foo2_3
92bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]], ptr readnone [[P2:%.*]]) {
93bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar2(ptr [[P]], ptr [[P2]])
94bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
95bf8d0392SNoah Goldstein;
96bf8d0392SNoah Goldstein  call void @bar2(ptr %p, ptr %p2)
97bf8d0392SNoah Goldstein  ret void
98bf8d0392SNoah Goldstein}
99bf8d0392SNoah Goldstein
100bf8d0392SNoah Goldsteindefine dso_local void @buz1_wronly(ptr %p) writeonly {
101bf8d0392SNoah Goldstein; CHECK: Function Attrs: memory(write)
102bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@buz1_wronly
103bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) #[[ATTR0:[0-9]+]] {
104bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar1(ptr [[P]])
105bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
106bf8d0392SNoah Goldstein;
107bf8d0392SNoah Goldstein  call void @bar1(ptr %p)
108bf8d0392SNoah Goldstein  ret void
109bf8d0392SNoah Goldstein}
110bf8d0392SNoah Goldstein
111bf8d0392SNoah Goldsteindefine dso_local void @buz1(ptr %p) {
112bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@buz1
113bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
114bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar1(ptr [[P]])
115bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
116bf8d0392SNoah Goldstein;
117bf8d0392SNoah Goldstein  call void @bar1(ptr %p)
118bf8d0392SNoah Goldstein  ret void
119bf8d0392SNoah Goldstein}
120bf8d0392SNoah Goldstein
121bf8d0392SNoah Goldsteindefine dso_local void @buz1_wronly_fail_alloca(ptr %p) writeonly {
122bf8d0392SNoah Goldstein; CHECK: Function Attrs: memory(write)
123bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@buz1_wronly_fail_alloca
124bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) #[[ATTR0]] {
125bf8d0392SNoah Goldstein; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4
126bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar2(ptr [[P]], ptr [[A]])
127bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
128bf8d0392SNoah Goldstein;
129bf8d0392SNoah Goldstein  %a = alloca i32, align 4
130bf8d0392SNoah Goldstein  call void @bar2(ptr %p, ptr %a)
131bf8d0392SNoah Goldstein  ret void
132bf8d0392SNoah Goldstein}
133bf8d0392SNoah Goldstein
134bf8d0392SNoah Goldsteindefine dso_local void @buz1_fail_alloca(ptr %p) {
135bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@buz1_fail_alloca
136bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
137bf8d0392SNoah Goldstein; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4
138bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar2(ptr [[P]], ptr [[A]])
139bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
140bf8d0392SNoah Goldstein;
141bf8d0392SNoah Goldstein  %a = alloca i32, align 4
142bf8d0392SNoah Goldstein  call void @bar2(ptr %p, ptr %a)
143bf8d0392SNoah Goldstein  ret void
144bf8d0392SNoah Goldstein}
145bf8d0392SNoah Goldstein
146bf8d0392SNoah Goldsteindefine dso_local void @buz1_wronly_partially_okay_alloca(ptr %p) writeonly {
147bf8d0392SNoah Goldstein; CHECK: Function Attrs: memory(write)
148bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@buz1_wronly_partially_okay_alloca
149bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) #[[ATTR0]] {
150bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar1(ptr [[P]])
151bf8d0392SNoah Goldstein; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4
152bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar2(ptr [[P]], ptr [[A]])
153bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
154bf8d0392SNoah Goldstein;
155bf8d0392SNoah Goldstein  call void @bar1(ptr %p)
156bf8d0392SNoah Goldstein  %a = alloca i32, align 4
157bf8d0392SNoah Goldstein  call void @bar2(ptr %p, ptr %a)
158bf8d0392SNoah Goldstein  ret void
159bf8d0392SNoah Goldstein}
160bf8d0392SNoah Goldstein
161bf8d0392SNoah Goldsteindefine dso_local void @buz1_partially_okay_alloca(ptr %p) {
162bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@buz1_partially_okay_alloca
163bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
164bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar1(ptr [[P]])
165bf8d0392SNoah Goldstein; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4
166bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar2(ptr [[P]], ptr [[A]])
167bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
168bf8d0392SNoah Goldstein;
169bf8d0392SNoah Goldstein  call void @bar1(ptr %p)
170bf8d0392SNoah Goldstein  %a = alloca i32, align 4
171bf8d0392SNoah Goldstein  call void @bar2(ptr %p, ptr %a)
172bf8d0392SNoah Goldstein  ret void
173bf8d0392SNoah Goldstein}
174bf8d0392SNoah Goldstein
175bf8d0392SNoah Goldsteindefine dso_local void @foo2_through_obj(ptr %p, ptr %p2) {
176bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@foo2_through_obj
177bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) {
178bf8d0392SNoah Goldstein; CHECK-NEXT:    [[PP:%.*]] = getelementptr i8, ptr [[P]], i64 9
179bf8d0392SNoah Goldstein; CHECK-NEXT:    [[P2P:%.*]] = getelementptr i8, ptr [[P2]], i64 123
180bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar2(ptr [[P2P]], ptr [[PP]])
181bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
182bf8d0392SNoah Goldstein;
183bf8d0392SNoah Goldstein  %pp = getelementptr i8, ptr %p, i64 9
184bf8d0392SNoah Goldstein  %p2p = getelementptr i8, ptr %p2, i64 123
185bf8d0392SNoah Goldstein  call void @bar2(ptr %p2p, ptr %pp)
186bf8d0392SNoah Goldstein  ret void
187bf8d0392SNoah Goldstein}
188bf8d0392SNoah Goldstein
189db03d9d3SNoah Goldsteindefine dso_local void @foo_byval_readonly(ptr readonly %p) {
190db03d9d3SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@foo_byval_readonly
191db03d9d3SNoah Goldstein; CHECK-SAME: (ptr readonly [[P:%.*]]) {
192db03d9d3SNoah Goldstein; CHECK-NEXT:    call void @bar4(ptr byval([4 x i32]) [[P]])
193db03d9d3SNoah Goldstein; CHECK-NEXT:    ret void
194db03d9d3SNoah Goldstein;
195db03d9d3SNoah Goldstein  call void @bar4(ptr byval([4 x i32]) %p)
196db03d9d3SNoah Goldstein  ret void
197db03d9d3SNoah Goldstein}
198db03d9d3SNoah Goldstein
199bf8d0392SNoah Goldsteindefine void @prop_param_func_decl(ptr %p) {
200bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_param_func_decl
201bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
202db03d9d3SNoah Goldstein; CHECK-NEXT:    call void @bar1(ptr readonly [[P]])
203bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
204bf8d0392SNoah Goldstein;
205bf8d0392SNoah Goldstein  call void @foo1_rdonly(ptr %p)
206bf8d0392SNoah Goldstein  ret void
207bf8d0392SNoah Goldstein}
208bf8d0392SNoah Goldstein
209bf8d0392SNoah Goldsteindefine void @prop_param_callbase_def(ptr %p) {
210bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_param_callbase_def
211bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
212db03d9d3SNoah Goldstein; CHECK-NEXT:    call void @bar1(ptr readonly [[P]])
213bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar1(ptr [[P]])
214bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
215bf8d0392SNoah Goldstein;
216bf8d0392SNoah Goldstein  call void @foo1(ptr readonly %p)
217bf8d0392SNoah Goldstein  call void @bar1(ptr %p)
218bf8d0392SNoah Goldstein  ret void
219bf8d0392SNoah Goldstein}
220bf8d0392SNoah Goldstein
221bf8d0392SNoah Goldsteindefine void @prop_param_callbase_def_2x(ptr %p, ptr %p2) {
222bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_param_callbase_def_2x
223bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) {
224db03d9d3SNoah Goldstein; CHECK-NEXT:    call void @bar2(ptr readonly [[P]], ptr readonly [[P]])
225bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
226bf8d0392SNoah Goldstein;
227bf8d0392SNoah Goldstein  call void @foo2(ptr readonly %p, ptr %p)
228bf8d0392SNoah Goldstein  ret void
229bf8d0392SNoah Goldstein}
230bf8d0392SNoah Goldstein
231bf8d0392SNoah Goldsteindefine void @prop_param_callbase_def_2x_2(ptr %p, ptr %p2) {
232bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_param_callbase_def_2x_2
233bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) {
234bf8d0392SNoah Goldstein; CHECK-NEXT:    [[PP_I:%.*]] = getelementptr i8, ptr [[P]], i64 9
235bf8d0392SNoah Goldstein; CHECK-NEXT:    [[P2P_I:%.*]] = getelementptr i8, ptr [[P2]], i64 123
236db03d9d3SNoah Goldstein; CHECK-NEXT:    call void @bar2(ptr [[P2P_I]], ptr readonly [[PP_I]])
237bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
238bf8d0392SNoah Goldstein;
239bf8d0392SNoah Goldstein  call void @foo2_through_obj(ptr readonly %p, ptr writeonly %p2)
240bf8d0392SNoah Goldstein  ret void
241bf8d0392SNoah Goldstein}
242bf8d0392SNoah Goldstein
243bf8d0392SNoah Goldsteindefine void @prop_param_callbase_def_2x_incompat(ptr %p, ptr %p2) {
244bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_param_callbase_def_2x_incompat
245bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) {
246bf8d0392SNoah Goldstein; CHECK-NEXT:    [[PP_I:%.*]] = getelementptr i8, ptr [[P]], i64 9
247bf8d0392SNoah Goldstein; CHECK-NEXT:    [[P2P_I:%.*]] = getelementptr i8, ptr [[P]], i64 123
248db03d9d3SNoah Goldstein; CHECK-NEXT:    call void @bar2(ptr readonly [[P2P_I]], ptr readnone [[PP_I]])
249bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
250bf8d0392SNoah Goldstein;
251bf8d0392SNoah Goldstein  call void @foo2_through_obj(ptr readnone %p, ptr readonly %p)
252bf8d0392SNoah Goldstein  ret void
253bf8d0392SNoah Goldstein}
254bf8d0392SNoah Goldstein
255bf8d0392SNoah Goldsteindefine void @prop_param_callbase_def_2x_incompat_2(ptr %p, ptr %p2) {
256bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_param_callbase_def_2x_incompat_2
257bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) {
258db03d9d3SNoah Goldstein; CHECK-NEXT:    call void @bar2(ptr readonly [[P]], ptr readonly [[P]])
259bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
260bf8d0392SNoah Goldstein;
261bf8d0392SNoah Goldstein  call void @foo2(ptr readonly %p, ptr readnone %p)
262bf8d0392SNoah Goldstein  ret void
263bf8d0392SNoah Goldstein}
264bf8d0392SNoah Goldstein
265bf8d0392SNoah Goldsteindefine void @prop_param_callbase_def_2x_incompat_3(ptr %p, ptr %p2) {
266bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_param_callbase_def_2x_incompat_3
267bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) {
268db03d9d3SNoah Goldstein; CHECK-NEXT:    call void @bar2(ptr readnone [[P]], ptr readnone [[P]])
269bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
270bf8d0392SNoah Goldstein;
271bf8d0392SNoah Goldstein  call void @foo2_2(ptr readonly %p, ptr readnone %p)
272bf8d0392SNoah Goldstein  ret void
273bf8d0392SNoah Goldstein}
274bf8d0392SNoah Goldstein
275bf8d0392SNoah Goldsteindefine void @prop_param_callbase_def_1x_partial(ptr %p, ptr %p2) {
276bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_param_callbase_def_1x_partial
277bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) {
278db03d9d3SNoah Goldstein; CHECK-NEXT:    call void @bar2(ptr readonly [[P]], ptr readonly [[P]])
279bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
280bf8d0392SNoah Goldstein;
281bf8d0392SNoah Goldstein  call void @foo2(ptr readonly %p, ptr %p)
282bf8d0392SNoah Goldstein  ret void
283bf8d0392SNoah Goldstein}
284bf8d0392SNoah Goldstein
285bf8d0392SNoah Goldsteindefine void @prop_param_callbase_def_1x_partial_2(ptr %p, ptr %p2) {
286bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_param_callbase_def_1x_partial_2
287bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) {
288bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar2(ptr [[P]], ptr [[P]])
289bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
290bf8d0392SNoah Goldstein;
291bf8d0392SNoah Goldstein  call void @foo2_2(ptr readonly %p, ptr %p)
292bf8d0392SNoah Goldstein  ret void
293bf8d0392SNoah Goldstein}
294bf8d0392SNoah Goldstein
295bf8d0392SNoah Goldsteindefine void @prop_param_callbase_def_1x_partial_3(ptr %p, ptr %p2) {
296bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_param_callbase_def_1x_partial_3
297bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) {
298db03d9d3SNoah Goldstein; CHECK-NEXT:    call void @bar2(ptr readonly [[P]], ptr readnone [[P]])
299bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
300bf8d0392SNoah Goldstein;
301bf8d0392SNoah Goldstein  call void @foo2_3(ptr readonly %p, ptr %p)
302bf8d0392SNoah Goldstein  ret void
303bf8d0392SNoah Goldstein}
304bf8d0392SNoah Goldstein
305bf8d0392SNoah Goldsteindefine void @prop_deref(ptr %p) {
306bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_deref
307bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
308*69a798a9Sgoldsteinn; CHECK-NEXT:    call void @bar1(ptr dereferenceable(16) [[P]])
309bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
310bf8d0392SNoah Goldstein;
311bf8d0392SNoah Goldstein  call void @foo1(ptr dereferenceable(16) %p)
312bf8d0392SNoah Goldstein  ret void
313bf8d0392SNoah Goldstein}
314bf8d0392SNoah Goldstein
315bf8d0392SNoah Goldsteindefine void @prop_deref_or_null(ptr %p) {
316bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_deref_or_null
317bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
318*69a798a9Sgoldsteinn; CHECK-NEXT:    call void @bar1(ptr dereferenceable_or_null(256) [[P]])
319bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
320bf8d0392SNoah Goldstein;
321bf8d0392SNoah Goldstein  call void @foo1(ptr dereferenceable_or_null(256) %p)
322bf8d0392SNoah Goldstein  ret void
323bf8d0392SNoah Goldstein}
324bf8d0392SNoah Goldstein
325bf8d0392SNoah Goldsteindefine void @prop_param_nonnull_and_align(ptr %p) {
326bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_param_nonnull_and_align
327bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
328*69a798a9Sgoldsteinn; CHECK-NEXT:    call void @bar1(ptr nonnull align 32 [[P]])
329bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
330bf8d0392SNoah Goldstein;
331bf8d0392SNoah Goldstein  call void @foo1(ptr nonnull align 32 %p)
332bf8d0392SNoah Goldstein  ret void
333bf8d0392SNoah Goldstein}
334bf8d0392SNoah Goldstein
335*69a798a9Sgoldsteinndefine void @prop_param_nofree_and_align(ptr %p) {
336*69a798a9Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@prop_param_nofree_and_align
337*69a798a9Sgoldsteinn; CHECK-SAME: (ptr [[P:%.*]]) {
338*69a798a9Sgoldsteinn; CHECK-NEXT:    call void @bar1(ptr align 32 [[P]])
339*69a798a9Sgoldsteinn; CHECK-NEXT:    ret void
340*69a798a9Sgoldsteinn;
341*69a798a9Sgoldsteinn  call void @foo1(ptr nofree align 32 %p)
342*69a798a9Sgoldsteinn  ret void
343*69a798a9Sgoldsteinn}
344*69a798a9Sgoldsteinn
345bf8d0392SNoah Goldsteindefine void @prop_param_deref_align_no_update(ptr %p) {
346bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_param_deref_align_no_update
347bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
348bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar1(ptr align 64 dereferenceable(512) [[P]])
349bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
350bf8d0392SNoah Goldstein;
351bf8d0392SNoah Goldstein  call void @foo1_bar_aligned64_deref512(ptr align 4 dereferenceable(64) %p)
352bf8d0392SNoah Goldstein  ret void
353bf8d0392SNoah Goldstein}
354bf8d0392SNoah Goldstein
355bf8d0392SNoah Goldsteindefine void @prop_param_deref_align_update(ptr %p) {
356bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_param_deref_align_update
357bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
358*69a798a9Sgoldsteinn; CHECK-NEXT:    call void @bar1(ptr align 128 dereferenceable(1024) [[P]])
359bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
360bf8d0392SNoah Goldstein;
361bf8d0392SNoah Goldstein  call void @foo1_bar_aligned64_deref512(ptr align 128 dereferenceable(1024) %p)
362bf8d0392SNoah Goldstein  ret void
363bf8d0392SNoah Goldstein}
364bf8d0392SNoah Goldstein
365bf8d0392SNoah Goldsteindefine void @prop_param_deref_or_null_update(ptr %p) {
366bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_param_deref_or_null_update
367bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
368*69a798a9Sgoldsteinn; CHECK-NEXT:    call void @bar1(ptr align 512 dereferenceable_or_null(1024) [[P]])
369bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
370bf8d0392SNoah Goldstein;
371bf8d0392SNoah Goldstein  call void @foo1_bar_aligned512_deref_or_null512(ptr dereferenceable_or_null(1024) %p)
372bf8d0392SNoah Goldstein  ret void
373bf8d0392SNoah Goldstein}
374bf8d0392SNoah Goldstein
375bf8d0392SNoah Goldsteindefine void @prop_param_deref_or_null_no_update(ptr %p) {
376bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_param_deref_or_null_no_update
377bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
378bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar1(ptr align 512 dereferenceable_or_null(512) [[P]])
379bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
380bf8d0392SNoah Goldstein;
381bf8d0392SNoah Goldstein  call void @foo1_bar_aligned512_deref_or_null512(ptr dereferenceable_or_null(32) %p)
382bf8d0392SNoah Goldstein  ret void
383bf8d0392SNoah Goldstein}
384bf8d0392SNoah Goldstein
385bf8d0392SNoah Goldsteindefine void @prop_fn_decl(ptr %p) {
386bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_fn_decl
387bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
388bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar1(ptr [[P]])
389bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar1(ptr [[P]])
390bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
391bf8d0392SNoah Goldstein;
392bf8d0392SNoah Goldstein  call void @buz1_wronly(ptr %p)
393bf8d0392SNoah Goldstein  call void @bar1(ptr %p)
394bf8d0392SNoah Goldstein  ret void
395bf8d0392SNoah Goldstein}
396bf8d0392SNoah Goldstein
397bf8d0392SNoah Goldsteindefine void @prop_cb_def_wr(ptr %p) {
398bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_cb_def_wr
399bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
400bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar1(ptr [[P]])
401bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar1(ptr [[P]])
402bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
403bf8d0392SNoah Goldstein;
404bf8d0392SNoah Goldstein  call void @buz1(ptr %p) writeonly
405bf8d0392SNoah Goldstein  call void @bar1(ptr %p)
406bf8d0392SNoah Goldstein  ret void
407bf8d0392SNoah Goldstein}
408bf8d0392SNoah Goldstein
409bf8d0392SNoah Goldsteindefine void @prop_fn_decl_fail_alloca(ptr %p) {
410bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_fn_decl_fail_alloca
411bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
412bf8d0392SNoah Goldstein; CHECK-NEXT:    [[A_I:%.*]] = alloca i32, align 4
413bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 4, ptr [[A_I]])
414bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar2(ptr [[P]], ptr [[A_I]])
415bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 4, ptr [[A_I]])
416bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar1(ptr [[P]])
417bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
418bf8d0392SNoah Goldstein;
419bf8d0392SNoah Goldstein  call void @buz1_wronly_fail_alloca(ptr %p)
420bf8d0392SNoah Goldstein  call void @bar1(ptr %p)
421bf8d0392SNoah Goldstein  ret void
422bf8d0392SNoah Goldstein}
423bf8d0392SNoah Goldstein
424bf8d0392SNoah Goldsteindefine void @prop_cb_def_wr_fail_alloca(ptr %p) {
425bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_cb_def_wr_fail_alloca
426bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
427bf8d0392SNoah Goldstein; CHECK-NEXT:    [[A_I:%.*]] = alloca i32, align 4
428bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 4, ptr [[A_I]])
429bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar2(ptr [[P]], ptr [[A_I]])
430bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 4, ptr [[A_I]])
431bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar1(ptr [[P]])
432bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
433bf8d0392SNoah Goldstein;
434bf8d0392SNoah Goldstein  call void @buz1_fail_alloca(ptr %p) writeonly
435bf8d0392SNoah Goldstein  call void @bar1(ptr %p)
436bf8d0392SNoah Goldstein  ret void
437bf8d0392SNoah Goldstein}
438bf8d0392SNoah Goldstein
439bf8d0392SNoah Goldsteindefine void @prop_fn_decl_partially_okay_alloca(ptr %p) {
440bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_fn_decl_partially_okay_alloca
441bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
442bf8d0392SNoah Goldstein; CHECK-NEXT:    [[A_I:%.*]] = alloca i32, align 4
443bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 4, ptr [[A_I]])
444bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar1(ptr [[P]])
445bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar2(ptr [[P]], ptr [[A_I]])
446bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 4, ptr [[A_I]])
447bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar1(ptr [[P]])
448bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
449bf8d0392SNoah Goldstein;
450bf8d0392SNoah Goldstein  call void @buz1_wronly_partially_okay_alloca(ptr %p)
451bf8d0392SNoah Goldstein  call void @bar1(ptr %p)
452bf8d0392SNoah Goldstein  ret void
453bf8d0392SNoah Goldstein}
454bf8d0392SNoah Goldstein
455bf8d0392SNoah Goldsteindefine void @prop_cb_def_wr_partially_okay_alloca(ptr %p) {
456bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_cb_def_wr_partially_okay_alloca
457bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
458bf8d0392SNoah Goldstein; CHECK-NEXT:    [[A_I:%.*]] = alloca i32, align 4
459bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 4, ptr [[A_I]])
460bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar1(ptr [[P]])
461bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar2(ptr [[P]], ptr [[A_I]])
462bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 4, ptr [[A_I]])
463bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar1(ptr [[P]])
464bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
465bf8d0392SNoah Goldstein;
466bf8d0392SNoah Goldstein  call void @buz1_partially_okay_alloca(ptr %p) writeonly
467bf8d0392SNoah Goldstein  call void @bar1(ptr %p)
468bf8d0392SNoah Goldstein  ret void
469bf8d0392SNoah Goldstein}
470bf8d0392SNoah Goldstein
471bf8d0392SNoah Goldsteindefine void @prop_cb_def_readonly(ptr %p) {
472bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_cb_def_readonly
473bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
474bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar1(ptr [[P]])
475bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
476bf8d0392SNoah Goldstein;
477bf8d0392SNoah Goldstein  call void @foo1(ptr %p) readonly
478bf8d0392SNoah Goldstein  ret void
479bf8d0392SNoah Goldstein}
480bf8d0392SNoah Goldstein
481bf8d0392SNoah Goldsteindefine void @prop_cb_def_readnone(ptr %p) {
482bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_cb_def_readnone
483bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
484bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar1(ptr [[P]])
485bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
486bf8d0392SNoah Goldstein;
487bf8d0392SNoah Goldstein  call void @foo1(ptr %p) readnone
488bf8d0392SNoah Goldstein  ret void
489bf8d0392SNoah Goldstein}
490bf8d0392SNoah Goldstein
491bf8d0392SNoah Goldsteindefine void @prop_cb_def_argmem_readonly_fail(ptr %p) {
492bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_cb_def_argmem_readonly_fail
493bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
494bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar1(ptr [[P]])
495bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
496bf8d0392SNoah Goldstein;
497bf8d0392SNoah Goldstein  call void @foo1(ptr %p) memory(argmem:read)
498bf8d0392SNoah Goldstein  ret void
499bf8d0392SNoah Goldstein}
500bf8d0392SNoah Goldstein
501bf8d0392SNoah Goldsteindefine void @prop_cb_def_inaccessible_none(ptr %p) {
502bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_cb_def_inaccessible_none
503bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
504bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar1(ptr [[P]])
505bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
506bf8d0392SNoah Goldstein;
507bf8d0392SNoah Goldstein  call void @foo1(ptr %p) memory(inaccessiblemem:none)
508bf8d0392SNoah Goldstein  ret void
509bf8d0392SNoah Goldstein}
510bf8d0392SNoah Goldstein
511bf8d0392SNoah Goldsteindefine void @prop_cb_def_inaccessible_none_argmem_none(ptr %p) {
512bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_cb_def_inaccessible_none_argmem_none
513bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
514bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar1(ptr [[P]])
515bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
516bf8d0392SNoah Goldstein;
517bf8d0392SNoah Goldstein  call void @foo1(ptr %p) memory(inaccessiblemem:none, argmem:none)
518bf8d0392SNoah Goldstein  ret void
519bf8d0392SNoah Goldstein}
520bf8d0392SNoah Goldstein
521bf8d0392SNoah Goldsteindefine void @prop_cb_def_willreturn(ptr %p) {
522bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_cb_def_willreturn
523bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
524bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar1(ptr [[P]])
525bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
526bf8d0392SNoah Goldstein;
527bf8d0392SNoah Goldstein  call void @foo1(ptr %p) willreturn
528bf8d0392SNoah Goldstein  ret void
529bf8d0392SNoah Goldstein}
530bf8d0392SNoah Goldstein
531bf8d0392SNoah Goldsteindefine void @prop_cb_def_mustprogress(ptr %p) {
532bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_cb_def_mustprogress
533bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
534bf8d0392SNoah Goldstein; CHECK-NEXT:    call void @bar1(ptr [[P]])
535bf8d0392SNoah Goldstein; CHECK-NEXT:    ret void
536bf8d0392SNoah Goldstein;
537bf8d0392SNoah Goldstein  call void @foo1(ptr %p) mustprogress
538bf8d0392SNoah Goldstein  ret void
539bf8d0392SNoah Goldstein}
540f8ff51e1SNoah Goldstein
541f8ff51e1SNoah Goldsteindefine void @prop_no_conflict_writable(ptr %p) {
542f8ff51e1SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_no_conflict_writable
543f8ff51e1SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
544db03d9d3SNoah Goldstein; CHECK-NEXT:    call void @bar1(ptr readonly [[P]])
545f8ff51e1SNoah Goldstein; CHECK-NEXT:    ret void
546f8ff51e1SNoah Goldstein;
547f8ff51e1SNoah Goldstein  call void @foo1_writable(ptr readonly %p)
548f8ff51e1SNoah Goldstein  ret void
549f8ff51e1SNoah Goldstein}
550f8ff51e1SNoah Goldstein
551f8ff51e1SNoah Goldsteindefine void @prop_no_conflict_writable2(ptr %p) {
552f8ff51e1SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_no_conflict_writable2
553f8ff51e1SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
554db03d9d3SNoah Goldstein; CHECK-NEXT:    call void @bar3(ptr readnone [[P]])
555f8ff51e1SNoah Goldstein; CHECK-NEXT:    ret void
556f8ff51e1SNoah Goldstein;
557f8ff51e1SNoah Goldstein  call void @foo3_writable(ptr readnone %p)
558f8ff51e1SNoah Goldstein  ret void
559f8ff51e1SNoah Goldstein}
560f8ff51e1SNoah Goldstein
561db03d9d3SNoah Goldsteindefine void @prop_byval_readonly(ptr %p) {
562db03d9d3SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_byval_readonly
563db03d9d3SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) {
564db03d9d3SNoah Goldstein; CHECK-NEXT:    call void @bar4(ptr byval([4 x i32]) [[P]])
565db03d9d3SNoah Goldstein; CHECK-NEXT:    ret void
566db03d9d3SNoah Goldstein;
567db03d9d3SNoah Goldstein  call void @foo_byval_readonly(ptr %p)
568db03d9d3SNoah Goldstein  ret void
569db03d9d3SNoah Goldstein}
570a9352a0dSgoldsteinn
571a9352a0dSgoldsteinndefine ptr @caller_bad_param_prop(ptr %p1, ptr %p2, i64 %x) {
572a9352a0dSgoldsteinn; CHECK-LABEL: define {{[^@]+}}@caller_bad_param_prop
573a9352a0dSgoldsteinn; CHECK-SAME: (ptr [[P1:%.*]], ptr [[P2:%.*]], i64 [[X:%.*]]) {
574a9352a0dSgoldsteinn; CHECK-NEXT:    [[TMP1:%.*]] = call ptr [[P1]](i64 [[X]], ptr [[P2]])
575a9352a0dSgoldsteinn; CHECK-NEXT:    ret ptr [[TMP1]]
576a9352a0dSgoldsteinn;
577a9352a0dSgoldsteinn  %1 = call ptr %p1(i64 %x, ptr %p2)
578a9352a0dSgoldsteinn  %2 = call ptr @callee_bad_param_prop(ptr %1)
579a9352a0dSgoldsteinn  ret ptr %2
580a9352a0dSgoldsteinn}
581a9352a0dSgoldsteinn
582a9352a0dSgoldsteinndefine ptr @callee_bad_param_prop(ptr readonly %x) {
583a9352a0dSgoldsteinn; CHECK-LABEL: define {{[^@]+}}@callee_bad_param_prop
584a9352a0dSgoldsteinn; CHECK-SAME: (ptr readonly [[X:%.*]]) {
585a9352a0dSgoldsteinn; CHECK-NEXT:    [[R:%.*]] = tail call ptr @llvm.ptrmask.p0.i64(ptr [[X]], i64 -1)
586a9352a0dSgoldsteinn; CHECK-NEXT:    ret ptr [[R]]
587a9352a0dSgoldsteinn;
588a9352a0dSgoldsteinn  %r = tail call ptr @llvm.ptrmask(ptr %x, i64 -1)
589a9352a0dSgoldsteinn  ret ptr %r
590a9352a0dSgoldsteinn}
5913c777f04Sgoldsteinn
5923c777f04Sgoldsteinndefine dso_local void @foo_byval_readonly2(ptr readonly %p) {
5933c777f04Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@foo_byval_readonly2
5943c777f04Sgoldsteinn; CHECK-SAME: (ptr readonly [[P:%.*]]) {
5953c777f04Sgoldsteinn; CHECK-NEXT:    call void @bar4(ptr [[P]])
5963c777f04Sgoldsteinn; CHECK-NEXT:    ret void
5973c777f04Sgoldsteinn;
5983c777f04Sgoldsteinn  call void @bar4(ptr %p)
5993c777f04Sgoldsteinn  ret void
6003c777f04Sgoldsteinn}
6013c777f04Sgoldsteinn
6023c777f04Sgoldsteinndefine void @prop_byval_readonly2(ptr %p) {
6033c777f04Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@prop_byval_readonly2
6043c777f04Sgoldsteinn; CHECK-SAME: (ptr [[P:%.*]]) {
6053c777f04Sgoldsteinn; CHECK-NEXT:    call void @bar4(ptr [[P]])
6063c777f04Sgoldsteinn; CHECK-NEXT:    ret void
6073c777f04Sgoldsteinn;
6083c777f04Sgoldsteinn  call void @foo_byval_readonly2(ptr %p)
6093c777f04Sgoldsteinn  ret void
6103c777f04Sgoldsteinn}
611*69a798a9Sgoldsteinn
612*69a798a9Sgoldsteinndeclare void @bar5(i32)
613*69a798a9Sgoldsteinn
614*69a798a9Sgoldsteinndefine dso_local void @foo4_range_0_10(i32 %v) {
615*69a798a9Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@foo4_range_0_10
616*69a798a9Sgoldsteinn; CHECK-SAME: (i32 [[V:%.*]]) {
617*69a798a9Sgoldsteinn; CHECK-NEXT:    call void @bar5(i32 range(i32 0, 10) [[V]])
618*69a798a9Sgoldsteinn; CHECK-NEXT:    ret void
619*69a798a9Sgoldsteinn;
620*69a798a9Sgoldsteinn  call void @bar5(i32 range(i32 0, 10) %v)
621*69a798a9Sgoldsteinn  ret void
622*69a798a9Sgoldsteinn}
623*69a798a9Sgoldsteinn
624*69a798a9Sgoldsteinndefine dso_local void @foo4_range_10_40(i32 %v) {
625*69a798a9Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@foo4_range_10_40
626*69a798a9Sgoldsteinn; CHECK-SAME: (i32 [[V:%.*]]) {
627*69a798a9Sgoldsteinn; CHECK-NEXT:    call void @bar5(i32 range(i32 10, 40) [[V]])
628*69a798a9Sgoldsteinn; CHECK-NEXT:    ret void
629*69a798a9Sgoldsteinn;
630*69a798a9Sgoldsteinn  call void @bar5(i32 range(i32 10, 40) %v)
631*69a798a9Sgoldsteinn  ret void
632*69a798a9Sgoldsteinn}
633*69a798a9Sgoldsteinn
634*69a798a9Sgoldsteinndefine dso_local void @foo4_2_range_0_10(i32 range(i32 0, 10) %v) {
635*69a798a9Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@foo4_2_range_0_10
636*69a798a9Sgoldsteinn; CHECK-SAME: (i32 range(i32 0, 10) [[V:%.*]]) {
637*69a798a9Sgoldsteinn; CHECK-NEXT:    call void @bar5(i32 [[V]])
638*69a798a9Sgoldsteinn; CHECK-NEXT:    ret void
639*69a798a9Sgoldsteinn;
640*69a798a9Sgoldsteinn  call void @bar5(i32 %v)
641*69a798a9Sgoldsteinn  ret void
642*69a798a9Sgoldsteinn}
643*69a798a9Sgoldsteinn
644*69a798a9Sgoldsteinndefine dso_local void @foo4(i32 %v) {
645*69a798a9Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@foo4
646*69a798a9Sgoldsteinn; CHECK-SAME: (i32 [[V:%.*]]) {
647*69a798a9Sgoldsteinn; CHECK-NEXT:    call void @bar5(i32 [[V]])
648*69a798a9Sgoldsteinn; CHECK-NEXT:    ret void
649*69a798a9Sgoldsteinn;
650*69a798a9Sgoldsteinn  call void @bar5(i32 %v)
651*69a798a9Sgoldsteinn  ret void
652*69a798a9Sgoldsteinn}
653*69a798a9Sgoldsteinn
654*69a798a9Sgoldsteinndefine void @prop_range_empty_intersect(i32 %v) {
655*69a798a9Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@prop_range_empty_intersect
656*69a798a9Sgoldsteinn; CHECK-SAME: (i32 [[V:%.*]]) {
657*69a798a9Sgoldsteinn; CHECK-NEXT:    call void @bar5(i32 range(i32 0, 0) [[V]])
658*69a798a9Sgoldsteinn; CHECK-NEXT:    ret void
659*69a798a9Sgoldsteinn;
660*69a798a9Sgoldsteinn  call void @foo4_range_0_10(i32 range(i32 11, 50) %v)
661*69a798a9Sgoldsteinn  ret void
662*69a798a9Sgoldsteinn}
663*69a798a9Sgoldsteinn
664*69a798a9Sgoldsteinndefine void @prop_range_empty(i32 %v) {
665*69a798a9Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@prop_range_empty
666*69a798a9Sgoldsteinn; CHECK-SAME: (i32 [[V:%.*]]) {
667*69a798a9Sgoldsteinn; CHECK-NEXT:    call void @bar5(i32 range(i32 1, 0) [[V]])
668*69a798a9Sgoldsteinn; CHECK-NEXT:    ret void
669*69a798a9Sgoldsteinn;
670*69a798a9Sgoldsteinn  call void @foo4(i32 range(i32 1, 0) %v)
671*69a798a9Sgoldsteinn  ret void
672*69a798a9Sgoldsteinn}
673*69a798a9Sgoldsteinn
674*69a798a9Sgoldsteinndefine void @prop_range_empty_with_intersect(i32 %v) {
675*69a798a9Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@prop_range_empty_with_intersect
676*69a798a9Sgoldsteinn; CHECK-SAME: (i32 [[V:%.*]]) {
677*69a798a9Sgoldsteinn; CHECK-NEXT:    call void @bar5(i32 range(i32 1, 10) [[V]])
678*69a798a9Sgoldsteinn; CHECK-NEXT:    ret void
679*69a798a9Sgoldsteinn;
680*69a798a9Sgoldsteinn  call void @foo4_range_0_10(i32 range(i32 1, 0) %v)
681*69a798a9Sgoldsteinn  ret void
682*69a798a9Sgoldsteinn}
683*69a798a9Sgoldsteinn
684*69a798a9Sgoldsteinndefine void @prop_range_intersect1(i32 %v) {
685*69a798a9Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@prop_range_intersect1
686*69a798a9Sgoldsteinn; CHECK-SAME: (i32 [[V:%.*]]) {
687*69a798a9Sgoldsteinn; CHECK-NEXT:    call void @bar5(i32 range(i32 0, 9) [[V]])
688*69a798a9Sgoldsteinn; CHECK-NEXT:    ret void
689*69a798a9Sgoldsteinn;
690*69a798a9Sgoldsteinn  call void @foo4_range_0_10(i32 range(i32 0, 9) %v)
691*69a798a9Sgoldsteinn  ret void
692*69a798a9Sgoldsteinn}
693*69a798a9Sgoldsteinn
694*69a798a9Sgoldsteinndefine void @prop_range_intersect2(i32 %v) {
695*69a798a9Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@prop_range_intersect2
696*69a798a9Sgoldsteinn; CHECK-SAME: (i32 [[V:%.*]]) {
697*69a798a9Sgoldsteinn; CHECK-NEXT:    call void @bar5(i32 range(i32 1, 9) [[V]])
698*69a798a9Sgoldsteinn; CHECK-NEXT:    ret void
699*69a798a9Sgoldsteinn;
700*69a798a9Sgoldsteinn  call void @foo4_range_0_10(i32 range(i32 1, 9) %v)
701*69a798a9Sgoldsteinn  ret void
702*69a798a9Sgoldsteinn}
703*69a798a9Sgoldsteinn
704*69a798a9Sgoldsteinndefine void @prop_range_intersect3(i32 %v) {
705*69a798a9Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@prop_range_intersect3
706*69a798a9Sgoldsteinn; CHECK-SAME: (i32 [[V:%.*]]) {
707*69a798a9Sgoldsteinn; CHECK-NEXT:    call void @bar5(i32 range(i32 0, 11) [[V]])
708*69a798a9Sgoldsteinn; CHECK-NEXT:    ret void
709*69a798a9Sgoldsteinn;
710*69a798a9Sgoldsteinn  call void @foo4_2_range_0_10(i32 range(i32 0, 11) %v)
711*69a798a9Sgoldsteinn  ret void
712*69a798a9Sgoldsteinn}
713*69a798a9Sgoldsteinn
714*69a798a9Sgoldsteinndefine void @prop_range_intersect4(i32 %v) {
715*69a798a9Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@prop_range_intersect4
716*69a798a9Sgoldsteinn; CHECK-SAME: (i32 [[V:%.*]]) {
717*69a798a9Sgoldsteinn; CHECK-NEXT:    call void @bar5(i32 range(i32 0, 5) [[V]])
718*69a798a9Sgoldsteinn; CHECK-NEXT:    ret void
719*69a798a9Sgoldsteinn;
720*69a798a9Sgoldsteinn  call void @foo4_range_0_10(i32 range(i32 40, 5) %v)
721*69a798a9Sgoldsteinn  ret void
722*69a798a9Sgoldsteinn}
723*69a798a9Sgoldsteinn
724*69a798a9Sgoldsteinndefine void @prop_range_intersect5(i32 %v) {
725*69a798a9Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@prop_range_intersect5
726*69a798a9Sgoldsteinn; CHECK-SAME: (i32 [[V:%.*]]) {
727*69a798a9Sgoldsteinn; CHECK-NEXT:    call void @bar5(i32 range(i32 10, 40) [[V]])
728*69a798a9Sgoldsteinn; CHECK-NEXT:    ret void
729*69a798a9Sgoldsteinn;
730*69a798a9Sgoldsteinn  call void @foo4_range_10_40(i32 range(i32 30, 20) %v)
731*69a798a9Sgoldsteinn  ret void
732*69a798a9Sgoldsteinn}
733*69a798a9Sgoldsteinn
734*69a798a9Sgoldsteinndefine void @prop_range_keep(i32 %v) {
735*69a798a9Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@prop_range_keep
736*69a798a9Sgoldsteinn; CHECK-SAME: (i32 [[V:%.*]]) {
737*69a798a9Sgoldsteinn; CHECK-NEXT:    call void @bar5(i32 range(i32 10, 40) [[V]])
738*69a798a9Sgoldsteinn; CHECK-NEXT:    ret void
739*69a798a9Sgoldsteinn;
740*69a798a9Sgoldsteinn  call void @foo4_range_10_40(i32 %v)
741*69a798a9Sgoldsteinn  ret void
742*69a798a9Sgoldsteinn}
743*69a798a9Sgoldsteinn
744*69a798a9Sgoldsteinndefine void @prop_range_direct(i32 %v) {
745*69a798a9Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@prop_range_direct
746*69a798a9Sgoldsteinn; CHECK-SAME: (i32 [[V:%.*]]) {
747*69a798a9Sgoldsteinn; CHECK-NEXT:    call void @bar5(i32 range(i32 1, 11) [[V]])
748*69a798a9Sgoldsteinn; CHECK-NEXT:    ret void
749*69a798a9Sgoldsteinn;
750*69a798a9Sgoldsteinn  call void @foo4(i32 range(i32 1, 11) %v)
751*69a798a9Sgoldsteinn  ret void
752*69a798a9Sgoldsteinn}
753