@@ -1537,4 +1537,94 @@ define ptr @gep_ashr_without_exact(ptr %p, i64 %off) {
1537
1537
ret ptr %ptr
1538
1538
}
1539
1539
1540
+ define i1 @test_only_used_by_icmp (ptr %a , ptr %b , ptr %c ) {
1541
+ ; CHECK-LABEL: @test_only_used_by_icmp(
1542
+ ; CHECK-NEXT: [[PA:%.*]] = ptrtoint ptr [[A:%.*]] to i64
1543
+ ; CHECK-NEXT: [[PB:%.*]] = ptrtoint ptr [[B:%.*]] to i64
1544
+ ; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[PB]], [[PA]]
1545
+ ; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[A]], i64 [[SUB]]
1546
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[GEP]], [[C:%.*]]
1547
+ ; CHECK-NEXT: ret i1 [[CMP]]
1548
+ ;
1549
+ %pa = ptrtoint ptr %a to i64
1550
+ %pb = ptrtoint ptr %b to i64
1551
+ %sub = sub i64 %pb , %pa
1552
+ %gep = getelementptr i8 , ptr %a , i64 %sub
1553
+ %cmp = icmp eq ptr %gep , %c
1554
+ ret i1 %cmp
1555
+ }
1556
+
1557
+ define i64 @test_only_used_by_ptrtoint (ptr %a , ptr %b ) {
1558
+ ; CHECK-LABEL: @test_only_used_by_ptrtoint(
1559
+ ; CHECK-NEXT: [[PA:%.*]] = ptrtoint ptr [[A:%.*]] to i64
1560
+ ; CHECK-NEXT: [[PB:%.*]] = ptrtoint ptr [[B:%.*]] to i64
1561
+ ; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[PB]], [[PA]]
1562
+ ; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[A]], i64 [[SUB]]
1563
+ ; CHECK-NEXT: [[VAL:%.*]] = ptrtoint ptr [[GEP]] to i64
1564
+ ; CHECK-NEXT: ret i64 [[VAL]]
1565
+ ;
1566
+ %pa = ptrtoint ptr %a to i64
1567
+ %pb = ptrtoint ptr %b to i64
1568
+ %sub = sub i64 %pb , %pa
1569
+ %gep = getelementptr i8 , ptr %a , i64 %sub
1570
+ %val = ptrtoint ptr %gep to i64
1571
+ ret i64 %val
1572
+ }
1573
+
1574
+ define i64 @test_used_by_both (ptr %a , ptr %b , ptr %c ) {
1575
+ ; CHECK-LABEL: @test_used_by_both(
1576
+ ; CHECK-NEXT: [[PA:%.*]] = ptrtoint ptr [[A:%.*]] to i64
1577
+ ; CHECK-NEXT: [[PB:%.*]] = ptrtoint ptr [[B:%.*]] to i64
1578
+ ; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[PB]], [[PA]]
1579
+ ; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[A]], i64 [[SUB]]
1580
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[GEP]], [[C:%.*]]
1581
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
1582
+ ; CHECK: if.then:
1583
+ ; CHECK-NEXT: [[VAL:%.*]] = ptrtoint ptr [[GEP]] to i64
1584
+ ; CHECK-NEXT: ret i64 [[VAL]]
1585
+ ; CHECK: if.else:
1586
+ ; CHECK-NEXT: ret i64 0
1587
+ ;
1588
+ %pa = ptrtoint ptr %a to i64
1589
+ %pb = ptrtoint ptr %b to i64
1590
+ %sub = sub i64 %pb , %pa
1591
+ %gep = getelementptr i8 , ptr %a , i64 %sub
1592
+ %cmp = icmp eq ptr %gep , %c
1593
+ br i1 %cmp , label %if.then , label %if.else
1594
+ if.then:
1595
+ %val = ptrtoint ptr %gep to i64
1596
+ ret i64 %val
1597
+ if.else:
1598
+ ret i64 0
1599
+ }
1600
+
1601
+ ; Negative tests
1602
+
1603
+ define i64 @test_used_by_both_invalid (ptr %a , ptr %b , ptr %c ) {
1604
+ ; CHECK-LABEL: @test_used_by_both_invalid(
1605
+ ; CHECK-NEXT: [[PA:%.*]] = ptrtoint ptr [[A:%.*]] to i64
1606
+ ; CHECK-NEXT: [[PB:%.*]] = ptrtoint ptr [[B:%.*]] to i64
1607
+ ; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[PB]], [[PA]]
1608
+ ; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[A]], i64 [[SUB]]
1609
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[GEP]], [[C:%.*]]
1610
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
1611
+ ; CHECK: if.then:
1612
+ ; CHECK-NEXT: [[VAL:%.*]] = load i64, ptr [[GEP]], align 8
1613
+ ; CHECK-NEXT: ret i64 [[VAL]]
1614
+ ; CHECK: if.else:
1615
+ ; CHECK-NEXT: ret i64 0
1616
+ ;
1617
+ %pa = ptrtoint ptr %a to i64
1618
+ %pb = ptrtoint ptr %b to i64
1619
+ %sub = sub i64 %pb , %pa
1620
+ %gep = getelementptr i8 , ptr %a , i64 %sub
1621
+ %cmp = icmp eq ptr %gep , %c
1622
+ br i1 %cmp , label %if.then , label %if.else
1623
+ if.then:
1624
+ %val = load i64 , ptr %gep , align 8
1625
+ ret i64 %val
1626
+ if.else:
1627
+ ret i64 0
1628
+ }
1629
+
1540
1630
!0 = !{!"branch_weights" , i32 2 , i32 10 }
0 commit comments