@@ -156,6 +156,62 @@ define i64 @test_inbounds_nuw_two_gep(ptr %base, i64 %idx, i64 %idx2) {
156156 ret i64 %d
157157}
158158
159+ define i64 @test_nusw_two_gep (ptr %base , i64 %idx , i64 %idx2 ) {
160+ ; CHECK-LABEL: @test_nusw_two_gep(
161+ ; CHECK-NEXT: [[TMP1:%.*]] = sub i64 [[IDX2:%.*]], [[IDX:%.*]]
162+ ; CHECK-NEXT: [[GEPDIFF:%.*]] = shl i64 [[TMP1]], 2
163+ ; CHECK-NEXT: ret i64 [[GEPDIFF]]
164+ ;
165+ %p1 = getelementptr nusw [0 x i32 ], ptr %base , i64 0 , i64 %idx
166+ %p2 = getelementptr nusw [0 x i32 ], ptr %base , i64 0 , i64 %idx2
167+ %i1 = ptrtoint ptr %p1 to i64
168+ %i2 = ptrtoint ptr %p2 to i64
169+ %d = sub i64 %i2 , %i1
170+ ret i64 %d
171+ }
172+
173+ define i64 @test_nuw_two_gep (ptr %base , i64 %idx , i64 %idx2 ) {
174+ ; CHECK-LABEL: @test_nuw_two_gep(
175+ ; CHECK-NEXT: [[TMP1:%.*]] = sub nuw i64 [[IDX2:%.*]], [[IDX:%.*]]
176+ ; CHECK-NEXT: [[GEPDIFF:%.*]] = shl nuw i64 [[TMP1]], 2
177+ ; CHECK-NEXT: ret i64 [[GEPDIFF]]
178+ ;
179+ %p1 = getelementptr nuw [0 x i32 ], ptr %base , i64 0 , i64 %idx
180+ %p2 = getelementptr nuw [0 x i32 ], ptr %base , i64 0 , i64 %idx2
181+ %i1 = ptrtoint ptr %p1 to i64
182+ %i2 = ptrtoint ptr %p2 to i64
183+ %d = sub nuw i64 %i2 , %i1
184+ ret i64 %d
185+ }
186+
187+ define i64 @test_nuw_two_gep_missing_nuw_on_sub (ptr %base , i64 %idx , i64 %idx2 ) {
188+ ; CHECK-LABEL: @test_nuw_two_gep_missing_nuw_on_sub(
189+ ; CHECK-NEXT: [[TMP1:%.*]] = sub i64 [[IDX2:%.*]], [[IDX:%.*]]
190+ ; CHECK-NEXT: [[GEPDIFF:%.*]] = shl i64 [[TMP1]], 2
191+ ; CHECK-NEXT: ret i64 [[GEPDIFF]]
192+ ;
193+ %p1 = getelementptr nuw [0 x i32 ], ptr %base , i64 0 , i64 %idx
194+ %p2 = getelementptr nuw [0 x i32 ], ptr %base , i64 0 , i64 %idx2
195+ %i1 = ptrtoint ptr %p1 to i64
196+ %i2 = ptrtoint ptr %p2 to i64
197+ %d = sub i64 %i2 , %i1
198+ ret i64 %d
199+ }
200+
201+ define i64 @test_nuw_two_gep_missing_nuw_on_one_gep (ptr %base , i64 %idx , i64 %idx2 ) {
202+ ; CHECK-LABEL: @test_nuw_two_gep_missing_nuw_on_one_gep(
203+ ; CHECK-NEXT: [[TMP1:%.*]] = sub i64 [[IDX2:%.*]], [[IDX:%.*]]
204+ ; CHECK-NEXT: [[GEPDIFF:%.*]] = shl i64 [[TMP1]], 2
205+ ; CHECK-NEXT: ret i64 [[GEPDIFF]]
206+ ;
207+ %p1 = getelementptr nuw [0 x i32 ], ptr %base , i64 0 , i64 %idx
208+ %p2 = getelementptr [0 x i32 ], ptr %base , i64 0 , i64 %idx2
209+ %i1 = ptrtoint ptr %p1 to i64
210+ %i2 = ptrtoint ptr %p2 to i64
211+ %d = sub nuw i64 %i2 , %i1
212+ ret i64 %d
213+ }
214+
159215define i64 @test_inbounds_nuw_multi_index (ptr %base , i64 %idx , i64 %idx2 ) {
160216; CHECK-LABEL: @test_inbounds_nuw_multi_index(
161217; CHECK-NEXT: [[P2_IDX:%.*]] = shl nsw i64 [[IDX:%.*]], 3
0 commit comments