@@ -1652,10 +1652,7 @@ exit:
1652
1652
ret void
1653
1653
}
1654
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.
1655
+ ; We are not able to compute exit counts, as %a and %b might not be multiples of 8.
1659
1656
define void @ptr_induction_early_exit_eq_1 (ptr %a , ptr %b , ptr %c ) {
1660
1657
; CHECK-LABEL: 'ptr_induction_early_exit_eq_1'
1661
1658
; CHECK-NEXT: Classifying expressions for: @ptr_induction_early_exit_eq_1
@@ -1693,6 +1690,179 @@ exit:
1693
1690
ret void
1694
1691
}
1695
1692
1693
+ ; Variant of @ptr_induction_early_exit_eq_1 with alignment info via load metadata.
1694
+ define void @ptr_induction_early_exit_eq_1_with_align_on_load (ptr %a , ptr %b , ptr %c ) {
1695
+ ; CHECK-LABEL: 'ptr_induction_early_exit_eq_1_with_align_on_load'
1696
+ ; CHECK-NEXT: Classifying expressions for: @ptr_induction_early_exit_eq_1_with_align_on_load
1697
+ ; CHECK-NEXT: %a_ = load ptr, ptr %a, align 8, !align !0
1698
+ ; CHECK-NEXT: --> %a_ U: [0,-7) S: [-9223372036854775808,9223372036854775801)
1699
+ ; CHECK-NEXT: %b_ = load ptr, ptr %b, align 8, !align !0
1700
+ ; CHECK-NEXT: --> %b_ U: [0,-7) S: [-9223372036854775808,9223372036854775801)
1701
+ ; CHECK-NEXT: %ptr.iv = phi ptr [ %ptr.iv.next, %loop.inc ], [ %a_, %entry ]
1702
+ ; CHECK-NEXT: --> {%a_,+,8}<nuw><%loop> U: [0,-7) S: [-9223372036854775808,9223372036854775801) 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: [0,-7) S: [-9223372036854775808,9223372036854775801) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1707
+ ; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_early_exit_eq_1_with_align_on_load
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 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /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 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
1713
+ ; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
1714
+ ; CHECK-NEXT: symbolic max exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
1715
+ ;
1716
+ entry:
1717
+ %a_ = load ptr , ptr %a , !align !{i64 8 }
1718
+ %b_ = load ptr , ptr %b , !align !{i64 8 }
1719
+ %cmp = icmp eq ptr %a_ , %b_
1720
+ br i1 %cmp , label %exit , label %loop
1721
+
1722
+ loop:
1723
+ %ptr.iv = phi ptr [ %ptr.iv.next , %loop.inc ], [ %a_ , %entry ]
1724
+ %ld1 = load ptr , ptr %ptr.iv , align 8
1725
+ %earlyexitcond = icmp eq ptr %ld1 , %c
1726
+ br i1 %earlyexitcond , label %exit , label %loop.inc
1727
+
1728
+ loop.inc:
1729
+ %ptr.iv.next = getelementptr inbounds i8 , ptr %ptr.iv , i64 8
1730
+ %exitcond = icmp eq ptr %ptr.iv.next , %b_
1731
+ br i1 %exitcond , label %exit , label %loop
1732
+
1733
+ exit:
1734
+ ret void
1735
+ }
1736
+
1737
+ ; Variant of @ptr_induction_early_exit_eq_1 with alignment info via arument attributes.
1738
+ define void @ptr_induction_early_exit_eq_1_with_align_on_arguments (ptr align 8 %a , ptr align 8 %b , ptr %c ) {
1739
+ ; CHECK-LABEL: 'ptr_induction_early_exit_eq_1_with_align_on_arguments'
1740
+ ; CHECK-NEXT: Classifying expressions for: @ptr_induction_early_exit_eq_1_with_align_on_arguments
1741
+ ; CHECK-NEXT: %ptr.iv = phi ptr [ %ptr.iv.next, %loop.inc ], [ %a, %entry ]
1742
+ ; CHECK-NEXT: --> {%a,+,8}<nuw><%loop> U: [0,-7) S: [-9223372036854775808,9223372036854775801) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1743
+ ; CHECK-NEXT: %ld1 = load ptr, ptr %ptr.iv, align 8
1744
+ ; CHECK-NEXT: --> %ld1 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
1745
+ ; CHECK-NEXT: %ptr.iv.next = getelementptr inbounds i8, ptr %ptr.iv, i64 8
1746
+ ; CHECK-NEXT: --> {(8 + %a),+,8}<nw><%loop> U: [0,-7) S: [-9223372036854775808,9223372036854775801) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1747
+ ; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_early_exit_eq_1_with_align_on_arguments
1748
+ ; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
1749
+ ; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
1750
+ ; CHECK-NEXT: exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) /u 8)
1751
+ ; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 2305843009213693951
1752
+ ; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-8 + (-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) /u 8)
1753
+ ; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
1754
+ ; CHECK-NEXT: symbolic max exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) /u 8)
1755
+ ;
1756
+ entry:
1757
+ %cmp = icmp eq ptr %a , %b
1758
+ br i1 %cmp , label %exit , label %loop
1759
+
1760
+ loop:
1761
+ %ptr.iv = phi ptr [ %ptr.iv.next , %loop.inc ], [ %a , %entry ]
1762
+ %ld1 = load ptr , ptr %ptr.iv , align 8
1763
+ %earlyexitcond = icmp eq ptr %ld1 , %c
1764
+ br i1 %earlyexitcond , label %exit , label %loop.inc
1765
+
1766
+ loop.inc:
1767
+ %ptr.iv.next = getelementptr inbounds i8 , ptr %ptr.iv , i64 8
1768
+ %exitcond = icmp eq ptr %ptr.iv.next , %b
1769
+ br i1 %exitcond , label %exit , label %loop
1770
+
1771
+ exit:
1772
+ ret void
1773
+ }
1774
+
1775
+ ; Variant of @ptr_induction_early_exit_eq_1 with alignment assumptions.
1776
+ define void @ptr_induction_early_exit_eq_1_align_assumption_1 (ptr %a , ptr %b , ptr %c ) {
1777
+ ; CHECK-LABEL: 'ptr_induction_early_exit_eq_1_align_assumption_1'
1778
+ ; CHECK-NEXT: Classifying expressions for: @ptr_induction_early_exit_eq_1_align_assumption_1
1779
+ ; CHECK-NEXT: %a_ = load ptr, ptr %a, align 8
1780
+ ; CHECK-NEXT: --> %a_ U: full-set S: full-set
1781
+ ; CHECK-NEXT: %b_ = load ptr, ptr %b, align 8
1782
+ ; CHECK-NEXT: --> %b_ U: full-set S: full-set
1783
+ ; CHECK-NEXT: %ptr.iv = phi ptr [ %ptr.iv.next, %loop.inc ], [ %a_, %entry ]
1784
+ ; CHECK-NEXT: --> {%a_,+,8}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1785
+ ; CHECK-NEXT: %ld1 = load ptr, ptr %ptr.iv, align 8
1786
+ ; CHECK-NEXT: --> %ld1 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
1787
+ ; CHECK-NEXT: %ptr.iv.next = getelementptr inbounds i8, ptr %ptr.iv, i64 8
1788
+ ; CHECK-NEXT: --> {(8 + %a_),+,8}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1789
+ ; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_early_exit_eq_1_align_assumption_1
1790
+ ; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
1791
+ ; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
1792
+ ; CHECK-NEXT: exit count for loop.inc: ***COULDNOTCOMPUTE***
1793
+ ; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
1794
+ ; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
1795
+ ; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
1796
+ ; CHECK-NEXT: symbolic max exit count for loop.inc: ***COULDNOTCOMPUTE***
1797
+ ;
1798
+ entry:
1799
+ %a_ = load ptr , ptr %a
1800
+ call void @llvm.assume (i1 true ) [ "align" (ptr %a_ , i64 8 ) ]
1801
+ %b_ = load ptr , ptr %b
1802
+ call void @llvm.assume (i1 true ) [ "align" (ptr %b_ , i64 8 ) ]
1803
+ %cmp = icmp eq ptr %a_ , %b_
1804
+ br i1 %cmp , label %exit , label %loop
1805
+
1806
+ loop:
1807
+ %ptr.iv = phi ptr [ %ptr.iv.next , %loop.inc ], [ %a_ , %entry ]
1808
+ %ld1 = load ptr , ptr %ptr.iv , align 8
1809
+ %earlyexitcond = icmp eq ptr %ld1 , %c
1810
+ br i1 %earlyexitcond , label %exit , label %loop.inc
1811
+
1812
+ loop.inc:
1813
+ %ptr.iv.next = getelementptr inbounds i8 , ptr %ptr.iv , i64 8
1814
+ %exitcond = icmp eq ptr %ptr.iv.next , %b_
1815
+ br i1 %exitcond , label %exit , label %loop
1816
+
1817
+ exit:
1818
+ ret void
1819
+ }
1820
+
1821
+ define void @ptr_induction_early_exit_eq_1_align_assumption_2 (ptr %a , ptr %b , ptr %c ) {
1822
+ ; CHECK-LABEL: 'ptr_induction_early_exit_eq_1_align_assumption_2'
1823
+ ; CHECK-NEXT: Classifying expressions for: @ptr_induction_early_exit_eq_1_align_assumption_2
1824
+ ; CHECK-NEXT: %a_ = load ptr, ptr %a, align 8
1825
+ ; CHECK-NEXT: --> %a_ U: full-set S: full-set
1826
+ ; CHECK-NEXT: %b_ = load ptr, ptr %b, align 8
1827
+ ; CHECK-NEXT: --> %b_ U: full-set S: full-set
1828
+ ; CHECK-NEXT: %ptr.iv = phi ptr [ %ptr.iv.next, %loop.inc ], [ %a_, %entry ]
1829
+ ; CHECK-NEXT: --> {%a_,+,8}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1830
+ ; CHECK-NEXT: %ld1 = load ptr, ptr %ptr.iv, align 8
1831
+ ; CHECK-NEXT: --> %ld1 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
1832
+ ; CHECK-NEXT: %ptr.iv.next = getelementptr inbounds i8, ptr %ptr.iv, i64 8
1833
+ ; CHECK-NEXT: --> {(8 + %a_),+,8}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1834
+ ; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_early_exit_eq_1_align_assumption_2
1835
+ ; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
1836
+ ; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
1837
+ ; CHECK-NEXT: exit count for loop.inc: ***COULDNOTCOMPUTE***
1838
+ ; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
1839
+ ; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
1840
+ ; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
1841
+ ; CHECK-NEXT: symbolic max exit count for loop.inc: ***COULDNOTCOMPUTE***
1842
+ ;
1843
+ entry:
1844
+ %a_ = load ptr , ptr %a
1845
+ %b_ = load ptr , ptr %b
1846
+ call void @llvm.assume (i1 true ) [ "align" (ptr %a_ , i64 8 ) ]
1847
+ call void @llvm.assume (i1 true ) [ "align" (ptr %b_ , i64 8 ) ]
1848
+ %cmp = icmp eq ptr %a_ , %b_
1849
+ br i1 %cmp , label %exit , label %loop
1850
+
1851
+ loop:
1852
+ %ptr.iv = phi ptr [ %ptr.iv.next , %loop.inc ], [ %a_ , %entry ]
1853
+ %ld1 = load ptr , ptr %ptr.iv , align 8
1854
+ %earlyexitcond = icmp eq ptr %ld1 , %c
1855
+ br i1 %earlyexitcond , label %exit , label %loop.inc
1856
+
1857
+ loop.inc:
1858
+ %ptr.iv.next = getelementptr inbounds i8 , ptr %ptr.iv , i64 8
1859
+ %exitcond = icmp eq ptr %ptr.iv.next , %b_
1860
+ br i1 %exitcond , label %exit , label %loop
1861
+
1862
+ exit:
1863
+ ret void
1864
+ }
1865
+
1696
1866
define void @ptr_induction_early_exit_eq_2 (ptr %a , i64 %n , ptr %c ) {
1697
1867
; CHECK-LABEL: 'ptr_induction_early_exit_eq_2'
1698
1868
; CHECK-NEXT: Classifying expressions for: @ptr_induction_early_exit_eq_2
0 commit comments