Skip to content

Commit b37c9c2

Browse files
fhahnpuja2196
authored andcommitted
[SCEV] Re-organize tests requiring remainder predicates.
Also adds additional test coverage in Analysis/ScalarEvolution/trip-count-urem.ll Extra test coverage is for llvm/llvm-project#108777.
1 parent 872ab18 commit b37c9c2

File tree

3 files changed

+129
-122
lines changed

3 files changed

+129
-122
lines changed

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

Lines changed: 0 additions & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -1568,86 +1568,6 @@ exit:
15681568
ret i32 0
15691569
}
15701570

1571-
1572-
define i32 @ptr_induction_ult_2(ptr %a, ptr %b) {
1573-
; CHECK-LABEL: 'ptr_induction_ult_2'
1574-
; CHECK-NEXT: Classifying expressions for: @ptr_induction_ult_2
1575-
; CHECK-NEXT: %ptr.iv = phi ptr [ %ptr.iv.next, %loop ], [ %a, %entry ]
1576-
; CHECK-NEXT: --> {%a,+,4}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1577-
; CHECK-NEXT: %ptr.iv.next = getelementptr i32, ptr %ptr.iv, i64 1
1578-
; CHECK-NEXT: --> {(4 + %a),+,4}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1579-
; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_ult_2
1580-
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
1581-
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
1582-
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
1583-
;
1584-
entry:
1585-
%cmp.6 = icmp ult ptr %a, %b
1586-
br i1 %cmp.6, label %loop, label %exit
1587-
1588-
loop:
1589-
%ptr.iv = phi ptr [ %ptr.iv.next, %loop ], [ %a, %entry ]
1590-
%ptr.iv.next = getelementptr i32, ptr %ptr.iv, i64 1
1591-
%exitcond = icmp eq ptr %ptr.iv, %b
1592-
br i1 %exitcond, label %exit, label %loop
1593-
1594-
exit:
1595-
ret i32 0
1596-
}
1597-
1598-
define i32 @ptr_induction_ult_3_step_6(ptr %a, ptr %b) {
1599-
; CHECK-LABEL: 'ptr_induction_ult_3_step_6'
1600-
; CHECK-NEXT: Classifying expressions for: @ptr_induction_ult_3_step_6
1601-
; CHECK-NEXT: %ptr.iv = phi ptr [ %ptr.iv.next, %loop ], [ %a, %entry ]
1602-
; CHECK-NEXT: --> {%a,+,6}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1603-
; CHECK-NEXT: %ptr.iv.next = getelementptr i8, ptr %ptr.iv, i64 6
1604-
; CHECK-NEXT: --> {(6 + %a),+,6}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1605-
; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_ult_3_step_6
1606-
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
1607-
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
1608-
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
1609-
;
1610-
entry:
1611-
%cmp.6 = icmp ult ptr %a, %b
1612-
br i1 %cmp.6, label %loop, label %exit
1613-
1614-
loop:
1615-
%ptr.iv = phi ptr [ %ptr.iv.next, %loop ], [ %a, %entry ]
1616-
%ptr.iv.next = getelementptr i8, ptr %ptr.iv, i64 6
1617-
%exitcond = icmp eq ptr %ptr.iv, %b
1618-
br i1 %exitcond, label %exit, label %loop
1619-
1620-
exit:
1621-
ret i32 0
1622-
}
1623-
1624-
define i32 @ptr_induction_ult_3_step_7(ptr %a, ptr %b) {
1625-
; CHECK-LABEL: 'ptr_induction_ult_3_step_7'
1626-
; CHECK-NEXT: Classifying expressions for: @ptr_induction_ult_3_step_7
1627-
; CHECK-NEXT: %ptr.iv = phi ptr [ %ptr.iv.next, %loop ], [ %a, %entry ]
1628-
; CHECK-NEXT: --> {%a,+,7}<%loop> U: full-set S: full-set Exits: ((-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64) + %a) LoopDispositions: { %loop: Computable }
1629-
; CHECK-NEXT: %ptr.iv.next = getelementptr i8, ptr %ptr.iv, i64 7
1630-
; CHECK-NEXT: --> {(7 + %a),+,7}<%loop> U: full-set S: full-set Exits: (7 + (-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64) + %a) LoopDispositions: { %loop: Computable }
1631-
; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_ult_3_step_7
1632-
; CHECK-NEXT: Loop %loop: backedge-taken count is ((7905747460161236407 * (ptrtoint ptr %b to i64)) + (-7905747460161236407 * (ptrtoint ptr %a to i64)))
1633-
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -1
1634-
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((7905747460161236407 * (ptrtoint ptr %b to i64)) + (-7905747460161236407 * (ptrtoint ptr %a to i64)))
1635-
; CHECK-NEXT: Loop %loop: Trip multiple is 1
1636-
;
1637-
entry:
1638-
%cmp.6 = icmp ult ptr %a, %b
1639-
br i1 %cmp.6, label %loop, label %exit
1640-
1641-
loop:
1642-
%ptr.iv = phi ptr [ %ptr.iv.next, %loop ], [ %a, %entry ]
1643-
%ptr.iv.next = getelementptr i8, ptr %ptr.iv, i64 7
1644-
%exitcond = icmp eq ptr %ptr.iv, %b
1645-
br i1 %exitcond, label %exit, label %loop
1646-
1647-
exit:
1648-
ret i32 0
1649-
}
1650-
16511571
define void @ptr_induction_eq_1(ptr %a, ptr %b) {
16521572
; CHECK-LABEL: 'ptr_induction_eq_1'
16531573
; CHECK-NEXT: Classifying expressions for: @ptr_induction_eq_1
@@ -1705,47 +1625,6 @@ exit:
17051625
ret void
17061626
}
17071627

