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