@@ -785,3 +785,67 @@ 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_IDX1:%.*]] = add i64 [[IDX:%.*]], [[IDX2:%.*]]
792+ ; CHECK-NEXT: [[DOTMASK:%.*]] = and i64 [[GEP1_IDX1]], 4611686018427387903
793+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[DOTMASK]], 0
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_IDX1:%.*]] = add i64 [[IDX:%.*]], [[IDX2:%.*]]
805+ ; CHECK-NEXT: [[DOTMASK:%.*]] = and i64 [[GEP1_IDX1]], 4611686018427387903
806+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[DOTMASK]], 0
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_IDX1:%.*]] = sub i64 0, [[IDX2:%.*]]
818+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i64 [[IDX:%.*]], [[GEP1_IDX1]]
819+ ; CHECK-NEXT: ret i1 [[CMP]]
820+ ;
821+ %gep1 = getelementptr nuw i32 , ptr %base , i64 %idx
822+ %gep2 = getelementptr nuw i32 , ptr %gep1 , i64 %idx2
823+ %cmp = icmp ugt ptr %gep2 , %base
824+ ret i1 %cmp
825+ }
826+
827+ define i1 @gep_mugtiple_ugt_not_all_nuw (ptr %base , i64 %idx , i64 %idx2 ) {
828+ ; CHECK-LABEL: @gep_mugtiple_ugt_not_all_nuw(
829+ ; CHECK-NEXT: [[GEP1:%.*]] = getelementptr nuw i32, ptr [[BASE:%.*]], i64 [[IDX:%.*]]
830+ ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i32, ptr [[GEP1]], i64 [[IDX2:%.*]]
831+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt ptr [[GEP2]], [[BASE]]
832+ ; CHECK-NEXT: ret i1 [[CMP]]
833+ ;
834+ %gep1 = getelementptr nuw i32 , ptr %base , i64 %idx
835+ %gep2 = getelementptr i32 , ptr %gep1 , i64 %idx2
836+ %cmp = icmp ugt ptr %gep2 , %base
837+ ret i1 %cmp
838+ }
839+
840+ define i1 @gep_mugtiple_ugt_inbounds_nusw (ptr %base , i64 %idx , i64 %idx2 ) {
841+ ; CHECK-LABEL: @gep_mugtiple_ugt_inbounds_nusw(
842+ ; CHECK-NEXT: [[GEP1_IDX1:%.*]] = add i64 [[IDX:%.*]], [[IDX2:%.*]]
843+ ; CHECK-NEXT: [[TMP1:%.*]] = shl i64 [[GEP1_IDX1]], 2
844+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i64 [[TMP1]], 0
845+ ; CHECK-NEXT: ret i1 [[CMP]]
846+ ;
847+ %gep1 = getelementptr inbounds i32 , ptr %base , i64 %idx
848+ %gep2 = getelementptr nusw i32 , ptr %gep1 , i64 %idx2
849+ %cmp = icmp ugt ptr %gep2 , %base
850+ ret i1 %cmp
851+ }
0 commit comments