Lines Matching refs:ptr

4 define ptr @bitcast_opaque_to_opaque(ptr %a) {
6 ; CHECK-NEXT: ret ptr [[A:%.*]]
8 %b = bitcast ptr %a to ptr
9 ret ptr %b
12 define ptr @bitcast_typed_to_opaque(i8* %a) {
14 ; CHECK-NEXT: ret ptr [[A:%.*]]
16 %b = bitcast i8* %a to ptr
17 ret ptr %b
20 define i8* @bitcast_opaque_to_typed(ptr %a) {
22 ; CHECK-NEXT: ret ptr [[A:%.*]]
24 %b = bitcast ptr %a to i8*
29 define ptr @bitcast_typed_to_opaque_constexpr() {
31 ; CHECK-NEXT: ret ptr @g
33 ret ptr bitcast (i8* @g to ptr)
36 define ptr @addrspacecast_opaque_to_opaque(ptr addrspace(1) %a) {
38 ; CHECK-NEXT: [[B:%.*]] = addrspacecast ptr addrspace(1) [[A:%.*]] to ptr
39 ; CHECK-NEXT: ret ptr [[B]]
41 %b = addrspacecast ptr addrspace(1) %a to ptr
42 ret ptr %b
45 define ptr @addrspacecast_typed_to_opaque(i8 addrspace(1)* %a) {
47 ; CHECK-NEXT: [[B:%.*]] = addrspacecast ptr addrspace(1) [[A:%.*]] to ptr
48 ; CHECK-NEXT: ret ptr [[B]]
50 %b = addrspacecast i8 addrspace(1)* %a to ptr
51 ret ptr %b
54 define i8* @addrspacecast_opaque_to_typed(ptr addrspace(1) %a) {
56 ; CHECK-NEXT: [[B:%.*]] = addrspacecast ptr addrspace(1) [[A:%.*]] to ptr
57 ; CHECK-NEXT: ret ptr [[B]]
59 %b = addrspacecast ptr addrspace(1) %a to i8*
63 define ptr addrspace(1) @bitcast_and_addrspacecast_eliminable(ptr %a) {
65 ; CHECK-NEXT: [[C:%.*]] = addrspacecast ptr [[A:%.*]] to ptr addrspace(1)
66 ; CHECK-NEXT: ret ptr addrspace(1) [[C]]
68 %b = bitcast ptr %a to i8*
69 %c = addrspacecast i8* %b to ptr addrspace(1)
70 ret ptr addrspace(1) %c
73 define ptr addrspace(1) @addrspacecast_typed_to_opaque_constexpr() {
75 ; CHECK-NEXT: ret ptr addrspace(1) addrspacecast (ptr @g to ptr addrspace(1))
77 ret ptr addrspace(1) addrspacecast (i8* @g to ptr addrspace(1))
80 define ptr @gep_constexpr_1(ptr %a) {
82 ; CHECK-NEXT: ret ptr inttoptr (i64 6 to ptr)
84 ret ptr getelementptr (i16, ptr null, i32 3)
87 define ptr @gep_constexpr_2(ptr %a) {
89 ; CHECK-NEXT: ret ptr getelementptr (i8, ptr @g, i64 3)
91 ret ptr getelementptr (i8, ptr bitcast (i8* @g to ptr), i32 3)
94 define ptr addrspace(1) @gep_constexpr_3(ptr %a) {
96 ; CHECK-NEXT: ret ptr addrspace(1) getelementptr (i8, ptr addrspace(1) addrspacecast (ptr @g to
98 …ret ptr addrspace(1) getelementptr ([0 x i8], ptr addrspace(1) addrspacecast (i8* @g to ptr addrsp…
101 define ptr @load_bitcast_1(ptr %a) {
103 ; CHECK-NEXT: [[B1:%.*]] = load ptr, ptr [[A:%.*]], align 8
104 ; CHECK-NEXT: ret ptr [[B1]]
106 %b = load i8*, ptr %a
107 %c = bitcast i8* %b to ptr
108 ret ptr %c
111 define ptr @load_bitcast_2(ptr %a) {
113 ; CHECK-NEXT: [[C1:%.*]] = load ptr, ptr [[A:%.*]], align 8
114 ; CHECK-NEXT: ret ptr [[C1]]
116 %b = bitcast ptr %a to i8**
118 %d = bitcast i8* %c to ptr
119 ret ptr %d
122 define void @call(ptr %a) {
134 ; CHECK-NEXT: call void (...) @varargs(ptr byval(i32) [[A:%.*]])
137 %b = bitcast i32* %a to ptr
138 call void (...) @varargs(ptr byval(i32) %b)
144 ; CHECK-NEXT: call void (...) @varargs(ptr byval(float) [[A:%.*]])
147 %b = bitcast i32* %a to ptr
148 call void (...) @varargs(ptr byval(float) %b)
154 ; CHECK-NEXT: call void (...) @varargs(ptr byval(i64) [[A:%.*]])
157 %b = bitcast i32* %a to ptr
158 call void (...) @varargs(ptr byval(i64) %b)
162 define void @varargs_cast_opaque_to_typed(ptr %a) {
164 ; CHECK-NEXT: call void (...) @varargs(ptr byval(i8) [[A:%.*]])
167 %b = bitcast ptr %a to i8*
172 define ptr @geps_combinable(ptr %a) {
174 ; CHECK-NEXT: [[A3:%.*]] = getelementptr { i32, { i32, i32 } }, ptr [[A:%.*]], i64 0, i32 1, i32…
175 ; CHECK-NEXT: ret ptr [[A3]]
177 %a2 = getelementptr { i32, { i32, i32 } }, ptr %a, i32 0, i32 1
178 %a3 = getelementptr { i32, i32 }, ptr %a2, i32 0, i32 1
179 ret ptr %a3
182 define ptr @geps_combinable_different_elem_type1(ptr %a) {
184 ; CHECK-NEXT: [[A3:%.*]] = getelementptr { i32, i32 }, ptr [[A:%.*]], i64 1
185 ; CHECK-NEXT: ret ptr [[A3]]
187 %a2 = getelementptr { i32, i32 }, ptr %a, i32 0, i32 1
188 %a3 = getelementptr { i32, i32 }, ptr %a2, i32 0, i32 1
189 ret ptr %a3
192 define ptr @geps_combinable_different_elem_type2(ptr %a) {
194 ; CHECK-NEXT: [[A3:%.*]] = getelementptr { i32, i32 }, ptr [[A:%.*]], i64 1
195 ; CHECK-NEXT: ret ptr [[A3]]
197 %a2 = getelementptr { i32, i32 }, ptr %a, i32 0, i32 1
198 %a3 = getelementptr i8, ptr %a2, i64 4
199 ret ptr %a3
202 define ptr @geps_combinable_different_elem_type3(ptr %a) {
204 ; CHECK-NEXT: [[A3:%.*]] = getelementptr { i32, i32 }, ptr [[A:%.*]], i64 1, i32 1
205 ; CHECK-NEXT: ret ptr [[A3]]
207 %a2 = getelementptr { i32, i32 }, ptr %a, i32 0, i32 1
208 %a3 = getelementptr i8, ptr %a2, i64 8
209 ret ptr %a3
212 define ptr @geps_combinable_different_elem_type4(ptr %a) {
214 ; CHECK-NEXT: [[A3:%.*]] = getelementptr i8, ptr [[A:%.*]], i64 14
215 ; CHECK-NEXT: ret ptr [[A3]]
217 %a2 = getelementptr { i32, i32 }, ptr %a, i32 0, i32 1
218 %a3 = getelementptr i8, ptr %a2, i64 10
219 ret ptr %a3
222 define ptr @geps_combinable_different_elem_type5(ptr %a) {
224 ; CHECK-NEXT: ret ptr [[A:%.*]]
226 %a2 = getelementptr { i32, i32 }, ptr %a, i32 0, i32 1
227 %a3 = getelementptr i8, ptr %a2, i64 -4
228 ret ptr %a3
231 define ptr @geps_combinable_different_elem_type6(ptr %a, i64 %idx) {
233 ; CHECK-NEXT: [[A3:%.*]] = getelementptr { i32, i32 }, ptr [[A:%.*]], i64 [[IDX:%.*]], i32 1
234 ; CHECK-NEXT: ret ptr [[A3]]
236 %a2 = getelementptr { i32, i32 }, ptr %a, i64 %idx
237 %a3 = getelementptr i8, ptr %a2, i64 4
238 ret ptr %a3
241 define ptr @geps_combinable_different_elem_type7(ptr %a, i64 %idx) {
243 ; CHECK-NEXT: [[A2:%.*]] = getelementptr { i32, i32 }, ptr [[A:%.*]], i64 [[IDX:%.*]], i32 1
244 ; CHECK-NEXT: [[A3:%.*]] = getelementptr i8, ptr [[A2]], i64 4
245 ; CHECK-NEXT: ret ptr [[A3]]
247 %a2 = getelementptr { i32, i32 }, ptr %a, i64 %idx, i32 1
248 %a3 = getelementptr i8, ptr %a2, i64 4
249 ret ptr %a3
252 define ptr @geps_combinable_different_elem_type8(ptr %a, i64 %idx) {
254 ; CHECK-NEXT: [[A2:%.*]] = getelementptr inbounds { { i32, i32 } }, ptr [[A:%.*]], i64 [[IDX:%.*…
255 ; CHECK-NEXT: [[A3:%.*]] = getelementptr inbounds i8, ptr [[A2]], i64 4
256 ; CHECK-NEXT: ret ptr [[A3]]
258 %a2 = getelementptr inbounds { { i32, i32 } }, ptr %a, i64 %idx, i32 0, i32 1
259 %a3 = getelementptr inbounds i8, ptr %a2, i32 4
260 ret ptr %a3
263 define ptr @geps_combinable_different_elem_type9(ptr %a, i64 %idx) {
265 ; CHECK-NEXT: [[A3:%.*]] = getelementptr inbounds { { i32, i32 } }, ptr [[A:%.*]], i64 [[IDX:%.*…
266 ; CHECK-NEXT: ret ptr [[A3]]
268 %a2 = getelementptr inbounds { { i32, i32 } }, ptr %a, i64 %idx, i32 0, i32 1
269 %a3 = getelementptr inbounds i8, ptr %a2, i32 -4
270 ret ptr %a3
273 declare void @use(ptr)
275 define ptr @geps_combinable_different_elem_type_extra_use1(ptr %a) {
277 ; CHECK-NEXT: [[A2:%.*]] = getelementptr { i32, i32 }, ptr [[A:%.*]], i64 0, i32 1
278 ; CHECK-NEXT: call void @use(ptr [[A2]])
279 ; CHECK-NEXT: [[A3:%.*]] = getelementptr { i32, i32 }, ptr [[A]], i64 1
280 ; CHECK-NEXT: ret ptr [[A3]]
282 %a2 = getelementptr { i32, i32 }, ptr %a, i32 0, i32 1
283 call void @use(ptr %a2)
284 %a3 = getelementptr i8, ptr %a2, i64 4
285 ret ptr %a3
288 define ptr @geps_combinable_different_elem_type_extra_use2(ptr %a, i64 %idx) {
290 ; CHECK-NEXT: [[A2:%.*]] = getelementptr { i32, i32 }, ptr [[A:%.*]], i64 [[IDX:%.*]]
291 ; CHECK-NEXT: call void @use(ptr [[A2]])
292 ; CHECK-NEXT: [[A3:%.*]] = getelementptr i8, ptr [[A2]], i64 4
293 ; CHECK-NEXT: ret ptr [[A3]]
295 %a2 = getelementptr { i32, i32 }, ptr %a, i64 %idx
296 call void @use(ptr %a2)
297 %a3 = getelementptr i8, ptr %a2, i64 4
298 ret ptr %a3
301 define ptr @geps_combinable_scalable(ptr %a, i64 %idx) {
303 ; CHECK-NEXT: [[A2:%.*]] = getelementptr inbounds <vscale x 2 x i32>, ptr [[A:%.*]], i64 1
304 ; CHECK-NEXT: [[A3:%.*]] = getelementptr inbounds i8, ptr [[A2]], i64 4
305 ; CHECK-NEXT: ret ptr [[A3]]
307 %a2 = getelementptr inbounds <vscale x 2 x i32>, ptr %a, i64 1
308 %a3 = getelementptr inbounds i8, ptr %a2, i32 4
309 ret ptr %a3
312 define i1 @compare_geps_same_indices(ptr %a, ptr %b, i64 %idx) {
314 ; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[A:%.*]], [[B:%.*]]
317 %a2 = getelementptr i32, ptr %a, i64 %idx
318 %b2 = getelementptr i32, ptr %b, i64 %idx
319 %c = icmp eq ptr %a2, %b2
323 define i1 @compare_geps_same_indices_different_types(ptr %a, ptr %b, i64 %idx) {
325 ; CHECK-NEXT: [[A2:%.*]] = getelementptr i32, ptr [[A:%.*]], i64 [[IDX:%.*]]
326 ; CHECK-NEXT: [[B2:%.*]] = getelementptr i64, ptr [[B:%.*]], i64 [[IDX]]
327 ; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[A2]], [[B2]]
330 %a2 = getelementptr i32, ptr %a, i64 %idx
331 %b2 = getelementptr i64, ptr %b, i64 %idx
332 %c = icmp eq ptr %a2, %b2
336 define <4 x i1> @compare_geps_same_indices_scalar_vector_base_mismatch(ptr %ptr, <4 x ptr> %ptrs) {
338 ; CHECK-NEXT: [[GEP1:%.*]] = getelementptr i16, <4 x ptr> [[PTRS:%.*]], <4 x i64> <i64 1, i64 2,…
339 ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i16, ptr [[PTR:%.*]], <4 x i64> <i64 1, i64 2, i64 3,…
340 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq <4 x ptr> [[GEP1]], [[GEP2]]
343 %gep1 = getelementptr i16, <4 x ptr> %ptrs, <4 x i64> <i64 1, i64 2, i64 3, i64 4>
344 %gep2 = getelementptr i16, ptr %ptr, <4 x i64> <i64 1, i64 2, i64 3, i64 4>
345 %cmp = icmp eq <4 x ptr> %gep1, %gep2
349 define ptr @indexed_compare(ptr %A, i64 %offset) {
359 ; CHECK-NEXT: [[RHS_PTR:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[RHS_IDX]]
360 ; CHECK-NEXT: ret ptr [[RHS_PTR]]
363 %tmp = getelementptr inbounds i32, ptr %A, i64 %offset
367 %RHS = phi ptr [ %RHS.next, %bb ], [ %tmp, %entry ]
368 %LHS = getelementptr inbounds i32, ptr %A, i32 100
369 %RHS.next = getelementptr inbounds i32, ptr %RHS, i64 1
370 %cond = icmp ult ptr %LHS, %RHS
374 ret ptr %RHS
377 define ptr @indexed_compare_different_types(ptr %A, i64 %offset) {
380 ; CHECK-NEXT: [[TMP:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[OFFSET:%.*]]
383 ; CHECK-NEXT: [[RHS:%.*]] = phi ptr [ [[RHS_NEXT:%.*]], [[BB]] ], [ [[TMP]], [[ENTRY:%.*]] ]
384 ; CHECK-NEXT: [[LHS:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 100
385 ; CHECK-NEXT: [[RHS_NEXT]] = getelementptr inbounds i32, ptr [[RHS]], i64 1
386 ; CHECK-NEXT: [[COND:%.*]] = icmp ult ptr [[LHS]], [[RHS]]
389 ; CHECK-NEXT: ret ptr [[RHS]]
392 %tmp = getelementptr inbounds i32, ptr %A, i64 %offset
396 %RHS = phi ptr [ %RHS.next, %bb ], [ %tmp, %entry ]
397 %LHS = getelementptr inbounds i64, ptr %A, i32 100
398 %RHS.next = getelementptr inbounds i32, ptr %RHS, i64 1
399 %cond = icmp ult ptr %LHS, %RHS
403 ret ptr %RHS
406 define ptr addrspace(1) @gep_of_addrspace_cast(ptr %ptr) {
408 ; CHECK-NEXT: [[CAST1:%.*]] = addrspacecast ptr [[PTR:%.*]] to ptr addrspace(1)
409 ; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i32, ptr addrspace(1) [[CAST1]], i64 1
410 ; CHECK-NEXT: ret ptr addrspace(1) [[GEP]]
412 %cast1 = addrspacecast ptr %ptr to ptr addrspace(1)
413 %gep = getelementptr inbounds i32, ptr addrspace(1) %cast1, i64 1
414 ret ptr addrspace(1) %gep
417 define i1 @cmp_gep_same_base_same_type(ptr %ptr, i64 %idx1, i64 %idx2) {
422 %gep1 = getelementptr inbounds i32, ptr %ptr, i64 %idx1
423 %gep2 = getelementptr inbounds i32, ptr %ptr, i64 %idx2
424 %cmp = icmp ult ptr %gep1, %gep2
428 define i1 @cmp_gep_same_base_different_type(ptr %ptr, i64 %idx1, i64 %idx2) {
435 %gep1 = getelementptr inbounds i32, ptr %ptr, i64 %idx1
436 %gep2 = getelementptr inbounds i64, ptr %ptr, i64 %idx2
437 %cmp = icmp ult ptr %gep1, %gep2
448 %gep = getelementptr [4 x i8], ptr @ary, i64 0, i64 %idx
449 %load = load i8, ptr %gep
456 ; CHECK-NEXT: [[GEP:%.*]] = getelementptr [4 x i8], ptr @ary, i64 0, i64 [[IDX:%.*]]
457 ; CHECK-NEXT: [[LOAD:%.*]] = load i16, ptr [[GEP]], align 2
461 %gep = getelementptr [4 x i8], ptr @ary, i64 0, i64 %idx
462 %load = load i16, ptr %gep
469 ; CHECK-NEXT: [[GEP:%.*]] = getelementptr [4 x i16], ptr @ary, i64 0, i64 [[IDX:%.*]]
470 ; CHECK-NEXT: [[LOAD:%.*]] = load i16, ptr [[GEP]], align 2
474 %gep = getelementptr [4 x i16], ptr @ary, i64 0, i64 %idx
475 %load = load i16, ptr %gep
480 define ptr @phi_of_gep(i1 %c, ptr %p) {
488 ; CHECK-NEXT: [[PHI:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 1
489 ; CHECK-NEXT: ret ptr [[PHI]]
494 %gep1 = getelementptr i32, ptr %p, i64 1
498 %gep2 = getelementptr i32, ptr %p, i64 1
502 %phi = phi ptr [ %gep1, %if ], [ %gep2, %else ]
503 ret ptr %phi
506 define ptr @phi_of_gep_different_type(i1 %c, ptr %p) {
510 ; CHECK-NEXT: [[GEP1:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 1
513 ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i64, ptr [[P]], i64 1
516 ; CHECK-NEXT: [[PHI:%.*]] = phi ptr [ [[GEP1]], [[IF]] ], [ [[GEP2]], [[ELSE]] ]
517 ; CHECK-NEXT: ret ptr [[PHI]]
522 %gep1 = getelementptr i32, ptr %p, i64 1
526 %gep2 = getelementptr i64, ptr %p, i64 1
530 %phi = phi ptr [ %gep1, %if ], [ %gep2, %else ]
531 ret ptr %phi
534 define ptr @gep_of_phi_of_gep(i1 %c, ptr %p) {
543 ; CHECK-NEXT: [[TMP2:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 [[TMP1]]
544 ; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, ptr [[TMP2]], i64 1
545 ; CHECK-NEXT: ret ptr [[GEP]]
550 %gep1 = getelementptr i32, ptr %p, i64 1
554 %gep2 = getelementptr i32, ptr %p, i64 2
558 %phi = phi ptr [ %gep1, %if ], [ %gep2, %else ]
559 %gep = getelementptr i32, ptr %phi, i64 1
560 ret ptr %gep
563 define ptr @gep_of_phi_of_gep_different_type(i1 %c, ptr %p) {
567 ; CHECK-NEXT: [[GEP1:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 1
570 ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i64, ptr [[P]], i64 2
573 ; CHECK-NEXT: [[PHI:%.*]] = phi ptr [ [[GEP1]], [[IF]] ], [ [[GEP2]], [[ELSE]] ]
574 ; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, ptr [[PHI]], i64 1
575 ; CHECK-NEXT: ret ptr [[GEP]]
580 %gep1 = getelementptr i32, ptr %p, i64 1
584 %gep2 = getelementptr i64, ptr %p, i64 2
588 %phi = phi ptr [ %gep1, %if ], [ %gep2, %else ]
589 %gep = getelementptr i32, ptr %phi, i64 1
590 ret ptr %gep
593 define ptr @select_of_gep(i1 %c, ptr %p) {
596 ; CHECK-NEXT: [[S:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 [[S_V]]
597 ; CHECK-NEXT: ret ptr [[S]]
599 %gep1 = getelementptr i32, ptr %p, i64 1
600 %gep2 = getelementptr i32, ptr %p, i64 2
601 %s = select i1 %c, ptr %gep1, ptr %gep2
602 ret ptr %s
605 define ptr @select_of_gep_different_type(i1 %c, ptr %p) {
607 ; CHECK-NEXT: [[GEP1:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 1
608 ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i64, ptr [[P]], i64 2
609 ; CHECK-NEXT: [[S:%.*]] = select i1 [[C:%.*]], ptr [[GEP1]], ptr [[GEP2]]
610 ; CHECK-NEXT: ret ptr [[S]]
612 %gep1 = getelementptr i32, ptr %p, i64 1
613 %gep2 = getelementptr i64, ptr %p, i64 2
614 %s = select i1 %c, ptr %gep1, ptr %gep2
615 ret ptr %s
618 define void @dse(ptr %p) {
620 ; CHECK-NEXT: store i32 0, ptr [[P:%.*]], align 4
621 ; CHECK-NEXT: store i8 1, ptr [[P]], align 1
624 store i32 0, ptr %p
625 store i8 1, ptr %p
630 declare void @call_byval(i64, ptr byval(i64))
632 define void @call_cast_ptr_to_int(ptr %p) {
634 ; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[P:%.*]] to i64
638 call void @call_i64(ptr %p)
642 define void @call_cast_byval(ptr %p, ptr %p2) {
644 ; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[P:%.*]] to i64
645 ; CHECK-NEXT: call void @call_byval(i64 [[TMP1]], ptr byval(double) [[P2:%.*]])
648 call void @call_byval(ptr %p, ptr byval(double) %p2)