Skip to content

Commit 36adf8e

Browse files
authored
[NFC][Analysis] Add more SCEV tests for ptr inductions (#108210)
I've added more tests to Analysis/ScalarEvolution/max-backedge-taken-count-guard-info.ll to cover more cases of ptr inductions, in particular highlighting what seems to be a disparity between single exit and multiple exit loops.
1 parent 36ad072 commit 36adf8e

File tree

1 file changed

+139
-0
lines changed

1 file changed

+139
-0
lines changed

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

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1595,6 +1595,145 @@ exit:
15951595
ret i32 0
15961596
}
15971597

1598+
define void @ptr_induction_eq_1(ptr %a, ptr %b) {
1599+
; CHECK-LABEL: 'ptr_induction_eq_1'
1600+
; CHECK-NEXT: Classifying expressions for: @ptr_induction_eq_1
1601+
; CHECK-NEXT: %ptr.iv = phi ptr [ %ptr.iv.next, %loop ], [ %a, %entry ]
1602+
; CHECK-NEXT: --> {%a,+,8}<nuw><%loop> U: full-set S: full-set Exits: ((8 * ((-8 + (-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) /u 8))<nuw> + %a) LoopDispositions: { %loop: Computable }
1603+
; CHECK-NEXT: %ptr.iv.next = getelementptr inbounds i8, ptr %ptr.iv, i64 8
1604+
; CHECK-NEXT: --> {(8 + %a),+,8}<nuw><%loop> U: full-set S: full-set Exits: (8 + (8 * ((-8 + (-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) /u 8))<nuw> + %a) LoopDispositions: { %loop: Computable }
1605+
; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_eq_1
1606+
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-8 + (-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) /u 8)
1607+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 2305843009213693951
1608+
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-8 + (-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) /u 8)
1609+
; CHECK-NEXT: Loop %loop: Trip multiple is 1
1610+
;
1611+
entry:
1612+
%cmp = icmp eq ptr %a, %b
1613+
br i1 %cmp, label %exit, label %loop
1614+
1615+
loop:
1616+
%ptr.iv = phi ptr [ %ptr.iv.next, %loop ], [ %a, %entry ]
1617+
%ptr.iv.next = getelementptr inbounds i8, ptr %ptr.iv, i64 8
1618+
%exitcond = icmp eq ptr %ptr.iv.next, %b
1619+
br i1 %exitcond, label %exit, label %loop
1620+
1621+
exit:
1622+
ret void
1623+
}
1624+
1625+
define void @ptr_induction_eq_2(ptr %a, i64 %n) {
1626+
; CHECK-LABEL: 'ptr_induction_eq_2'
1627+
; CHECK-NEXT: Classifying expressions for: @ptr_induction_eq_2
1628+
; CHECK-NEXT: %b = getelementptr inbounds ptr, ptr %a, i64 %n
1629+
; CHECK-NEXT: --> ((8 * %n)<nsw> + %a) U: full-set S: full-set
1630+
; CHECK-NEXT: %ptr.iv = phi ptr [ %ptr.iv.next, %loop ], [ %a, %entry ]
1631+
; 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 }
1632+
; CHECK-NEXT: %ptr.iv.next = getelementptr inbounds i8, ptr %ptr.iv, i64 8
1633+
; 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 }
1634+
; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_eq_2
1635+
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-8 + (8 * %n)<nsw>) /u 8)
1636+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 2305843009213693951
1637+
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-8 + (8 * %n)<nsw>) /u 8)
1638+
; CHECK-NEXT: Loop %loop: Trip multiple is 1
1639+
;
1640+
entry:
1641+
%b = getelementptr inbounds ptr, ptr %a, i64 %n
1642+
%cmp = icmp eq ptr %a, %b
1643+
br i1 %cmp, label %exit, label %loop
1644+
1645+
loop:
1646+
%ptr.iv = phi ptr [ %ptr.iv.next, %loop ], [ %a, %entry ]
1647+
%ptr.iv.next = getelementptr inbounds i8, ptr %ptr.iv, i64 8
1648+
%exitcond = icmp eq ptr %ptr.iv.next, %b
1649+
br i1 %exitcond, label %exit, label %loop
1650+
1651+
exit:
1652+
ret void
1653+
}
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.
1659+
define void @ptr_induction_early_exit_eq_1(ptr %a, ptr %b, ptr %c) {
1660+
; CHECK-LABEL: 'ptr_induction_early_exit_eq_1'
1661+
; CHECK-NEXT: Classifying expressions for: @ptr_induction_early_exit_eq_1
1662+
; CHECK-NEXT: %ptr.iv = phi ptr [ %ptr.iv.next, %loop.inc ], [ %a, %entry ]
1663+
; CHECK-NEXT: --> {%a,+,8}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1664+
; CHECK-NEXT: %ld1 = load ptr, ptr %ptr.iv, align 8
1665+
; CHECK-NEXT: --> %ld1 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
1666+
; CHECK-NEXT: %ptr.iv.next = getelementptr inbounds i8, ptr %ptr.iv, i64 8
1667+
; CHECK-NEXT: --> {(8 + %a),+,8}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1668+
; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_early_exit_eq_1
1669+
; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
1670+
; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
1671+
; CHECK-NEXT: exit count for loop.inc: ***COULDNOTCOMPUTE***
1672+
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
1673+
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
1674+
; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
1675+
; CHECK-NEXT: symbolic max exit count for loop.inc: ***COULDNOTCOMPUTE***
1676+
;
1677+
entry:
1678+
%cmp = icmp eq ptr %a, %b
1679+
br i1 %cmp, label %exit, label %loop
1680+
1681+
loop:
1682+
%ptr.iv = phi ptr [ %ptr.iv.next, %loop.inc ], [ %a, %entry ]
1683+
%ld1 = load ptr, ptr %ptr.iv, align 8
1684+
%earlyexitcond = icmp eq ptr %ld1, %c
1685+
br i1 %earlyexitcond, label %exit, label %loop.inc
1686+
1687+
loop.inc:
1688+
%ptr.iv.next = getelementptr inbounds i8, ptr %ptr.iv, i64 8
1689+
%exitcond = icmp eq ptr %ptr.iv.next, %b
1690+
br i1 %exitcond, label %exit, label %loop
1691+
1692+
exit:
1693+
ret void
1694+
}
1695+
1696+
define void @ptr_induction_early_exit_eq_2(ptr %a, i64 %n, ptr %c) {
1697+
; CHECK-LABEL: 'ptr_induction_early_exit_eq_2'
1698+
; CHECK-NEXT: Classifying expressions for: @ptr_induction_early_exit_eq_2
1699+
; CHECK-NEXT: %b = getelementptr inbounds ptr, ptr %a, i64 %n
1700+
; CHECK-NEXT: --> ((8 * %n)<nsw> + %a) U: full-set S: full-set
1701+
; CHECK-NEXT: %ptr.iv = phi ptr [ %ptr.iv.next, %loop.inc ], [ %a, %entry ]
1702+
; CHECK-NEXT: --> {%a,+,8}<nuw><%loop> U: full-set S: full-set 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: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1707+
; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_early_exit_eq_2
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 + (8 * %n)<nsw>) /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 + (8 * %n)<nsw>) /u 8)
1713+
; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
1714+
; CHECK-NEXT: symbolic max exit count for loop.inc: ((-8 + (8 * %n)<nsw>) /u 8)
1715+
;
1716+
entry:
1717+
%b = getelementptr inbounds ptr, ptr %a, i64 %n
1718+
%cmp = icmp eq ptr %a, %b
1719+
br i1 %cmp, label %exit, label %loop
1720+
1721+
loop:
1722+
%ptr.iv = phi ptr [ %ptr.iv.next, %loop.inc ], [ %a, %entry ]
1723+
%ld1 = load ptr, ptr %ptr.iv, align 8
1724+
%earlyexitcond = icmp eq ptr %ld1, %c
1725+
br i1 %earlyexitcond, label %exit, label %loop.inc
1726+
1727+
loop.inc:
1728+
%ptr.iv.next = getelementptr inbounds i8, ptr %ptr.iv, i64 8
1729+
%exitcond = icmp eq ptr %ptr.iv.next, %b
1730+
br i1 %exitcond, label %exit, label %loop
1731+
1732+
exit:
1733+
ret void
1734+
}
1735+
1736+
15981737
define void @gep_addrec_nw(ptr %a) {
15991738
; CHECK-LABEL: 'gep_addrec_nw'
16001739
; CHECK-NEXT: Classifying expressions for: @gep_addrec_nw

0 commit comments

Comments
 (0)