@@ -785,3 +785,68 @@ define i1 @gep_diff_base_same_indices_nuw_nusw(ptr %x, ptr %y, i64 %z) {
785
785
%cmp = icmp ult ptr %gep1 , %gep2
786
786
ret i1 %cmp
787
787
}
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