@@ -192,7 +192,7 @@ define void @may_overflow_i32_sext([16 x i8]* %ptr, i32 %idx) {
192
192
; CHECK-LABEL: Function: may_overflow_i32_sext: 3 pointers, 0 call sites
193
193
; CHECK-NEXT: MayAlias: [16 x i8]* %ptr, i8* %gep.idx
194
194
; CHECK-NEXT: PartialAlias (off 3): [16 x i8]* %ptr, i8* %gep.3
195
- ; CHECK-NEXT: MayAlias: i8* %gep.3, i8* %gep.idx
195
+ ; CHECK-NEXT: MayAlias: i8* %gep.3, i8* %gep.idx
196
196
;
197
197
%mul = mul i32 %idx , 678152731
198
198
%sub = sub i32 %mul , 1582356375
@@ -208,7 +208,7 @@ define void @nuw_nsw_i32_sext([16 x i8]* %ptr, i32 %idx) {
208
208
; CHECK-LABEL: Function: nuw_nsw_i32_sext: 3 pointers, 0 call sites
209
209
; CHECK-NEXT: NoAlias: [16 x i8]* %ptr, i8* %gep.idx
210
210
; CHECK-NEXT: PartialAlias (off 3): [16 x i8]* %ptr, i8* %gep.3
211
- ; CHECK-NEXT: NoAlias: i8* %gep.3, i8* %gep.idx
211
+ ; CHECK-NEXT: NoAlias: i8* %gep.3, i8* %gep.idx
212
212
;
213
213
%mul = mul nuw nsw i32 %idx , 678152731
214
214
%sub = sub nuw nsw i32 %mul , 1582356375
@@ -225,7 +225,7 @@ define void @may_overflow_i32_zext([16 x i8]* %ptr, i32 %idx) {
225
225
; CHECK-LABEL: Function: may_overflow_i32_zext: 3 pointers, 0 call sites
226
226
; CHECK-NEXT: MayAlias: [16 x i8]* %ptr, i8* %gep.idx
227
227
; CHECK-NEXT: PartialAlias (off 3): [16 x i8]* %ptr, i8* %gep.3
228
- ; CHECK-NEXT: MayAlias: i8* %gep.3, i8* %gep.idx
228
+ ; CHECK-NEXT: MayAlias: i8* %gep.3, i8* %gep.idx
229
229
;
230
230
%mul = mul i32 %idx , 678152731
231
231
%sub = sub i32 %mul , 1582356375
@@ -241,7 +241,7 @@ define void @nuw_nsw_i32_zext([16 x i8]* %ptr, i32 %idx) {
241
241
; CHECK-LABEL: Function: nuw_nsw_i32_zext: 3 pointers, 0 call sites
242
242
; CHECK-NEXT: NoAlias: [16 x i8]* %ptr, i8* %gep.idx
243
243
; CHECK-NEXT: PartialAlias (off 3): [16 x i8]* %ptr, i8* %gep.3
244
- ; CHECK-NEXT: NoAlias: i8* %gep.3, i8* %gep.idx
244
+ ; CHECK-NEXT: NoAlias: i8* %gep.3, i8* %gep.idx
245
245
;
246
246
%mul = mul nuw nsw i32 %idx , 678152731
247
247
%sub = sub nuw nsw i32 %mul , 1582356375
@@ -252,3 +252,22 @@ define void @nuw_nsw_i32_zext([16 x i8]* %ptr, i32 %idx) {
252
252
store i8 1 , i8* %gep.3 , align 1
253
253
ret void
254
254
}
255
+
256
+ ; %mul.1 and %sub.2 are equal, if %idx = 9, because %mul.1 overflows. Hence
257
+ ; %gep.mul.1 and %gep.sub.2 may alias.
258
+ define void @may_overflow_pointer_diff ([16 x i8 ]* %ptr , i64 %idx ) {
259
+ ; CHECK-LABEL: Function: may_overflow_pointer_diff: 3 pointers, 0 call sites
260
+ ; CHECK-NEXT: MayAlias: [16 x i8]* %ptr, i8* %gep.mul.1
261
+ ; CHECK-NEXT: MayAlias: [16 x i8]* %ptr, i8* %gep.sub.2
262
+ ; CHECK-NEXT: NoAlias: i8* %gep.mul.1, i8* %gep.sub.2
263
+ ;
264
+ %mul.1 = mul i64 %idx , 6148914691236517207
265
+ %gep.mul.1 = getelementptr [16 x i8 ], [16 x i8 ]* %ptr , i32 0 , i64 %mul.1
266
+ store i8 1 , i8* %gep.mul.1 , align 1
267
+ %mul.2 = mul nsw i64 %idx , 3
268
+ %sub.2 = sub nsw i64 %mul.2 , 12
269
+ %gep.sub.2 = getelementptr [16 x i8 ], [16 x i8 ]* %ptr , i32 0 , i64 %sub.2
270
+ store i8 0 , i8* %gep.sub.2 , align 1
271
+
272
+ ret void
273
+ }
0 commit comments