@@ -1595,6 +1595,145 @@ exit:
1595
1595
ret i32 0
1596
1596
}
1597
1597
1598
+ define void @ptr_induction_eq_1 (ptr %a , ptr %b ) {
1599
+ ; CHECK-LABEL: 'ptr_induction_eq_1'
1600
+ ; CHECK-NEXT: Classifying expressions for: @ptr_induction_eq_1
1601
+ ; CHECK-NEXT: %ptr.iv = phi ptr [ %ptr.iv.next, %loop ], [ %a, %entry ]
1602
+ ; CHECK-NEXT: --> {%a,+,8}<nuw><%loop> U: full-set S: full-set Exits: ((8 * ((-8 + (-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) /u 8))<nuw> + %a) LoopDispositions: { %loop: Computable }
1603
+ ; CHECK-NEXT: %ptr.iv.next = getelementptr inbounds i8, ptr %ptr.iv, i64 8
1604
+ ; CHECK-NEXT: --> {(8 + %a),+,8}<nuw><%loop> U: full-set S: full-set Exits: (8 + (8 * ((-8 + (-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) /u 8))<nuw> + %a) LoopDispositions: { %loop: Computable }
1605
+ ; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_eq_1
1606
+ ; CHECK-NEXT: Loop %loop: backedge-taken count is ((-8 + (-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) /u 8)
1607
+ ; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 2305843009213693951
1608
+ ; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-8 + (-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) /u 8)
1609
+ ; CHECK-NEXT: Loop %loop: Trip multiple is 1
1610
+ ;
1611
+ entry:
1612
+ %cmp = icmp eq ptr %a , %b
1613
+ br i1 %cmp , label %exit , label %loop
1614
+
1615
+ loop:
1616
+ %ptr.iv = phi ptr [ %ptr.iv.next , %loop ], [ %a , %entry ]
1617
+ %ptr.iv.next = getelementptr inbounds i8 , ptr %ptr.iv , i64 8
1618
+ %exitcond = icmp eq ptr %ptr.iv.next , %b
1619
+ br i1 %exitcond , label %exit , label %loop
1620
+
1621
+ exit:
1622
+ ret void
1623
+ }
1624
+
1625
+ define void @ptr_induction_eq_2 (ptr %a , i64 %n ) {
1626
+ ; CHECK-LABEL: 'ptr_induction_eq_2'
1627
+ ; CHECK-NEXT: Classifying expressions for: @ptr_induction_eq_2
1628
+ ; CHECK-NEXT: %b = getelementptr inbounds ptr, ptr %a, i64 %n
1629
+ ; CHECK-NEXT: --> ((8 * %n)<nsw> + %a) U: full-set S: full-set
1630
+ ; CHECK-NEXT: %ptr.iv = phi ptr [ %ptr.iv.next, %loop ], [ %a, %entry ]
1631
+ ; CHECK-NEXT: --> {%a,+,8}<nuw><%loop> U: full-set S: full-set Exits: ((8 * ((-8 + (8 * %n)<nsw>) /u 8))<nuw> + %a) LoopDispositions: { %loop: Computable }
1632
+ ; CHECK-NEXT: %ptr.iv.next = getelementptr inbounds i8, ptr %ptr.iv, i64 8
1633
+ ; CHECK-NEXT: --> {(8 + %a),+,8}<nuw><%loop> U: full-set S: full-set Exits: (8 + (8 * ((-8 + (8 * %n)<nsw>) /u 8))<nuw> + %a) LoopDispositions: { %loop: Computable }
1634
+ ; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_eq_2
1635
+ ; CHECK-NEXT: Loop %loop: backedge-taken count is ((-8 + (8 * %n)<nsw>) /u 8)
1636
+ ; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 2305843009213693951
1637
+ ; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-8 + (8 * %n)<nsw>) /u 8)
1638
+ ; CHECK-NEXT: Loop %loop: Trip multiple is 1
1639
+ ;
1640
+ entry:
1641
+ %b = getelementptr inbounds ptr , ptr %a , i64 %n
1642
+ %cmp = icmp eq ptr %a , %b
1643
+ br i1 %cmp , label %exit , label %loop
1644
+
1645
+ loop:
1646
+ %ptr.iv = phi ptr [ %ptr.iv.next , %loop ], [ %a , %entry ]
1647
+ %ptr.iv.next = getelementptr inbounds i8 , ptr %ptr.iv , i64 8
1648
+ %exitcond = icmp eq ptr %ptr.iv.next , %b
1649
+ br i1 %exitcond , label %exit , label %loop
1650
+
1651
+ exit:
1652
+ ret void
1653
+ }
1654
+
1655
+ ; TODO: It feels like we should be able to calculate the symbolic max
1656
+ ; exit count for the loop.inc block here, in the same way as
1657
+ ; ptr_induction_eq_1. The problem seems to be in howFarToZero when the
1658
+ ; ControlsOnlyExit is set to false.
1659
+ define void @ptr_induction_early_exit_eq_1 (ptr %a , ptr %b , ptr %c ) {
1660
+ ; CHECK-LABEL: 'ptr_induction_early_exit_eq_1'
1661
+ ; CHECK-NEXT: Classifying expressions for: @ptr_induction_early_exit_eq_1
1662
+ ; CHECK-NEXT: %ptr.iv = phi ptr [ %ptr.iv.next, %loop.inc ], [ %a, %entry ]
1663
+ ; CHECK-NEXT: --> {%a,+,8}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1664
+ ; CHECK-NEXT: %ld1 = load ptr, ptr %ptr.iv, align 8
1665
+ ; CHECK-NEXT: --> %ld1 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
1666
+ ; CHECK-NEXT: %ptr.iv.next = getelementptr inbounds i8, ptr %ptr.iv, i64 8
1667
+ ; CHECK-NEXT: --> {(8 + %a),+,8}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1668
+ ; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_early_exit_eq_1
1669
+ ; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
1670
+ ; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
1671
+ ; CHECK-NEXT: exit count for loop.inc: ***COULDNOTCOMPUTE***
1672
+ ; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
1673
+ ; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
1674
+ ; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
1675
+ ; CHECK-NEXT: symbolic max exit count for loop.inc: ***COULDNOTCOMPUTE***
1676
+ ;
1677
+ entry:
1678
+ %cmp = icmp eq ptr %a , %b
1679
+ br i1 %cmp , label %exit , label %loop
1680
+
1681
+ loop:
1682
+ %ptr.iv = phi ptr [ %ptr.iv.next , %loop.inc ], [ %a , %entry ]
1683
+ %ld1 = load ptr , ptr %ptr.iv , align 8
1684
+ %earlyexitcond = icmp eq ptr %ld1 , %c
1685
+ br i1 %earlyexitcond , label %exit , label %loop.inc
1686
+
1687
+ loop.inc:
1688
+ %ptr.iv.next = getelementptr inbounds i8 , ptr %ptr.iv , i64 8
1689
+ %exitcond = icmp eq ptr %ptr.iv.next , %b
1690
+ br i1 %exitcond , label %exit , label %loop
1691
+
1692
+ exit:
1693
+ ret void
1694
+ }
1695
+
1696
+ define void @ptr_induction_early_exit_eq_2 (ptr %a , i64 %n , ptr %c ) {
1697
+ ; CHECK-LABEL: 'ptr_induction_early_exit_eq_2'
1698
+ ; CHECK-NEXT: Classifying expressions for: @ptr_induction_early_exit_eq_2
1699
+ ; CHECK-NEXT: %b = getelementptr inbounds ptr, ptr %a, i64 %n
1700
+ ; CHECK-NEXT: --> ((8 * %n)<nsw> + %a) U: full-set S: full-set
1701
+ ; CHECK-NEXT: %ptr.iv = phi ptr [ %ptr.iv.next, %loop.inc ], [ %a, %entry ]
1702
+ ; CHECK-NEXT: --> {%a,+,8}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1703
+ ; CHECK-NEXT: %ld1 = load ptr, ptr %ptr.iv, align 8
1704
+ ; CHECK-NEXT: --> %ld1 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
1705
+ ; CHECK-NEXT: %ptr.iv.next = getelementptr inbounds i8, ptr %ptr.iv, i64 8
1706
+ ; CHECK-NEXT: --> {(8 + %a),+,8}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1707
+ ; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_early_exit_eq_2
1708
+ ; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
1709
+ ; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
1710
+ ; CHECK-NEXT: exit count for loop.inc: ((-8 + (8 * %n)<nsw>) /u 8)
1711
+ ; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 2305843009213693951
1712
+ ; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-8 + (8 * %n)<nsw>) /u 8)
1713
+ ; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
1714
+ ; CHECK-NEXT: symbolic max exit count for loop.inc: ((-8 + (8 * %n)<nsw>) /u 8)
1715
+ ;
1716
+ entry:
1717
+ %b = getelementptr inbounds ptr , ptr %a , i64 %n
1718
+ %cmp = icmp eq ptr %a , %b
1719
+ br i1 %cmp , label %exit , label %loop
1720
+
1721
+ loop:
1722
+ %ptr.iv = phi ptr [ %ptr.iv.next , %loop.inc ], [ %a , %entry ]
1723
+ %ld1 = load ptr , ptr %ptr.iv , align 8
1724
+ %earlyexitcond = icmp eq ptr %ld1 , %c
1725
+ br i1 %earlyexitcond , label %exit , label %loop.inc
1726
+
1727
+ loop.inc:
1728
+ %ptr.iv.next = getelementptr inbounds i8 , ptr %ptr.iv , i64 8
1729
+ %exitcond = icmp eq ptr %ptr.iv.next , %b
1730
+ br i1 %exitcond , label %exit , label %loop
1731
+
1732
+ exit:
1733
+ ret void
1734
+ }
1735
+
1736
+
1598
1737
define void @gep_addrec_nw (ptr %a ) {
1599
1738
; CHECK-LABEL: 'gep_addrec_nw'
1600
1739
; CHECK-NEXT: Classifying expressions for: @gep_addrec_nw
0 commit comments