@@ -156,6 +156,62 @@ define i64 @test_inbounds_nuw_two_gep(ptr %base, i64 %idx, i64 %idx2) {
156
156
ret i64 %d
157
157
}
158
158
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
+
159
215
define i64 @test_inbounds_nuw_multi_index (ptr %base , i64 %idx , i64 %idx2 ) {
160
216
; CHECK-LABEL: @test_inbounds_nuw_multi_index(
161
217
; CHECK-NEXT: [[P2_IDX:%.*]] = shl nsw i64 [[IDX:%.*]], 3
0 commit comments