@@ -1625,6 +1625,204 @@ exit:
16251625 ret void
16261626}
16271627
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: full-set S: full-set
1713+ ; CHECK-NEXT: %b_ = load ptr, ptr %b, align 8
1714+ ; CHECK-NEXT: --> %b_ U: full-set S: full-set
1715+ ; CHECK-NEXT: %ptr.iv = phi ptr [ %ptr.iv.next, %loop.inc ], [ %a_, %entry ]
1716+ ; CHECK-NEXT: --> {%a_,+,8}<nuw><%loop> U: full-set S: full-set 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: full-set S: full-set 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: ***COULDNOTCOMPUTE***
1725+ ; CHECK-NEXT: predicated exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
1726+ ; CHECK-NEXT: Predicates:
1727+ ; CHECK-NEXT: Equal predicate: (zext i3 ((trunc i64 (ptrtoint ptr %b_ to i64) to i3) + (-1 * (trunc i64 (ptrtoint ptr %a_ to i64) to i3))) to i64) == 0
1728+ ; CHECK-EMPTY:
1729+ ; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
1730+ ; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
1731+ ; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
1732+ ; CHECK-NEXT: symbolic max exit count for loop.inc: ***COULDNOTCOMPUTE***
1733+ ; CHECK-NEXT: predicated symbolic max exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
1734+ ; CHECK-NEXT: Predicates:
1735+ ; CHECK-NEXT: Equal predicate: (zext i3 ((trunc i64 (ptrtoint ptr %b_ to i64) to i3) + (-1 * (trunc i64 (ptrtoint ptr %a_ to i64) to i3))) to i64) == 0
1736+ ; CHECK-EMPTY:
1737+ ; CHECK-NEXT: Loop %loop: Predicated constant max backedge-taken count is i64 2305843009213693951
1738+ ; CHECK-NEXT: Predicates:
1739+ ; CHECK-NEXT: Equal predicate: (zext i3 ((trunc i64 (ptrtoint ptr %b_ to i64) to i3) + (-1 * (trunc i64 (ptrtoint ptr %a_ to i64) to i3))) to i64) == 0
1740+ ; CHECK-NEXT: Loop %loop: Predicated symbolic max backedge-taken count is ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
1741+ ; CHECK-NEXT: Predicates:
1742+ ; CHECK-NEXT: Equal predicate: (zext i3 ((trunc i64 (ptrtoint ptr %b_ to i64) to i3) + (-1 * (trunc i64 (ptrtoint ptr %a_ to i64) to i3))) to i64) == 0
1743+ ;
1744+ entry:
1745+ %a_ = load ptr , ptr %a
1746+ call void @llvm.assume (i1 true ) [ "align" (ptr %a_ , i64 8 ) ]
1747+ %b_ = load ptr , ptr %b
1748+ call void @llvm.assume (i1 true ) [ "align" (ptr %b_ , i64 8 ) ]
1749+ %cmp = icmp eq ptr %a_ , %b_
1750+ br i1 %cmp , label %exit , label %loop
1751+
1752+ loop:
1753+ %ptr.iv = phi ptr [ %ptr.iv.next , %loop.inc ], [ %a_ , %entry ]
1754+ %ld1 = load ptr , ptr %ptr.iv , align 8
1755+ %earlyexitcond = icmp eq ptr %ld1 , %c
1756+ br i1 %earlyexitcond , label %exit , label %loop.inc
1757+
1758+ loop.inc:
1759+ %ptr.iv.next = getelementptr inbounds i8 , ptr %ptr.iv , i64 8
1760+ %exitcond = icmp eq ptr %ptr.iv.next , %b_
1761+ br i1 %exitcond , label %exit , label %loop
1762+
1763+ exit:
1764+ ret void
1765+ }
1766+
1767+ define void @ptr_induction_early_exit_eq_1_align_assumption_2 (ptr %a , ptr %b , ptr %c ) {
1768+ ; CHECK-LABEL: 'ptr_induction_early_exit_eq_1_align_assumption_2'
1769+ ; CHECK-NEXT: Classifying expressions for: @ptr_induction_early_exit_eq_1_align_assumption_2
1770+ ; CHECK-NEXT: %a_ = load ptr, ptr %a, align 8
1771+ ; CHECK-NEXT: --> %a_ U: full-set S: full-set
1772+ ; CHECK-NEXT: %b_ = load ptr, ptr %b, align 8
1773+ ; CHECK-NEXT: --> %b_ U: full-set S: full-set
1774+ ; CHECK-NEXT: %ptr.iv = phi ptr [ %ptr.iv.next, %loop.inc ], [ %a_, %entry ]
1775+ ; CHECK-NEXT: --> {%a_,+,8}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1776+ ; CHECK-NEXT: %ld1 = load ptr, ptr %ptr.iv, align 8
1777+ ; CHECK-NEXT: --> %ld1 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
1778+ ; CHECK-NEXT: %ptr.iv.next = getelementptr inbounds i8, ptr %ptr.iv, i64 8
1779+ ; CHECK-NEXT: --> {(8 + %a_),+,8}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1780+ ; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_early_exit_eq_1_align_assumption_2
1781+ ; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
1782+ ; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
1783+ ; CHECK-NEXT: exit count for loop.inc: ***COULDNOTCOMPUTE***
1784+ ; CHECK-NEXT: predicated exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
1785+ ; CHECK-NEXT: Predicates:
1786+ ; CHECK-NEXT: Equal predicate: (zext i3 ((trunc i64 (ptrtoint ptr %b_ to i64) to i3) + (-1 * (trunc i64 (ptrtoint ptr %a_ to i64) to i3))) to i64) == 0
1787+ ; CHECK-EMPTY:
1788+ ; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
1789+ ; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
1790+ ; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
1791+ ; CHECK-NEXT: symbolic max exit count for loop.inc: ***COULDNOTCOMPUTE***
1792+ ; CHECK-NEXT: predicated symbolic max exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
1793+ ; CHECK-NEXT: Predicates:
1794+ ; CHECK-NEXT: Equal predicate: (zext i3 ((trunc i64 (ptrtoint ptr %b_ to i64) to i3) + (-1 * (trunc i64 (ptrtoint ptr %a_ to i64) to i3))) to i64) == 0
1795+ ; CHECK-EMPTY:
1796+ ; CHECK-NEXT: Loop %loop: Predicated constant max backedge-taken count is i64 2305843009213693951
1797+ ; CHECK-NEXT: Predicates:
1798+ ; CHECK-NEXT: Equal predicate: (zext i3 ((trunc i64 (ptrtoint ptr %b_ to i64) to i3) + (-1 * (trunc i64 (ptrtoint ptr %a_ to i64) to i3))) to i64) == 0
1799+ ; CHECK-NEXT: Loop %loop: Predicated symbolic max backedge-taken count is ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
1800+ ; CHECK-NEXT: Predicates:
1801+ ; CHECK-NEXT: Equal predicate: (zext i3 ((trunc i64 (ptrtoint ptr %b_ to i64) to i3) + (-1 * (trunc i64 (ptrtoint ptr %a_ to i64) to i3))) to i64) == 0
1802+ ;
1803+ entry:
1804+ %a_ = load ptr , ptr %a
1805+ %b_ = load ptr , ptr %b
1806+ call void @llvm.assume (i1 true ) [ "align" (ptr %a_ , i64 8 ) ]
1807+ call void @llvm.assume (i1 true ) [ "align" (ptr %b_ , i64 8 ) ]
1808+ %cmp = icmp eq ptr %a_ , %b_
1809+ br i1 %cmp , label %exit , label %loop
1810+
1811+ loop:
1812+ %ptr.iv = phi ptr [ %ptr.iv.next , %loop.inc ], [ %a_ , %entry ]
1813+ %ld1 = load ptr , ptr %ptr.iv , align 8
1814+ %earlyexitcond = icmp eq ptr %ld1 , %c
1815+ br i1 %earlyexitcond , label %exit , label %loop.inc
1816+
1817+ loop.inc:
1818+ %ptr.iv.next = getelementptr inbounds i8 , ptr %ptr.iv , i64 8
1819+ %exitcond = icmp eq ptr %ptr.iv.next , %b_
1820+ br i1 %exitcond , label %exit , label %loop
1821+
1822+ exit:
1823+ ret void
1824+ }
1825+
16281826define void @ptr_induction_early_exit_eq_2 (ptr %a , i64 %n , ptr %c ) {
16291827; CHECK-LABEL: 'ptr_induction_early_exit_eq_2'
16301828; CHECK-NEXT: Classifying expressions for: @ptr_induction_early_exit_eq_2
0 commit comments