1708-
; TODO: It feels like we should be able to calculate the symbolic max
1709-
; exit count for the loop.inc block here, in the same way as
1710-
; ptr_induction_eq_1. The problem seems to be in howFarToZero when the
1711-
; ControlsOnlyExit is set to false.
1712-
define void @ptr_induction_early_exit_eq_1(ptr %a, ptr %b, ptr %c) {
1713-
; CHECK-LABEL: 'ptr_induction_early_exit_eq_1'
1714-
; CHECK-NEXT: Classifying expressions for: @ptr_induction_early_exit_eq_1
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
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: Loop %loop: Unpredictable constant max backedge-taken count.
1726-
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
1727-
; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
1728-
; CHECK-NEXT: symbolic max exit count for loop.inc: ***COULDNOTCOMPUTE***
1729-
;
1730-
entry:
1731-
%cmp = icmp eq ptr %a, %b
1732-
br i1 %cmp, label %exit, label %loop
1733-
1734-
loop:
1735-
%ptr.iv = phi ptr [ %ptr.iv.next, %loop.inc ], [ %a, %entry ]
1736-
%ld1 = load ptr, ptr %ptr.iv, align 8
1737-
%earlyexitcond = icmp eq ptr %ld1, %c
1738-
br i1 %earlyexitcond, label %exit, label %loop.inc
1739-
1740-
loop.inc:
1741-
%ptr.iv.next = getelementptr inbounds i8, ptr %ptr.iv, i64 8
1742-
%exitcond = icmp eq ptr %ptr.iv.next, %b
1743-
br i1 %exitcond, label %exit, label %loop
1744-
1745-
exit:
1746-
ret void
1747-
}
1748-
17491628
define void @ptr_induction_early_exit_eq_2(ptr %a, i64 %n, ptr %c) {
17501629
; CHECK-LABEL: 'ptr_induction_early_exit_eq_2'
17511630
; CHECK-NEXT: Classifying expressions for: @ptr_induction_early_exit_eq_2
@@ -1786,7 +1665,6 @@ exit:
17861665
ret void
17871666
}
17881667

