@@ -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