@@ -1453,4 +1453,88 @@ define ptr @const_gep_chain(ptr %p, i64 %a) {
1453
1453
ret ptr %p4
1454
1454
}
1455
1455
1456
+ define ptr @gep_sdiv (ptr %p , i64 %off ) {
1457
+ ; CHECK-LABEL: @gep_sdiv(
1458
+ ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 [[OFF:%.*]]
1459
+ ; CHECK-NEXT: ret ptr [[PTR]]
1460
+ ;
1461
+ %index = sdiv exact i64 %off , 7
1462
+ %ptr = getelementptr %struct.C , ptr %p , i64 %index
1463
+ ret ptr %ptr
1464
+ }
1465
+
1466
+ define <2 x ptr > @gep_sdiv_vec (<2 x ptr > %p , <2 x i64 > %off ) {
1467
+ ; CHECK-LABEL: @gep_sdiv_vec(
1468
+ ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i8, <2 x ptr> [[P:%.*]], <2 x i64> [[OFF:%.*]]
1469
+ ; CHECK-NEXT: ret <2 x ptr> [[PTR]]
1470
+ ;
1471
+ %index = sdiv exact <2 x i64 > %off , <i64 7 , i64 7 >
1472
+ %ptr = getelementptr %struct.C , <2 x ptr > %p , <2 x i64 > %index
1473
+ ret <2 x ptr > %ptr
1474
+ }
1475
+
1476
+ define ptr @gep_sdiv_inbounds (ptr %p , i64 %off ) {
1477
+ ; CHECK-LABEL: @gep_sdiv_inbounds(
1478
+ ; CHECK-NEXT: [[PTR:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 [[OFF:%.*]]
1479
+ ; CHECK-NEXT: ret ptr [[PTR]]
1480
+ ;
1481
+ %index = sdiv exact i64 %off , 7
1482
+ %ptr = getelementptr inbounds %struct.C , ptr %p , i64 %index
1483
+ ret ptr %ptr
1484
+ }
1485
+
1486
+ define ptr @gep_ashr (ptr %p , i64 %off ) {
1487
+ ; CHECK-LABEL: @gep_ashr(
1488
+ ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 [[OFF:%.*]]
1489
+ ; CHECK-NEXT: ret ptr [[PTR]]
1490
+ ;
1491
+ %index = ashr exact i64 %off , 2
1492
+ %ptr = getelementptr i32 , ptr %p , i64 %index
1493
+ ret ptr %ptr
1494
+ }
1495
+
1496
+ ; Negative tests
1497
+
1498
+ define ptr @gep_i8 (ptr %p , i64 %off ) {
1499
+ ; CHECK-LABEL: @gep_i8(
1500
+ ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 [[OFF:%.*]]
1501
+ ; CHECK-NEXT: ret ptr [[PTR]]
1502
+ ;
1503
+ %ptr = getelementptr i8 , ptr %p , i64 %off
1504
+ ret ptr %ptr
1505
+ }
1506
+
1507
+ define ptr @gep_sdiv_mismatched_size (ptr %p , i64 %off ) {
1508
+ ; CHECK-LABEL: @gep_sdiv_mismatched_size(
1509
+ ; CHECK-NEXT: [[INDEX:%.*]] = sdiv exact i64 [[OFF:%.*]], 20
1510
+ ; CHECK-NEXT: [[PTR:%.*]] = getelementptr [[STRUCT_C:%.*]], ptr [[P:%.*]], i64 [[INDEX]]
1511
+ ; CHECK-NEXT: ret ptr [[PTR]]
1512
+ ;
1513
+ %index = sdiv exact i64 %off , 20
1514
+ %ptr = getelementptr %struct.C , ptr %p , i64 %index
1515
+ ret ptr %ptr
1516
+ }
1517
+
1518
+ define ptr @gep_sdiv_without_exact (ptr %p , i64 %off ) {
1519
+ ; CHECK-LABEL: @gep_sdiv_without_exact(
1520
+ ; CHECK-NEXT: [[INDEX:%.*]] = sdiv i64 [[OFF:%.*]], 7
1521
+ ; CHECK-NEXT: [[PTR:%.*]] = getelementptr [[STRUCT_C:%.*]], ptr [[P:%.*]], i64 [[INDEX]]
1522
+ ; CHECK-NEXT: ret ptr [[PTR]]
1523
+ ;
1524
+ %index = sdiv i64 %off , 7
1525
+ %ptr = getelementptr %struct.C , ptr %p , i64 %index
1526
+ ret ptr %ptr
1527
+ }
1528
+
1529
+ define ptr @gep_ashr_without_exact (ptr %p , i64 %off ) {
1530
+ ; CHECK-LABEL: @gep_ashr_without_exact(
1531
+ ; CHECK-NEXT: [[INDEX:%.*]] = ashr i64 [[OFF:%.*]], 2
1532
+ ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 [[INDEX]]
1533
+ ; CHECK-NEXT: ret ptr [[PTR]]
1534
+ ;
1535
+ %index = ashr i64 %off , 2
1536
+ %ptr = getelementptr i32 , ptr %p , i64 %index
1537
+ ret ptr %ptr
1538
+ }
1539
+
1456
1540
!0 = !{!"branch_weights" , i32 2 , i32 10 }
0 commit comments