Skip to content

Commit 1b5a84a

Browse files
authored
Merge pull request #10135 from fhahn/rt-unroll-scev-alignment-assumption
[ValueTracking] AllowEphemerals for alignment assumptions. Follow up to pick change missed in #10114 to be able to analyze more loops with early exits.
2 parents 4c91810 + 7878475 commit 1b5a84a

File tree

2 files changed

+244
-1
lines changed

2 files changed

+244
-1
lines changed

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -822,9 +822,12 @@ void llvm::computeKnownBitsFromContext(const Value *V, KnownBits &Known,
822822
continue;
823823
if (RetainedKnowledge RK = getKnowledgeFromBundle(
824824
*I, I->bundle_op_info_begin()[Elem.Index])) {
825+
// Allow AllowEphemerals in isValidAssumeForContext, as the CxtI might
826+
// be the producer of the pointer in the bundle. At the moment, align
827+
// assumptions aren't optimized away.
825828
if (RK.WasOn == V && RK.AttrKind == Attribute::Alignment &&
826829
isPowerOf2_64(RK.ArgValue) &&
827-
isValidAssumeForContext(I, Q.CxtI, Q.DT))
830+
isValidAssumeForContext(I, Q.CxtI, Q.DT, /*AllowEphemerals*/ true))
828831
Known.Zero.setLowBits(Log2_64(RK.ArgValue));
829832
}
830833
continue;

llvm/test/Analysis/ScalarEvolution/max-backedge-taken-count-guard-info.ll

Lines changed: 240 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
15981838
define void @gep_addrec_nw(ptr %a) {
15991839
; CHECK-LABEL: 'gep_addrec_nw'
16001840
; CHECK-NEXT: Classifying expressions for: @gep_addrec_nw

0 commit comments

Comments
 (0)