@@ -1595,6 +1595,246 @@ exit:
15951595 ret i32 0
15961596}
15971597
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+
15981838define void @gep_addrec_nw (ptr %a ) {
15991839; CHECK-LABEL: 'gep_addrec_nw'
16001840; CHECK-NEXT: Classifying expressions for: @gep_addrec_nw
0 commit comments