1789-
17901668
define void @gep_addrec_nw(ptr %a) {
17911669
; CHECK-LABEL: 'gep_addrec_nw'
17921670
; CHECK-NEXT: Classifying expressions for: @gep_addrec_nw
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -passes='print<scalar-evolution>' -scalar-evolution-classify-expressions=0 -disable-output %s 2>&1 | FileCheck %s
3+
4+
define i32 @ptr_induction_ult(ptr %a, ptr %b) {
5+
; CHECK-LABEL: 'ptr_induction_ult'
6+
; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_ult
7+
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
8+
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
9+
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
10+
;
11+
entry:
12+
%cmp.6 = icmp ult ptr %a, %b
13+
br i1 %cmp.6, label %loop, label %exit
14+
15+
loop:
16+
%ptr.iv = phi ptr [ %ptr.iv.next, %loop ], [ %a, %entry ]
17+
%ptr.iv.next = getelementptr i32, ptr %ptr.iv, i64 1
18+
%exitcond = icmp eq ptr %ptr.iv, %b
19+
br i1 %exitcond, label %exit, label %loop
20+
21+
exit:
22+
ret i32 0
23+
}
24+
25+
define i32 @ptr_induction_ult_3_step_6(ptr %a, ptr %b) {
26+
; CHECK-LABEL: 'ptr_induction_ult_3_step_6'
27+
; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_ult_3_step_6
28+
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
29+
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
30+
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
31+
;
32+
entry:
33+
%cmp.6 = icmp ult ptr %a, %b
34+
br i1 %cmp.6, label %loop, label %exit
35+
36+
loop:
37+
%ptr.iv = phi ptr [ %ptr.iv.next, %loop ], [ %a, %entry ]
38+
%ptr.iv.next = getelementptr i8, ptr %ptr.iv, i64 6
39+
%exitcond = icmp eq ptr %ptr.iv, %b
40+
br i1 %exitcond, label %exit, label %loop
41+
42+
exit:
43+
ret i32 0
44+
}
45+
46+
define i32 @ptr_induction_ult_3_step_7(ptr %a, ptr %b) {
47+
; CHECK-LABEL: 'ptr_induction_ult_3_step_7'
48+
; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_ult_3_step_7
49+
; CHECK-NEXT: Loop %loop: backedge-taken count is ((7905747460161236407 * (ptrtoint ptr %b to i64)) + (-7905747460161236407 * (ptrtoint ptr %a to i64)))
50+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -1
51+
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((7905747460161236407 * (ptrtoint ptr %b to i64)) + (-7905747460161236407 * (ptrtoint ptr %a to i64)))
52+
; CHECK-NEXT: Loop %loop: Trip multiple is 1
53+
;
54+
entry:
55+
%cmp.6 = icmp ult ptr %a, %b
56+
br i1 %cmp.6, label %loop, label %exit
57+
58+
loop:
59+
%ptr.iv = phi ptr [ %ptr.iv.next, %loop ], [ %a, %entry ]
60+
%ptr.iv.next = getelementptr i8, ptr %ptr.iv, i64 7
61+
%exitcond = icmp eq ptr %ptr.iv, %b
62+
br i1 %exitcond, label %exit, label %loop
63+
64+
exit:
65+
ret i32 0
66+
}
67+
68+
; %a and %b may not have the same alignment, so the loop may only via the early
69+
; exit when %ptr.iv > %b. The predicated exit count for the latch can be
70+
; computed by adding a predicate.
71+
define void @ptr_induction_early_exit_eq_1(ptr %a, ptr %b, ptr %c) {
72+
; CHECK-LABEL: 'ptr_induction_early_exit_eq_1'
73+
; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_early_exit_eq_1
74+
; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
75+
; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
76+
; CHECK-NEXT: exit count for loop.inc: ***COULDNOTCOMPUTE***
77+
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
78+
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
79+
; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
80+
; CHECK-NEXT: symbolic max exit count for loop.inc: ***COULDNOTCOMPUTE***
81+
;
82+
entry:
83+
%cmp = icmp eq ptr %a, %b
84+
br i1 %cmp, label %exit, label %loop
85+
86+
loop:
87+
%ptr.iv = phi ptr [ %ptr.iv.next, %loop.inc ], [ %a, %entry ]
88+
%ld1 = load ptr, ptr %ptr.iv, align 8
89+
%earlyexitcond = icmp eq ptr %ld1, %c
90+
br i1 %earlyexitcond, label %exit, label %loop.inc
91+
92+
loop.inc:
93+
%ptr.iv.next = getelementptr inbounds i8, ptr %ptr.iv, i64 8
94+
%exitcond = icmp eq ptr %ptr.iv.next, %b
95+
br i1 %exitcond, label %exit, label %loop
96+
97+
exit:
98+
ret void
99+
}
100+
101+
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
2+
; RUN: opt -passes='print<scalar-evolution>' -scalar-evolution-classify-expressions=0 -disable-output %s 2>&1 | FileCheck %s
3+
4+
declare void @foo()
5+
6+
define void @test_trip_count_expr_contains_urem(i32 %N) {
7+
; CHECK-LABEL: 'test_trip_count_expr_contains_urem'
8+
; CHECK-NEXT: Determining loop execution counts for: @test_trip_count_expr_contains_urem
9+
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
10+
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
11+
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
12+
;
13+
entry:
14+
%n.rnd.up = add i32 %N, 1
15+
%n.mod.vf = urem i32 %n.rnd.up, 16
16+
%n.vec = sub i32 %n.rnd.up, %n.mod.vf
17+
br label %loop
18+
19+
loop:
20+
%index = phi i32 [ 0, %entry ], [ %index.next, %loop ]
21+
%index.next = add i32 %index, 16
22+
call void @foo()
23+
%ec = icmp eq i32 %index, %n.vec
24+
br i1 %ec, label %exit, label %loop
25+
26+
exit:
27+
ret void
28+
}

0 commit comments

Comments
 (0)