@@ -350,4 +350,54 @@ entry:
350
350
ret i1 %res
351
351
}
352
352
353
+ define i1 @gep_decomp_large_index_63_bits_chained_overflow (ptr %a ) {
354
+ ; CHECK-LABEL: @gep_decomp_large_index_63_bits_chained_overflow(
355
+ ; CHECK-NEXT: entry:
356
+ ; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i64, ptr [[A:%.*]], i64 9223372036854775804
357
+ ; CHECK-NEXT: [[GEP_2:%.*]] = getelementptr inbounds ptr, ptr [[A]], i64 1152921504606846976
358
+ ; CHECK-NEXT: [[GEP_3:%.*]] = getelementptr inbounds i64, ptr [[GEP_2]], i64 1152921504606846976
359
+ ; CHECK-NEXT: [[NE:%.*]] = icmp ne ptr [[GEP_1]], [[GEP_3]]
360
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[NE]])
361
+ ; CHECK-NEXT: [[CMP_ULE:%.*]] = icmp ule ptr [[GEP_1]], [[GEP_3]]
362
+ ; CHECK-NEXT: [[CMP_UGE:%.*]] = icmp uge ptr [[GEP_1]], [[GEP_3]]
363
+ ; CHECK-NEXT: [[RES:%.*]] = xor i1 true, true
364
+ ; CHECK-NEXT: ret i1 [[RES]]
365
+ ;
366
+ entry:
367
+ %gep.1 = getelementptr inbounds i64 , ptr %a , i64 9223372036854775804
368
+ %gep.2 = getelementptr inbounds ptr , ptr %a , i64 1152921504606846976
369
+ %gep.3 = getelementptr inbounds i64 , ptr %gep.2 , i64 1152921504606846976
370
+ %ne = icmp ne ptr %gep.1 , %gep.3
371
+ call void @llvm.assume (i1 %ne )
372
+ %cmp.ule = icmp ule ptr %gep.1 , %gep.3
373
+ %cmp.uge = icmp uge ptr %gep.1 , %gep.3
374
+ %res = xor i1 %cmp.ule , %cmp.ule
375
+ ret i1 %res
376
+ }
377
+
378
+ %struct = type { [128 x i64 ], [2 x i32 ] }
379
+
380
+ define i1 @gep_decomp_large_index_63_bits_overflow_struct (ptr %a ) {
381
+ ; CHECK-LABEL: @gep_decomp_large_index_63_bits_overflow_struct(
382
+ ; CHECK-NEXT: entry:
383
+ ; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i64, ptr [[A:%.*]], i64 9223372036854775804
384
+ ; CHECK-NEXT: [[GEP_2:%.*]] = getelementptr inbounds [[STRUCT:%.*]], ptr [[A]], i64 8937376004704240, i32 1, i32 1
385
+ ; CHECK-NEXT: [[NE:%.*]] = icmp ne ptr [[GEP_1]], [[GEP_2]]
386
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[NE]])
387
+ ; CHECK-NEXT: [[CMP_ULE:%.*]] = icmp ule ptr [[GEP_1]], [[GEP_2]]
388
+ ; CHECK-NEXT: [[CMP_UGE:%.*]] = icmp uge ptr [[GEP_1]], [[GEP_2]]
389
+ ; CHECK-NEXT: [[RES:%.*]] = xor i1 false, false
390
+ ; CHECK-NEXT: ret i1 [[RES]]
391
+ ;
392
+ entry:
393
+ %gep.1 = getelementptr inbounds i64 , ptr %a , i64 9223372036854775804
394
+ %gep.2 = getelementptr inbounds %struct , ptr %a , i64 8937376004704240 , i32 1 , i32 1
395
+ %ne = icmp ne ptr %gep.1 , %gep.2
396
+ call void @llvm.assume (i1 %ne )
397
+ %cmp.ule = icmp ule ptr %gep.1 , %gep.2
398
+ %cmp.uge = icmp uge ptr %gep.1 , %gep.2
399
+ %res = xor i1 %cmp.ule , %cmp.ule
400
+ ret i1 %res
401
+ }
402
+
353
403
declare void @llvm.assume (i1 )
0 commit comments