@@ -860,3 +860,96 @@ _Z3fooPKc.exit:
860
860
%tobool = icmp eq i64 %2 , 0
861
861
ret i1 %tobool
862
862
}
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