Skip to content

Commit af46eae

Browse files
committed
[InstCombine] Add tests for ptrtoint of gep chain (NFC)
1 parent 8caba9a commit af46eae

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed

llvm/test/Transforms/InstCombine/cast_ptr.ll

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,3 +432,67 @@ define i32 @ptr_add_in_int_extra_use2(i32 %x) {
432432
%r = ptrtoint ptr %p2 to i32
433433
ret i32 %r
434434
}
435+
436+
define i32 @ptrtoint_of_inttoptr_multiple_gep(i32 %x, i32 %y, i32 %z) {
437+
; CHECK-LABEL: @ptrtoint_of_inttoptr_multiple_gep(
438+
; CHECK-NEXT: [[PTR:%.*]] = inttoptr i32 [[X:%.*]] to ptr
439+
; CHECK-NEXT: [[PTR2:%.*]] = getelementptr nuw i16, ptr [[PTR]], i32 [[Y:%.*]]
440+
; CHECK-NEXT: [[PTR3:%.*]] = getelementptr i32, ptr [[PTR2]], i32 [[Z:%.*]]
441+
; CHECK-NEXT: [[R:%.*]] = ptrtoint ptr [[PTR3]] to i32
442+
; CHECK-NEXT: ret i32 [[R]]
443+
;
444+
%ptr = inttoptr i32 %x to ptr
445+
%ptr2 = getelementptr nuw i16, ptr %ptr, i32 %y
446+
%ptr3 = getelementptr i32, ptr %ptr2, i32 %z
447+
%r = ptrtoint ptr %ptr3 to i32
448+
ret i32 %r
449+
}
450+
451+
define i32 @ptrtoint_of_inttoptr_multiple_gep_extra_use(i32 %x, i32 %y, i32 %z) {
452+
; CHECK-LABEL: @ptrtoint_of_inttoptr_multiple_gep_extra_use(
453+
; CHECK-NEXT: [[PTR:%.*]] = inttoptr i32 [[X:%.*]] to ptr
454+
; CHECK-NEXT: [[PTR2:%.*]] = getelementptr i16, ptr [[PTR]], i32 [[Y:%.*]]
455+
; CHECK-NEXT: call void @use_ptr(ptr [[PTR2]])
456+
; CHECK-NEXT: [[PTR3:%.*]] = getelementptr i32, ptr [[PTR2]], i32 [[Z:%.*]]
457+
; CHECK-NEXT: [[R:%.*]] = ptrtoint ptr [[PTR3]] to i32
458+
; CHECK-NEXT: ret i32 [[R]]
459+
;
460+
%ptr = inttoptr i32 %x to ptr
461+
%ptr2 = getelementptr i16, ptr %ptr, i32 %y
462+
call void @use_ptr(ptr %ptr2)
463+
%ptr3 = getelementptr i32, ptr %ptr2, i32 %z
464+
%r = ptrtoint ptr %ptr3 to i32
465+
ret i32 %r
466+
}
467+
468+
define i32 @ptrtoint_of_null_multiple_gep(i32 %x, i32 %y, i32 %z) {
469+
; CHECK-LABEL: @ptrtoint_of_null_multiple_gep(
470+
; CHECK-NEXT: [[PTR2:%.*]] = getelementptr i16, ptr null, i32 [[X:%.*]]
471+
; CHECK-NEXT: [[PTR3:%.*]] = getelementptr nuw i32, ptr [[PTR2]], i32 [[Y:%.*]]
472+
; CHECK-NEXT: [[PTR4:%.*]] = getelementptr i64, ptr [[PTR3]], i32 [[Z:%.*]]
473+
; CHECK-NEXT: [[R:%.*]] = ptrtoint ptr [[PTR4]] to i32
474+
; CHECK-NEXT: ret i32 [[R]]
475+
;
476+
%ptr2 = getelementptr i16, ptr null, i32 %x
477+
%ptr3 = getelementptr nuw i32, ptr %ptr2, i32 %y
478+
%ptr4 = getelementptr i64, ptr %ptr3, i32 %z
479+
%r = ptrtoint ptr %ptr4 to i32
480+
ret i32 %r
481+
}
482+
483+
define i32 @ptrtoint_of_null_multiple_gep_extra_use(i32 %x, i32 %y, i32 %z) {
484+
; CHECK-LABEL: @ptrtoint_of_null_multiple_gep_extra_use(
485+
; CHECK-NEXT: [[PTR2:%.*]] = getelementptr i16, ptr null, i32 [[X:%.*]]
486+
; CHECK-NEXT: call void @use_ptr(ptr [[PTR2]])
487+
; CHECK-NEXT: [[PTR3:%.*]] = getelementptr nuw i32, ptr [[PTR2]], i32 [[Y:%.*]]
488+
; CHECK-NEXT: [[PTR4:%.*]] = getelementptr i64, ptr [[PTR3]], i32 [[Z:%.*]]
489+
; CHECK-NEXT: [[R:%.*]] = ptrtoint ptr [[PTR4]] to i32
490+
; CHECK-NEXT: ret i32 [[R]]
491+
;
492+
%ptr2 = getelementptr i16, ptr null, i32 %x
493+
call void @use_ptr(ptr %ptr2)
494+
%ptr3 = getelementptr nuw i32, ptr %ptr2, i32 %y
495+
%ptr4 = getelementptr i64, ptr %ptr3, i32 %z
496+
%r = ptrtoint ptr %ptr4 to i32
497+
ret i32 %r
498+
}

0 commit comments

Comments
 (0)