@@ -116,6 +116,7 @@ define void @test_overaligned_vec(i8 %B) {
116116; CHECK-LABEL: @test_overaligned_vec(
117117; CHECK-NEXT: store i8 [[B:%.*]], ptr getelementptr inbounds ([10 x i8], ptr @Global, i64 0, i64 2), align 1
118118; CHECK-NEXT: ret void
119+ ;
119120 %A = getelementptr <2 x half >, ptr @Global , i64 0 , i64 1
120121 store i8 %B , ptr %A
121122 ret void
@@ -1473,6 +1474,17 @@ define ptr @gep_sdiv(ptr %p, i64 %off) {
14731474 ret ptr %ptr
14741475}
14751476
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+
14761488define <2 x ptr > @gep_sdiv_vec (<2 x ptr > %p , <2 x i64 > %off ) {
14771489; CHECK-LABEL: @gep_sdiv_vec(
14781490; 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) {
15031515 ret ptr %ptr
15041516}
15051517
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+
15061529; Negative tests
15071530
15081531define ptr @gep_i8 (ptr %p , i64 %off ) {
@@ -1525,6 +1548,17 @@ define ptr @gep_sdiv_mismatched_size(ptr %p, i64 %off) {
15251548 ret ptr %ptr
15261549}
15271550
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+
15281562define ptr @gep_sdiv_without_exact (ptr %p , i64 %off ) {
15291563; CHECK-LABEL: @gep_sdiv_without_exact(
15301564; CHECK-NEXT: [[INDEX:%.*]] = sdiv i64 [[OFF:%.*]], 7
@@ -1536,6 +1570,17 @@ define ptr @gep_sdiv_without_exact(ptr %p, i64 %off) {
15361570 ret ptr %ptr
15371571}
15381572
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+
15391584define ptr @gep_ashr_without_exact (ptr %p , i64 %off ) {
15401585; CHECK-LABEL: @gep_ashr_without_exact(
15411586; CHECK-NEXT: [[INDEX:%.*]] = ashr i64 [[OFF:%.*]], 2
@@ -1547,6 +1592,17 @@ define ptr @gep_ashr_without_exact(ptr %p, i64 %off) {
15471592 ret ptr %ptr
15481593}
15491594
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+
15501606define i1 @test_only_used_by_icmp (ptr %a , ptr %b , ptr %c ) {
15511607; CHECK-LABEL: @test_only_used_by_icmp(
15521608; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[B:%.*]], [[C:%.*]]
0 commit comments