@@ -785,3 +785,68 @@ define i1 @gep_diff_base_same_indices_nuw_nusw(ptr %x, ptr %y, i64 %z) {
785785 %cmp = icmp ult ptr %gep1 , %gep2
786786 ret i1 %cmp
787787}
788+
789+ define i1 @gep_multiple_eq (ptr %base , i64 %idx , i64 %idx2 ) {
790+ ; CHECK-LABEL: @gep_multiple_eq(
791+ ; CHECK-NEXT: [[GEP1:%.*]] = getelementptr i32, ptr [[BASE:%.*]], i64 [[IDX:%.*]]
792+ ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i32, ptr [[GEP1]], i64 [[IDX2:%.*]]
793+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[GEP2]], [[BASE]]
794+ ; CHECK-NEXT: ret i1 [[CMP]]
795+ ;
796+ %gep1 = getelementptr i32 , ptr %base , i64 %idx
797+ %gep2 = getelementptr i32 , ptr %gep1 , i64 %idx2
798+ %cmp = icmp eq ptr %gep2 , %base
799+ ret i1 %cmp
800+ }
801+
802+ define i1 @gep_multiple_eq_commuted (ptr %base , i64 %idx , i64 %idx2 ) {
803+ ; CHECK-LABEL: @gep_multiple_eq_commuted(
804+ ; CHECK-NEXT: [[GEP1:%.*]] = getelementptr i32, ptr [[BASE:%.*]], i64 [[IDX:%.*]]
805+ ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i32, ptr [[GEP1]], i64 [[IDX2:%.*]]
806+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[BASE]], [[GEP2]]
807+ ; CHECK-NEXT: ret i1 [[CMP]]
808+ ;
809+ %gep1 = getelementptr i32 , ptr %base , i64 %idx
810+ %gep2 = getelementptr i32 , ptr %gep1 , i64 %idx2
811+ %cmp = icmp eq ptr %base , %gep2
812+ ret i1 %cmp
813+ }
814+
815+ define i1 @gep_mugtiple_ugt_nuw (ptr %base , i64 %idx , i64 %idx2 ) {
816+ ; CHECK-LABEL: @gep_mugtiple_ugt_nuw(
817+ ; CHECK-NEXT: [[GEP1:%.*]] = getelementptr nuw i32, ptr [[BASE:%.*]], i64 [[IDX:%.*]]
818+ ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr nuw i32, ptr [[GEP1]], i64 [[IDX2:%.*]]
819+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt ptr [[GEP2]], [[BASE]]
820+ ; CHECK-NEXT: ret i1 [[CMP]]
821+ ;
822+ %gep1 = getelementptr nuw i32 , ptr %base , i64 %idx
823+ %gep2 = getelementptr nuw i32 , ptr %gep1 , i64 %idx2
824+ %cmp = icmp ugt ptr %gep2 , %base
825+ ret i1 %cmp
826+ }
827+
828+ define i1 @gep_mugtiple_ugt_not_all_nuw (ptr %base , i64 %idx , i64 %idx2 ) {
829+ ; CHECK-LABEL: @gep_mugtiple_ugt_not_all_nuw(
830+ ; CHECK-NEXT: [[GEP1:%.*]] = getelementptr nuw i32, ptr [[BASE:%.*]], i64 [[IDX:%.*]]
831+ ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i32, ptr [[GEP1]], i64 [[IDX2:%.*]]
832+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt ptr [[GEP2]], [[BASE]]
833+ ; CHECK-NEXT: ret i1 [[CMP]]
834+ ;
835+ %gep1 = getelementptr nuw i32 , ptr %base , i64 %idx
836+ %gep2 = getelementptr i32 , ptr %gep1 , i64 %idx2
837+ %cmp = icmp ugt ptr %gep2 , %base
838+ ret i1 %cmp
839+ }
840+
841+ define i1 @gep_mugtiple_ugt_inbounds_nusw (ptr %base , i64 %idx , i64 %idx2 ) {
842+ ; CHECK-LABEL: @gep_mugtiple_ugt_inbounds_nusw(
843+ ; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds i32, ptr [[BASE:%.*]], i64 [[IDX:%.*]]
844+ ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr nusw i32, ptr [[GEP1]], i64 [[IDX2:%.*]]
845+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt ptr [[GEP2]], [[BASE]]
846+ ; CHECK-NEXT: ret i1 [[CMP]]
847+ ;
848+ %gep1 = getelementptr inbounds i32 , ptr %base , i64 %idx
849+ %gep2 = getelementptr nusw i32 , ptr %gep1 , i64 %idx2
850+ %cmp = icmp ugt ptr %gep2 , %base
851+ ret i1 %cmp
852+ }
0 commit comments