Skip to content

Commit fc8f2c2

Browse files
committed
Add tests for difference of nested GEPs
1 parent d74831e commit fc8f2c2

File tree

1 file changed

+93
-0
lines changed

1 file changed

+93
-0
lines changed

llvm/test/Transforms/InstCombine/sub-gep.ll

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -860,3 +860,96 @@ _Z3fooPKc.exit:
860860
%tobool = icmp eq i64 %2, 0
861861
ret i1 %tobool
862862
}
863+
864+
define i64 @multiple_geps_one_chain(ptr %base, i64 %idx, i64 %idx2) {
865+
; CHECK-LABEL: @multiple_geps_one_chain(
866+
; CHECK-NEXT: [[P2:%.*]] = getelementptr inbounds i32, ptr [[BASE:%.*]], i64 [[IDX:%.*]]
867+
; CHECK-NEXT: [[P3:%.*]] = getelementptr inbounds i32, ptr [[P2]], i64 [[IDX2:%.*]]
868+
; CHECK-NEXT: [[I1:%.*]] = ptrtoint ptr [[BASE]] to i64
869+
; CHECK-NEXT: [[I2:%.*]] = ptrtoint ptr [[P3]] to i64
870+
; CHECK-NEXT: [[D:%.*]] = sub i64 [[I2]], [[I1]]
871+
; CHECK-NEXT: ret i64 [[D]]
872+
;
873+
%p2 = getelementptr inbounds i32, ptr %base, i64 %idx
874+
%p3 = getelementptr inbounds i32, ptr %p2, i64 %idx2
875+
%i1 = ptrtoint ptr %base to i64
876+
%i2 = ptrtoint ptr %p3 to i64
877+
%d = sub i64 %i2, %i1
878+
ret i64 %d
879+
}
880+
881+
define i64 @multiple_geps_one_chain_commuted(ptr %base, i64 %idx, i64 %idx2) {
882+
; CHECK-LABEL: @multiple_geps_one_chain_commuted(
883+
; CHECK-NEXT: [[P2:%.*]] = getelementptr inbounds i32, ptr [[BASE:%.*]], i64 [[IDX:%.*]]
884+
; CHECK-NEXT: [[P3:%.*]] = getelementptr inbounds i32, ptr [[P2]], i64 [[IDX2:%.*]]
885+
; CHECK-NEXT: [[I1:%.*]] = ptrtoint ptr [[BASE]] to i64
886+
; CHECK-NEXT: [[I2:%.*]] = ptrtoint ptr [[P3]] to i64
887+
; CHECK-NEXT: [[D:%.*]] = sub i64 [[I1]], [[I2]]
888+
; CHECK-NEXT: ret i64 [[D]]
889+
;
890+
%p2 = getelementptr inbounds i32, ptr %base, i64 %idx
891+
%p3 = getelementptr inbounds i32, ptr %p2, i64 %idx2
892+
%i1 = ptrtoint ptr %base to i64
893+
%i2 = ptrtoint ptr %p3 to i64
894+
%d = sub i64 %i1, %i2
895+
ret i64 %d
896+
}
897+
898+
define i64 @multiple_geps_two_chains(ptr %base, i64 %idx, i64 %idx2, i64 %idx3) {
899+
; CHECK-LABEL: @multiple_geps_two_chains(
900+
; CHECK-NEXT: [[P2:%.*]] = getelementptr inbounds i32, ptr [[BASE:%.*]], i64 [[IDX:%.*]]
901+
; CHECK-NEXT: [[P3:%.*]] = getelementptr inbounds i32, ptr [[P2]], i64 [[IDX2:%.*]]
902+
; CHECK-NEXT: [[P4:%.*]] = getelementptr inbounds i32, ptr [[BASE]], i64 [[IDX3:%.*]]
903+
; CHECK-NEXT: [[I1:%.*]] = ptrtoint ptr [[P4]] to i64
904+
; CHECK-NEXT: [[I2:%.*]] = ptrtoint ptr [[P3]] to i64
905+
; CHECK-NEXT: [[D:%.*]] = sub i64 [[I2]], [[I1]]
906+
; CHECK-NEXT: ret i64 [[D]]
907+
;
908+
%p2 = getelementptr inbounds i32, ptr %base, i64 %idx
909+
%p3 = getelementptr inbounds i32, ptr %p2, i64 %idx2
910+
%p4 = getelementptr inbounds i32, ptr %base, i64 %idx3
911+
%i1 = ptrtoint ptr %p4 to i64
912+
%i2 = ptrtoint ptr %p3 to i64
913+
%d = sub i64 %i2, %i1
914+
ret i64 %d
915+
}
916+
917+
define i64 @multiple_geps_two_chains_commuted(ptr %base, i64 %idx, i64 %idx2, i64 %idx3) {
918+
; CHECK-LABEL: @multiple_geps_two_chains_commuted(
919+
; CHECK-NEXT: [[P2:%.*]] = getelementptr inbounds i32, ptr [[BASE:%.*]], i64 [[IDX:%.*]]
920+
; CHECK-NEXT: [[P3:%.*]] = getelementptr inbounds i32, ptr [[P2]], i64 [[IDX2:%.*]]
921+
; CHECK-NEXT: [[P4:%.*]] = getelementptr inbounds i32, ptr [[BASE]], i64 [[IDX3:%.*]]
922+
; CHECK-NEXT: [[I1:%.*]] = ptrtoint ptr [[P4]] to i64
923+
; CHECK-NEXT: [[I2:%.*]] = ptrtoint ptr [[P3]] to i64
924+
; CHECK-NEXT: [[D:%.*]] = sub i64 [[I1]], [[I2]]
925+
; CHECK-NEXT: ret i64 [[D]]
926+
;
927+
%p2 = getelementptr inbounds i32, ptr %base, i64 %idx
928+
%p3 = getelementptr inbounds i32, ptr %p2, i64 %idx2
929+
%p4 = getelementptr inbounds i32, ptr %base, i64 %idx3
930+
%i1 = ptrtoint ptr %p4 to i64
931+
%i2 = ptrtoint ptr %p3 to i64
932+
%d = sub i64 %i1, %i2
933+
ret i64 %d
934+
}
935+
936+
define i64 @multiple_geps_two_chains_gep_base(ptr %base, i64 %base.idx, i64 %idx, i64 %idx2, i64 %idx3) {
937+
; CHECK-LABEL: @multiple_geps_two_chains_gep_base(
938+
; CHECK-NEXT: [[GEP_BASE:%.*]] = getelementptr inbounds i32, ptr [[BASE:%.*]], i64 [[BASE_IDX:%.*]]
939+
; CHECK-NEXT: [[P2:%.*]] = getelementptr inbounds i32, ptr [[GEP_BASE]], i64 [[IDX:%.*]]
940+
; CHECK-NEXT: [[P3:%.*]] = getelementptr inbounds i32, ptr [[P2]], i64 [[IDX2:%.*]]
941+
; CHECK-NEXT: [[P4:%.*]] = getelementptr inbounds i32, ptr [[GEP_BASE]], i64 [[IDX3:%.*]]
942+
; CHECK-NEXT: [[I1:%.*]] = ptrtoint ptr [[P4]] to i64
943+
; CHECK-NEXT: [[I2:%.*]] = ptrtoint ptr [[P3]] to i64
944+
; CHECK-NEXT: [[D:%.*]] = sub i64 [[I2]], [[I1]]
945+
; CHECK-NEXT: ret i64 [[D]]
946+
;
947+
%gep.base = getelementptr inbounds i32, ptr %base, i64 %base.idx
948+
%p2 = getelementptr inbounds i32, ptr %gep.base, i64 %idx
949+
%p3 = getelementptr inbounds i32, ptr %p2, i64 %idx2
950+
%p4 = getelementptr inbounds i32, ptr %gep.base, i64 %idx3
951+
%i1 = ptrtoint ptr %p4 to i64
952+
%i2 = ptrtoint ptr %p3 to i64
953+
%d = sub i64 %i2, %i1
954+
ret i64 %d
955+
}

0 commit comments

Comments
 (0)