@@ -1595,6 +1595,246 @@ exit:
1595
1595
ret i32 0
1596
1596
}
1597
1597
1598
+ define void @ptr_induction_eq_2 (ptr %a , i64 %n ) {
1599
+ ; CHECK-LABEL: 'ptr_induction_eq_2'
1600
+ ; CHECK-NEXT: Classifying expressions for: @ptr_induction_eq_2
1601
+ ; CHECK-NEXT: %b = getelementptr inbounds ptr, ptr %a, i64 %n
1602
+ ; CHECK-NEXT: --> ((8 * %n)<nsw> + %a) U: full-set S: full-set
1603
+ ; CHECK-NEXT: %ptr.iv = phi ptr [ %ptr.iv.next, %loop ], [ %a, %entry ]
1604
+ ; 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 }
1605
+ ; CHECK-NEXT: %ptr.iv.next = getelementptr inbounds i8, ptr %ptr.iv, i64 8
1606
+ ; 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 }
1607
+ ; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_eq_2
1608
+ ; CHECK-NEXT: Loop %loop: backedge-taken count is ((-8 + (8 * %n)<nsw>) /u 8)
1609
+ ; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 2305843009213693951
1610
+ ; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-8 + (8 * %n)<nsw>) /u 8)
1611
+ ; CHECK-NEXT: Loop %loop: Trip multiple is 1
1612
+ ;
1613
+ entry:
1614
+ %b = getelementptr inbounds ptr , ptr %a , i64 %n
1615
+ %cmp = icmp eq ptr %a , %b
1616
+ br i1 %cmp , label %exit , label %loop
1617
+
1618
+ loop:
1619
+ %ptr.iv = phi ptr [ %ptr.iv.next , %loop ], [ %a , %entry ]
1620
+ %ptr.iv.next = getelementptr inbounds i8 , ptr %ptr.iv , i64 8
1621
+ %exitcond = icmp eq ptr %ptr.iv.next , %b
1622
+ br i1 %exitcond , label %exit , label %loop
1623
+
1624
+ exit:
1625
+ ret void
1626
+ }
1627
+
1628
+ define void @ptr_induction_early_exit_eq_1_with_align_on_load (ptr %a , ptr %b , ptr %c ) {
1629
+ ; CHECK-LABEL: 'ptr_induction_early_exit_eq_1_with_align_on_load'
1630
+ ; CHECK-NEXT: Classifying expressions for: @ptr_induction_early_exit_eq_1_with_align_on_load
1631
+ ; CHECK-NEXT: %a_ = load ptr, ptr %a, align 8, !align !0
1632
+ ; CHECK-NEXT: --> %a_ U: [0,-7) S: [-9223372036854775808,9223372036854775801)
1633
+ ; CHECK-NEXT: %b_ = load ptr, ptr %b, align 8, !align !0
1634
+ ; CHECK-NEXT: --> %b_ U: [0,-7) S: [-9223372036854775808,9223372036854775801)
1635
+ ; CHECK-NEXT: %ptr.iv = phi ptr [ %ptr.iv.next, %loop.inc ], [ %a_, %entry ]
1636
+ ; CHECK-NEXT: --> {%a_,+,8}<nuw><%loop> U: [0,-7) S: [-9223372036854775808,9223372036854775801) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1637
+ ; CHECK-NEXT: %ld1 = load ptr, ptr %ptr.iv, align 8
1638
+ ; CHECK-NEXT: --> %ld1 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
1639
+ ; CHECK-NEXT: %ptr.iv.next = getelementptr inbounds i8, ptr %ptr.iv, i64 8
1640
+ ; CHECK-NEXT: --> {(8 + %a_),+,8}<nw><%loop> U: [0,-7) S: [-9223372036854775808,9223372036854775801) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1641
+ ; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_early_exit_eq_1_with_align_on_load
1642
+ ; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
1643
+ ; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
1644
+ ; CHECK-NEXT: exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
1645
+ ; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 2305843009213693951
1646
+ ; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
1647
+ ; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
1648
+ ; CHECK-NEXT: symbolic max exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
1649
+ ;
1650
+ entry:
1651
+ %a_ = load ptr , ptr %a , !align !{i64 8 }
1652
+ %b_ = load ptr , ptr %b , !align !{i64 8 }
1653
+ %cmp = icmp eq ptr %a_ , %b_
1654
+ br i1 %cmp , label %exit , label %loop
1655
+
1656
+ loop:
1657
+ %ptr.iv = phi ptr [ %ptr.iv.next , %loop.inc ], [ %a_ , %entry ]
1658
+ %ld1 = load ptr , ptr %ptr.iv , align 8
1659
+ %earlyexitcond = icmp eq ptr %ld1 , %c
1660
+ br i1 %earlyexitcond , label %exit , label %loop.inc
1661
+
1662
+ loop.inc:
1663
+ %ptr.iv.next = getelementptr inbounds i8 , ptr %ptr.iv , i64 8
1664
+ %exitcond = icmp eq ptr %ptr.iv.next , %b_
1665
+ br i1 %exitcond , label %exit , label %loop
1666
+
1667
+ exit:
1668
+ ret void
1669
+ }
1670
+
1671
+ define void @ptr_induction_early_exit_eq_1_with_align_on_arguments (ptr align 8 %a , ptr align 8 %b , ptr %c ) {
1672
+ ; CHECK-LABEL: 'ptr_induction_early_exit_eq_1_with_align_on_arguments'
1673
+ ; CHECK-NEXT: Classifying expressions for: @ptr_induction_early_exit_eq_1_with_align_on_arguments
1674
+ ; CHECK-NEXT: %ptr.iv = phi ptr [ %ptr.iv.next, %loop.inc ], [ %a, %entry ]
1675
+ ; CHECK-NEXT: --> {%a,+,8}<nuw><%loop> U: [0,-7) S: [-9223372036854775808,9223372036854775801) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1676
+ ; CHECK-NEXT: %ld1 = load ptr, ptr %ptr.iv, align 8
1677
+ ; CHECK-NEXT: --> %ld1 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
1678
+ ; CHECK-NEXT: %ptr.iv.next = getelementptr inbounds i8, ptr %ptr.iv, i64 8
1679
+ ; CHECK-NEXT: --> {(8 + %a),+,8}<nw><%loop> U: [0,-7) S: [-9223372036854775808,9223372036854775801) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1680
+ ; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_early_exit_eq_1_with_align_on_arguments
1681
+ ; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
1682
+ ; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
1683
+ ; CHECK-NEXT: exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) /u 8)
1684
+ ; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 2305843009213693951
1685
+ ; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-8 + (-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) /u 8)
1686
+ ; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
1687
+ ; CHECK-NEXT: symbolic max exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) /u 8)
1688
+ ;
1689
+ entry:
1690
+ %cmp = icmp eq ptr %a , %b
1691
+ br i1 %cmp , label %exit , label %loop
1692
+
1693
+ loop:
1694
+ %ptr.iv = phi ptr [ %ptr.iv.next , %loop.inc ], [ %a , %entry ]
1695
+ %ld1 = load ptr , ptr %ptr.iv , align 8
1696
+ %earlyexitcond = icmp eq ptr %ld1 , %c
1697
+ br i1 %earlyexitcond , label %exit , label %loop.inc
1698
+
1699
+ loop.inc:
1700
+ %ptr.iv.next = getelementptr inbounds i8 , ptr %ptr.iv , i64 8
1701
+ %exitcond = icmp eq ptr %ptr.iv.next , %b
1702
+ br i1 %exitcond , label %exit , label %loop
1703
+
1704
+ exit:
1705
+ ret void
1706
+ }
1707
+
1708
+ define void @ptr_induction_early_exit_eq_1_align_assumption_1 (ptr %a , ptr %b , ptr %c ) {
1709
+ ; CHECK-LABEL: 'ptr_induction_early_exit_eq_1_align_assumption_1'
1710
+ ; CHECK-NEXT: Classifying expressions for: @ptr_induction_early_exit_eq_1_align_assumption_1
1711
+ ; CHECK-NEXT: %a_ = load ptr, ptr %a, align 8
1712
+ ; CHECK-NEXT: --> %a_ U: [0,-7) S: [-9223372036854775808,9223372036854775801)
1713
+ ; CHECK-NEXT: %b_ = load ptr, ptr %b, align 8
1714
+ ; CHECK-NEXT: --> %b_ U: [0,-7) S: [-9223372036854775808,9223372036854775801)
1715
+ ; CHECK-NEXT: %ptr.iv = phi ptr [ %ptr.iv.next, %loop.inc ], [ %a_, %entry ]
1716
+ ; CHECK-NEXT: --> {%a_,+,8}<nuw><%loop> U: [0,-7) S: [-9223372036854775808,9223372036854775801) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1717
+ ; CHECK-NEXT: %ld1 = load ptr, ptr %ptr.iv, align 8
1718
+ ; CHECK-NEXT: --> %ld1 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
1719
+ ; CHECK-NEXT: %ptr.iv.next = getelementptr inbounds i8, ptr %ptr.iv, i64 8
1720
+ ; CHECK-NEXT: --> {(8 + %a_),+,8}<nw><%loop> U: [0,-7) S: [-9223372036854775808,9223372036854775801) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1721
+ ; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_early_exit_eq_1_align_assumption_1
1722
+ ; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
1723
+ ; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
1724
+ ; CHECK-NEXT: exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
1725
+ ; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 2305843009213693951
1726
+ ; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
1727
+ ; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
1728
+ ; CHECK-NEXT: symbolic max exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
1729
+ ;
1730
+ entry:
1731
+ %a_ = load ptr , ptr %a
1732
+ call void @llvm.assume (i1 true ) [ "align" (ptr %a_ , i64 8 ) ]
1733
+ %b_ = load ptr , ptr %b
1734
+ call void @llvm.assume (i1 true ) [ "align" (ptr %b_ , i64 8 ) ]
1735
+ %cmp = icmp eq ptr %a_ , %b_
1736
+ br i1 %cmp , label %exit , label %loop
1737
+
1738
+ loop:
1739
+ %ptr.iv = phi ptr [ %ptr.iv.next , %loop.inc ], [ %a_ , %entry ]
1740
+ %ld1 = load ptr , ptr %ptr.iv , align 8
1741
+ %earlyexitcond = icmp eq ptr %ld1 , %c
1742
+ br i1 %earlyexitcond , label %exit , label %loop.inc
1743
+
1744
+ loop.inc:
1745
+ %ptr.iv.next = getelementptr inbounds i8 , ptr %ptr.iv , i64 8
1746
+ %exitcond = icmp eq ptr %ptr.iv.next , %b_
1747
+ br i1 %exitcond , label %exit , label %loop
1748
+
1749
+ exit:
1750
+ ret void
1751
+ }
1752
+
1753
+ define void @ptr_induction_early_exit_eq_1_align_assumption_2 (ptr %a , ptr %b , ptr %c ) {
1754
+ ; CHECK-LABEL: 'ptr_induction_early_exit_eq_1_align_assumption_2'
1755
+ ; CHECK-NEXT: Classifying expressions for: @ptr_induction_early_exit_eq_1_align_assumption_2
1756
+ ; CHECK-NEXT: %a_ = load ptr, ptr %a, align 8
1757
+ ; CHECK-NEXT: --> %a_ U: [0,-7) S: [-9223372036854775808,9223372036854775801)
1758
+ ; CHECK-NEXT: %b_ = load ptr, ptr %b, align 8
1759
+ ; CHECK-NEXT: --> %b_ U: [0,-7) S: [-9223372036854775808,9223372036854775801)
1760
+ ; CHECK-NEXT: %ptr.iv = phi ptr [ %ptr.iv.next, %loop.inc ], [ %a_, %entry ]
1761
+ ; CHECK-NEXT: --> {%a_,+,8}<nuw><%loop> U: [0,-7) S: [-9223372036854775808,9223372036854775801) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1762
+ ; CHECK-NEXT: %ld1 = load ptr, ptr %ptr.iv, align 8
1763
+ ; CHECK-NEXT: --> %ld1 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
1764
+ ; CHECK-NEXT: %ptr.iv.next = getelementptr inbounds i8, ptr %ptr.iv, i64 8
1765
+ ; CHECK-NEXT: --> {(8 + %a_),+,8}<nw><%loop> U: [0,-7) S: [-9223372036854775808,9223372036854775801) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1766
+ ; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_early_exit_eq_1_align_assumption_2
1767
+ ; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
1768
+ ; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
1769
+ ; CHECK-NEXT: exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
1770
+ ; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 2305843009213693951
1771
+ ; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
1772
+ ; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
1773
+ ; CHECK-NEXT: symbolic max exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
1774
+ ;
1775
+ entry:
1776
+ %a_ = load ptr , ptr %a
1777
+ %b_ = load ptr , ptr %b
1778
+ call void @llvm.assume (i1 true ) [ "align" (ptr %a_ , i64 8 ) ]
1779
+ call void @llvm.assume (i1 true ) [ "align" (ptr %b_ , i64 8 ) ]
1780
+ %cmp = icmp eq ptr %a_ , %b_
1781
+ br i1 %cmp , label %exit , label %loop
1782
+
1783
+ loop:
1784
+ %ptr.iv = phi ptr [ %ptr.iv.next , %loop.inc ], [ %a_ , %entry ]
1785
+ %ld1 = load ptr , ptr %ptr.iv , align 8
1786
+ %earlyexitcond = icmp eq ptr %ld1 , %c
1787
+ br i1 %earlyexitcond , label %exit , label %loop.inc
1788
+
1789
+ loop.inc:
1790
+ %ptr.iv.next = getelementptr inbounds i8 , ptr %ptr.iv , i64 8
1791
+ %exitcond = icmp eq ptr %ptr.iv.next , %b_
1792
+ br i1 %exitcond , label %exit , label %loop
1793
+
1794
+ exit:
1795
+ ret void
1796
+ }
1797
+
1798
+ define void @ptr_induction_early_exit_eq_2 (ptr %a , i64 %n , ptr %c ) {
1799
+ ; CHECK-LABEL: 'ptr_induction_early_exit_eq_2'
1800
+ ; CHECK-NEXT: Classifying expressions for: @ptr_induction_early_exit_eq_2
1801
+ ; CHECK-NEXT: %b = getelementptr inbounds ptr, ptr %a, i64 %n
1802
+ ; CHECK-NEXT: --> ((8 * %n)<nsw> + %a) U: full-set S: full-set
1803
+ ; CHECK-NEXT: %ptr.iv = phi ptr [ %ptr.iv.next, %loop.inc ], [ %a, %entry ]
1804
+ ; CHECK-NEXT: --> {%a,+,8}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1805
+ ; CHECK-NEXT: %ld1 = load ptr, ptr %ptr.iv, align 8
1806
+ ; CHECK-NEXT: --> %ld1 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
1807
+ ; CHECK-NEXT: %ptr.iv.next = getelementptr inbounds i8, ptr %ptr.iv, i64 8
1808
+ ; CHECK-NEXT: --> {(8 + %a),+,8}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1809
+ ; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_early_exit_eq_2
1810
+ ; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
1811
+ ; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
1812
+ ; CHECK-NEXT: exit count for loop.inc: ((-8 + (8 * %n)<nsw>) /u 8)
1813
+ ; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 2305843009213693951
1814
+ ; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-8 + (8 * %n)<nsw>) /u 8)
1815
+ ; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
1816
+ ; CHECK-NEXT: symbolic max exit count for loop.inc: ((-8 + (8 * %n)<nsw>) /u 8)
1817
+ ;
1818
+ entry:
1819
+ %b = getelementptr inbounds ptr , ptr %a , i64 %n
1820
+ %cmp = icmp eq ptr %a , %b
1821
+ br i1 %cmp , label %exit , label %loop
1822
+
1823
+ loop:
1824
+ %ptr.iv = phi ptr [ %ptr.iv.next , %loop.inc ], [ %a , %entry ]
1825
+ %ld1 = load ptr , ptr %ptr.iv , align 8
1826
+ %earlyexitcond = icmp eq ptr %ld1 , %c
1827
+ br i1 %earlyexitcond , label %exit , label %loop.inc
1828
+
1829
+ loop.inc:
1830
+ %ptr.iv.next = getelementptr inbounds i8 , ptr %ptr.iv , i64 8
1831
+ %exitcond = icmp eq ptr %ptr.iv.next , %b
1832
+ br i1 %exitcond , label %exit , label %loop
1833
+
1834
+ exit:
1835
+ ret void
1836
+ }
1837
+
1598
1838
define void @gep_addrec_nw (ptr %a ) {
1599
1839
; CHECK-LABEL: 'gep_addrec_nw'
1600
1840
; CHECK-NEXT: Classifying expressions for: @gep_addrec_nw
0 commit comments