@@ -449,6 +449,115 @@ define i64 @negative_zext_ptrtoint_sub_ptrtoint_as2_nuw(i32 %offset) {
449449 ret i64 %D
450450}
451451
452+ define i64 @ptrtoint_sub_zext_ptrtoint_as2_inbounds_local (ptr addrspace (2 ) %p , i32 %offset ) {
453+ ; CHECK-LABEL: @ptrtoint_sub_zext_ptrtoint_as2_inbounds_local(
454+ ; CHECK-NEXT: [[A:%.*]] = getelementptr inbounds bfloat, ptr addrspace(2) [[P:%.*]], i32 [[OFFSET:%.*]]
455+ ; CHECK-NEXT: [[B:%.*]] = ptrtoint ptr addrspace(2) [[A]] to i32
456+ ; CHECK-NEXT: [[C:%.*]] = zext i32 [[B]] to i64
457+ ; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(2) [[P]] to i32
458+ ; CHECK-NEXT: [[CC:%.*]] = zext i32 [[TMP1]] to i64
459+ ; CHECK-NEXT: [[D:%.*]] = sub nsw i64 [[CC]], [[C]]
460+ ; CHECK-NEXT: ret i64 [[D]]
461+ ;
462+ %A = getelementptr inbounds bfloat, ptr addrspace (2 ) %p , i32 %offset
463+ %B = ptrtoint ptr addrspace (2 ) %A to i32
464+ %C = zext i32 %B to i64
465+ %CC = ptrtoint ptr addrspace (2 ) %p to i64
466+ %D = sub i64 %CC , %C
467+ ret i64 %D
468+ }
469+
470+ define i64 @zext_ptrtoint_sub_ptrtoint_as2_nusw_local (ptr addrspace (2 ) %p , i32 %offset ) {
471+ ; CHECK-LABEL: @zext_ptrtoint_sub_ptrtoint_as2_nusw_local(
472+ ; CHECK-NEXT: [[A_IDX:%.*]] = shl nsw i32 [[OFFSET:%.*]], 1
473+ ; CHECK-NEXT: [[D:%.*]] = sext i32 [[A_IDX]] to i64
474+ ; CHECK-NEXT: ret i64 [[D]]
475+ ;
476+ %A = getelementptr nusw bfloat, ptr addrspace (2 ) %p , i32 %offset
477+ %B = ptrtoint ptr addrspace (2 ) %A to i32
478+ %C = zext i32 %B to i64
479+ %CC = ptrtoint ptr addrspace (2 ) %p to i64
480+ %D = sub i64 %C , %CC
481+ ret i64 %D
482+ }
483+
484+ define i64 @zext_ptrtoint_sub_ptrtoint_as2_nuw_local (ptr addrspace (2 ) %p , i32 %offset ) {
485+ ; CHECK-LABEL: @zext_ptrtoint_sub_ptrtoint_as2_nuw_local(
486+ ; CHECK-NEXT: [[A_IDX:%.*]] = shl nuw i32 [[OFFSET:%.*]], 1
487+ ; CHECK-NEXT: [[D:%.*]] = zext i32 [[A_IDX]] to i64
488+ ; CHECK-NEXT: ret i64 [[D]]
489+ ;
490+ %A = getelementptr nuw bfloat, ptr addrspace (2 ) %p , i32 %offset
491+ %B = ptrtoint ptr addrspace (2 ) %A to i32
492+ %C = zext i32 %B to i64
493+ %CC = ptrtoint ptr addrspace (2 ) %p to i64
494+ %D = sub i64 %C , %CC
495+ ret i64 %D
496+ }
497+
498+ define i64 @zext_ptrtoint_sub_ptrtoint_as2_nusw_nuw_local (ptr addrspace (2 ) %p , i32 %offset ) {
499+ ; CHECK-LABEL: @zext_ptrtoint_sub_ptrtoint_as2_nusw_nuw_local(
500+ ; CHECK-NEXT: [[A_IDX:%.*]] = shl nuw nsw i32 [[OFFSET:%.*]], 1
501+ ; CHECK-NEXT: [[D:%.*]] = zext nneg i32 [[A_IDX]] to i64
502+ ; CHECK-NEXT: ret i64 [[D]]
503+ ;
504+ %A = getelementptr nusw nuw bfloat, ptr addrspace (2 ) %p , i32 %offset
505+ %B = ptrtoint ptr addrspace (2 ) %A to i32
506+ %C = zext i32 %B to i64
507+ %CC = ptrtoint ptr addrspace (2 ) %p to i64
508+ %D = sub i64 %C , %CC
509+ ret i64 %D
510+ }
511+
512+ define i64 @zext_ptrtoint_sub_zext_ptrtoint_as2_nusw_local (ptr addrspace (2 ) %p , i32 %offset ) {
513+ ; CHECK-LABEL: @zext_ptrtoint_sub_zext_ptrtoint_as2_nusw_local(
514+ ; CHECK-NEXT: [[A_IDX:%.*]] = shl nsw i32 [[OFFSET:%.*]], 1
515+ ; CHECK-NEXT: [[E:%.*]] = sext i32 [[A_IDX]] to i64
516+ ; CHECK-NEXT: ret i64 [[E]]
517+ ;
518+ %A = getelementptr nusw bfloat, ptr addrspace (2 ) %p , i32 %offset
519+ %B = ptrtoint ptr addrspace (2 ) %A to i32
520+ %C = zext i32 %B to i64
521+ %CC = ptrtoint ptr addrspace (2 ) %p to i32
522+ %D = zext i32 %CC to i64
523+ %E = sub i64 %C , %D
524+ ret i64 %E
525+ }
526+
527+ define i64 @zext_ptrtoint_sub_zext_ptrtoint_as2_nuw_local (ptr addrspace (2 ) %p , i32 %offset ) {
528+ ; CHECK-LABEL: @zext_ptrtoint_sub_zext_ptrtoint_as2_nuw_local(
529+ ; CHECK-NEXT: [[A_IDX:%.*]] = shl nuw i32 [[OFFSET:%.*]], 1
530+ ; CHECK-NEXT: [[E:%.*]] = zext i32 [[A_IDX]] to i64
531+ ; CHECK-NEXT: ret i64 [[E]]
532+ ;
533+ %A = getelementptr nuw bfloat, ptr addrspace (2 ) %p , i32 %offset
534+ %B = ptrtoint ptr addrspace (2 ) %A to i32
535+ %C = zext i32 %B to i64
536+ %CC = ptrtoint ptr addrspace (2 ) %p to i32
537+ %D = zext i32 %CC to i64
538+ %E = sub i64 %C , %D
539+ ret i64 %E
540+ }
541+
542+ define i64 @negative_zext_ptrtoint_sub_ptrtoint_as2_nuw_local (ptr addrspace (2 ) %p , i32 %offset ) {
543+ ; CHECK-LABEL: @negative_zext_ptrtoint_sub_ptrtoint_as2_nuw_local(
544+ ; CHECK-NEXT: [[A:%.*]] = getelementptr nuw bfloat, ptr addrspace(2) [[P:%.*]], i32 [[OFFSET:%.*]]
545+ ; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(2) [[A]] to i32
546+ ; CHECK-NEXT: [[B_MASK:%.*]] = and i32 [[TMP1]], 65535
547+ ; CHECK-NEXT: [[C:%.*]] = zext nneg i32 [[B_MASK]] to i64
548+ ; CHECK-NEXT: [[TMP2:%.*]] = ptrtoint ptr addrspace(2) [[P]] to i32
549+ ; CHECK-NEXT: [[CC:%.*]] = zext i32 [[TMP2]] to i64
550+ ; CHECK-NEXT: [[D:%.*]] = sub nsw i64 [[C]], [[CC]]
551+ ; CHECK-NEXT: ret i64 [[D]]
552+ ;
553+ %A = getelementptr nuw bfloat, ptr addrspace (2 ) %p , i32 %offset
554+ %B = ptrtoint ptr addrspace (2 ) %A to i16
555+ %C = zext i16 %B to i64
556+ %CC = ptrtoint ptr addrspace (2 ) %p to i64
557+ %D = sub i64 %C , %CC
558+ ret i64 %D
559+ }
560+
452561define i64 @test30 (ptr %foo , i64 %i , i64 %j ) {
453562; CHECK-LABEL: @test30(
454563; CHECK-NEXT: [[GEP1_IDX:%.*]] = shl nsw i64 [[I:%.*]], 2
0 commit comments