@@ -116,6 +116,7 @@ define void @test_overaligned_vec(i8 %B) {
116
116
; CHECK-LABEL: @test_overaligned_vec(
117
117
; CHECK-NEXT: store i8 [[B:%.*]], ptr getelementptr inbounds ([10 x i8], ptr @Global, i64 0, i64 2), align 1
118
118
; CHECK-NEXT: ret void
119
+ ;
119
120
%A = getelementptr <2 x half >, ptr @Global , i64 0 , i64 1
120
121
store i8 %B , ptr %A
121
122
ret void
@@ -1474,6 +1475,17 @@ define ptr @gep_sdiv(ptr %p, i64 %off) {
1474
1475
ret ptr %ptr
1475
1476
}
1476
1477
1478
+ define ptr @gep_udiv (ptr %p , i64 %off ) {
1479
+ ; CHECK-LABEL: @gep_udiv(
1480
+ ; CHECK-NEXT: [[INDEX:%.*]] = udiv exact i64 [[OFF:%.*]], 7
1481
+ ; CHECK-NEXT: [[PTR:%.*]] = getelementptr [[STRUCT_C:%.*]], ptr [[P:%.*]], i64 [[INDEX]]
1482
+ ; CHECK-NEXT: ret ptr [[PTR]]
1483
+ ;
1484
+ %index = udiv exact i64 %off , 7
1485
+ %ptr = getelementptr %struct.C , ptr %p , i64 %index
1486
+ ret ptr %ptr
1487
+ }
1488
+
1477
1489
define <2 x ptr > @gep_sdiv_vec (<2 x ptr > %p , <2 x i64 > %off ) {
1478
1490
; CHECK-LABEL: @gep_sdiv_vec(
1479
1491
; CHECK-NEXT: [[PTR:%.*]] = getelementptr i8, <2 x ptr> [[P:%.*]], <2 x i64> [[OFF:%.*]]
@@ -1504,6 +1516,17 @@ define ptr @gep_ashr(ptr %p, i64 %off) {
1504
1516
ret ptr %ptr
1505
1517
}
1506
1518
1519
+ define ptr @gep_lshr (ptr %p , i64 %off ) {
1520
+ ; CHECK-LABEL: @gep_lshr(
1521
+ ; CHECK-NEXT: [[INDEX:%.*]] = lshr exact i64 [[OFF:%.*]], 2
1522
+ ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 [[INDEX]]
1523
+ ; CHECK-NEXT: ret ptr [[PTR]]
1524
+ ;
1525
+ %index = lshr exact i64 %off , 2
1526
+ %ptr = getelementptr i32 , ptr %p , i64 %index
1527
+ ret ptr %ptr
1528
+ }
1529
+
1507
1530
; Negative tests
1508
1531
1509
1532
define ptr @gep_i8 (ptr %p , i64 %off ) {
@@ -1526,6 +1549,17 @@ define ptr @gep_sdiv_mismatched_size(ptr %p, i64 %off) {
1526
1549
ret ptr %ptr
1527
1550
}
1528
1551
1552
+ define ptr @gep_udiv_mismatched_size (ptr %p , i64 %off ) {
1553
+ ; CHECK-LABEL: @gep_udiv_mismatched_size(
1554
+ ; CHECK-NEXT: [[INDEX:%.*]] = udiv exact i64 [[OFF:%.*]], 20
1555
+ ; CHECK-NEXT: [[PTR:%.*]] = getelementptr [[STRUCT_C:%.*]], ptr [[P:%.*]], i64 [[INDEX]]
1556
+ ; CHECK-NEXT: ret ptr [[PTR]]
1557
+ ;
1558
+ %index = udiv exact i64 %off , 20
1559
+ %ptr = getelementptr %struct.C , ptr %p , i64 %index
1560
+ ret ptr %ptr
1561
+ }
1562
+
1529
1563
define ptr @gep_sdiv_without_exact (ptr %p , i64 %off ) {
1530
1564
; CHECK-LABEL: @gep_sdiv_without_exact(
1531
1565
; CHECK-NEXT: [[INDEX:%.*]] = sdiv i64 [[OFF:%.*]], 7
@@ -1537,6 +1571,17 @@ define ptr @gep_sdiv_without_exact(ptr %p, i64 %off) {
1537
1571
ret ptr %ptr
1538
1572
}
1539
1573
1574
+ define ptr @gep_udiv_without_exact (ptr %p , i64 %off ) {
1575
+ ; CHECK-LABEL: @gep_udiv_without_exact(
1576
+ ; CHECK-NEXT: [[INDEX:%.*]] = udiv i64 [[OFF:%.*]], 7
1577
+ ; CHECK-NEXT: [[PTR:%.*]] = getelementptr [[STRUCT_C:%.*]], ptr [[P:%.*]], i64 [[INDEX]]
1578
+ ; CHECK-NEXT: ret ptr [[PTR]]
1579
+ ;
1580
+ %index = udiv i64 %off , 7
1581
+ %ptr = getelementptr %struct.C , ptr %p , i64 %index
1582
+ ret ptr %ptr
1583
+ }
1584
+
1540
1585
define ptr @gep_ashr_without_exact (ptr %p , i64 %off ) {
1541
1586
; CHECK-LABEL: @gep_ashr_without_exact(
1542
1587
; CHECK-NEXT: [[INDEX:%.*]] = ashr i64 [[OFF:%.*]], 2
@@ -1548,6 +1593,17 @@ define ptr @gep_ashr_without_exact(ptr %p, i64 %off) {
1548
1593
ret ptr %ptr
1549
1594
}
1550
1595
1596
+ define ptr @gep_lshr_without_exact (ptr %p , i64 %off ) {
1597
+ ; CHECK-LABEL: @gep_lshr_without_exact(
1598
+ ; CHECK-NEXT: [[INDEX:%.*]] = lshr i64 [[OFF:%.*]], 2
1599
+ ; CHECK-NEXT: [[PTR:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 [[INDEX]]
1600
+ ; CHECK-NEXT: ret ptr [[PTR]]
1601
+ ;
1602
+ %index = lshr i64 %off , 2
1603
+ %ptr = getelementptr i32 , ptr %p , i64 %index
1604
+ ret ptr %ptr
1605
+ }
1606
+
1551
1607
define i1 @test_only_used_by_icmp (ptr %a , ptr %b , ptr %c ) {
1552
1608
; CHECK-LABEL: @test_only_used_by_icmp(
1553
1609
; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[B:%.*]], [[C:%.*]]
0 commit comments