@@ -1453,4 +1453,88 @@ define ptr @const_gep_chain(ptr %p, i64 %a) {
14531453 ret ptr %p4
14541454}
14551455
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+
14561540!0 = !{!"branch_weights" , i32 2 , i32 10 }
0 commit comments