@@ -757,3 +757,68 @@ define i1 @gep_diff_base_same_indices_nuw_nusw(ptr %x, ptr %y, i64 %z) {
757757 %cmp = icmp ult ptr %gep1 , %gep2
758758 ret i1 %cmp
759759}
760+
761+ define i1 @gep_multiple_eq (ptr %base , i64 %idx , i64 %idx2 ) {
762+ ; CHECK-LABEL: @gep_multiple_eq(
763+ ; CHECK-NEXT: [[GEP1:%.*]] = getelementptr i32, ptr [[BASE:%.*]], i64 [[IDX:%.*]]
764+ ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i32, ptr [[GEP1]], i64 [[IDX2:%.*]]
765+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[GEP2]], [[BASE]]
766+ ; CHECK-NEXT: ret i1 [[CMP]]
767+ ;
768+ %gep1 = getelementptr i32 , ptr %base , i64 %idx
769+ %gep2 = getelementptr i32 , ptr %gep1 , i64 %idx2
770+ %cmp = icmp eq ptr %gep2 , %base
771+ ret i1 %cmp
772+ }
773+
774+ define i1 @gep_multiple_eq_commuted (ptr %base , i64 %idx , i64 %idx2 ) {
775+ ; CHECK-LABEL: @gep_multiple_eq_commuted(
776+ ; CHECK-NEXT: [[GEP1:%.*]] = getelementptr i32, ptr [[BASE:%.*]], i64 [[IDX:%.*]]
777+ ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i32, ptr [[GEP1]], i64 [[IDX2:%.*]]
778+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[BASE]], [[GEP2]]
779+ ; CHECK-NEXT: ret i1 [[CMP]]
780+ ;
781+ %gep1 = getelementptr i32 , ptr %base , i64 %idx
782+ %gep2 = getelementptr i32 , ptr %gep1 , i64 %idx2
783+ %cmp = icmp eq ptr %base , %gep2
784+ ret i1 %cmp
785+ }
786+
787+ define i1 @gep_mugtiple_ugt_nuw (ptr %base , i64 %idx , i64 %idx2 ) {
788+ ; CHECK-LABEL: @gep_mugtiple_ugt_nuw(
789+ ; CHECK-NEXT: [[GEP1:%.*]] = getelementptr nuw i32, ptr [[BASE:%.*]], i64 [[IDX:%.*]]
790+ ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr nuw i32, ptr [[GEP1]], i64 [[IDX2:%.*]]
791+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt ptr [[GEP2]], [[BASE]]
792+ ; CHECK-NEXT: ret i1 [[CMP]]
793+ ;
794+ %gep1 = getelementptr nuw i32 , ptr %base , i64 %idx
795+ %gep2 = getelementptr nuw i32 , ptr %gep1 , i64 %idx2
796+ %cmp = icmp ugt ptr %gep2 , %base
797+ ret i1 %cmp
798+ }
799+
800+ define i1 @gep_mugtiple_ugt_not_all_nuw (ptr %base , i64 %idx , i64 %idx2 ) {
801+ ; CHECK-LABEL: @gep_mugtiple_ugt_not_all_nuw(
802+ ; CHECK-NEXT: [[GEP1:%.*]] = getelementptr nuw i32, ptr [[BASE:%.*]], i64 [[IDX:%.*]]
803+ ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i32, ptr [[GEP1]], i64 [[IDX2:%.*]]
804+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt ptr [[GEP2]], [[BASE]]
805+ ; CHECK-NEXT: ret i1 [[CMP]]
806+ ;
807+ %gep1 = getelementptr nuw i32 , ptr %base , i64 %idx
808+ %gep2 = getelementptr i32 , ptr %gep1 , i64 %idx2
809+ %cmp = icmp ugt ptr %gep2 , %base
810+ ret i1 %cmp
811+ }
812+
813+ define i1 @gep_mugtiple_ugt_inbounds_nusw (ptr %base , i64 %idx , i64 %idx2 ) {
814+ ; CHECK-LABEL: @gep_mugtiple_ugt_inbounds_nusw(
815+ ; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds i32, ptr [[BASE:%.*]], i64 [[IDX:%.*]]
816+ ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr nusw i32, ptr [[GEP1]], i64 [[IDX2:%.*]]
817+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt ptr [[GEP2]], [[BASE]]
818+ ; CHECK-NEXT: ret i1 [[CMP]]
819+ ;
820+ %gep1 = getelementptr inbounds i32 , ptr %base , i64 %idx
821+ %gep2 = getelementptr nusw i32 , ptr %gep1 , i64 %idx2
822+ %cmp = icmp ugt ptr %gep2 , %base
823+ ret i1 %cmp
824+ }
0 commit comments