Skip to content

Commit e894654

Browse files
committed
[SCEV] Add tests for UDiv canonicalization of AddRecs that may wrap.
Add test cases for canonicalizing AddRecs that may wrap.
1 parent 074d17e commit e894654

File tree

1 file changed

+169
-0
lines changed

1 file changed

+169
-0
lines changed
Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 6
2+
; RUN: opt < %s -passes='print<scalar-evolution>' -disable-output 2>&1 | FileCheck %s
3+
4+
declare void @use(i64)
5+
6+
define void @test_step2_div4(i64 %n) {
7+
; CHECK-LABEL: 'test_step2_div4'
8+
; CHECK-NEXT: Classifying expressions for: @test_step2_div4
9+
; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
10+
; CHECK-NEXT: --> {0,+,2}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
11+
; CHECK-NEXT: %div.0 = udiv i64 %iv, 4
12+
; CHECK-NEXT: --> ({0,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
13+
; CHECK-NEXT: %iv.1 = add i64 %iv, 1
14+
; CHECK-NEXT: --> {1,+,2}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
15+
; CHECK-NEXT: %div.1 = udiv i64 %iv.1, 4
16+
; CHECK-NEXT: --> ({1,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
17+
; CHECK-NEXT: %iv.2 = add i64 %iv, 2
18+
; CHECK-NEXT: --> {2,+,2}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
19+
; CHECK-NEXT: %div.2 = udiv i64 %iv.2, 4
20+
; CHECK-NEXT: --> ({2,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
21+
; CHECK-NEXT: %iv.neg.1 = add i64 %iv, -1
22+
; CHECK-NEXT: --> {-1,+,2}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
23+
; CHECK-NEXT: %div.neg.1 = udiv i64 %iv.neg.1, 4
24+
; CHECK-NEXT: --> ({-1,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
25+
; CHECK-NEXT: %iv.next = add i64 %iv, 2
26+
; CHECK-NEXT: --> {2,+,2}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
27+
; CHECK-NEXT: Determining loop execution counts for: @test_step2_div4
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+
br label %loop
34+
35+
loop:
36+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
37+
%div.0 = udiv i64 %iv, 4
38+
call void @use(i64 %div.0)
39+
%iv.1 = add i64 %iv, 1
40+
%div.1 = udiv i64 %iv.1, 4
41+
call void @use(i64 %div.1)
42+
%iv.2 = add i64 %iv, 2
43+
%div.2 = udiv i64 %iv.2, 4
44+
call void @use(i64 %div.2)
45+
%iv.neg.1 = add i64 %iv, -1
46+
%div.neg.1 = udiv i64 %iv.neg.1, 4
47+
call void @use(i64 %div.neg.1)
48+
%iv.next = add i64 %iv, 2
49+
%cond = icmp slt i64 %iv, %n
50+
br i1 %cond, label %loop, label %exit
51+
52+
exit:
53+
ret void
54+
}
55+
56+
define void @test_step3_div6(i64 %n) {
57+
; CHECK-LABEL: 'test_step3_div6'
58+
; CHECK-NEXT: Classifying expressions for: @test_step3_div6
59+
; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
60+
; CHECK-NEXT: --> {0,+,3}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
61+
; CHECK-NEXT: %div.0 = udiv i64 %iv, 6
62+
; CHECK-NEXT: --> ({0,+,3}<%loop> /u 6) U: [0,3074457345618258603) S: [0,3074457345618258603) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
63+
; CHECK-NEXT: %iv.1 = add i64 %iv, 1
64+
; CHECK-NEXT: --> {1,+,3}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
65+
; CHECK-NEXT: %div.1 = udiv i64 %iv.1, 6
66+
; CHECK-NEXT: --> ({1,+,3}<%loop> /u 6) U: [0,3074457345618258603) S: [0,3074457345618258603) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
67+
; CHECK-NEXT: %iv.2 = add i64 %iv, 2
68+
; CHECK-NEXT: --> {2,+,3}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
69+
; CHECK-NEXT: %div.2 = udiv i64 %iv.2, 6
70+
; CHECK-NEXT: --> ({2,+,3}<%loop> /u 6) U: [0,3074457345618258603) S: [0,3074457345618258603) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
71+
; CHECK-NEXT: %iv.neg.1 = add i64 %iv, -1
72+
; CHECK-NEXT: --> {-1,+,3}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
73+
; CHECK-NEXT: %div.neg.1 = udiv i64 %iv.neg.1, 6
74+
; CHECK-NEXT: --> ({-1,+,3}<%loop> /u 6) U: [0,3074457345618258603) S: [0,3074457345618258603) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
75+
; CHECK-NEXT: %iv.next = add i64 %iv, 3
76+
; CHECK-NEXT: --> {3,+,3}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
77+
; CHECK-NEXT: Determining loop execution counts for: @test_step3_div6
78+
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
79+
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
80+
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
81+
;
82+
entry:
83+
br label %loop
84+
85+
loop:
86+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
87+
%div.0 = udiv i64 %iv, 6
88+
call void @use(i64 %div.0)
89+
%iv.1 = add i64 %iv, 1
90+
%div.1 = udiv i64 %iv.1, 6
91+
call void @use(i64 %div.1)
92+
%iv.2 = add i64 %iv, 2
93+
%div.2 = udiv i64 %iv.2, 6
94+
call void @use(i64 %div.2)
95+
%iv.neg.1 = add i64 %iv, -1
96+
%div.neg.1 = udiv i64 %iv.neg.1, 6
97+
call void @use(i64 %div.neg.1)
98+
%iv.next = add i64 %iv, 3
99+
%cond = icmp slt i64 %iv, %n
100+
br i1 %cond, label %loop, label %exit
101+
102+
exit:
103+
ret void
104+
}
105+
106+
107+
define void @test_step4_div4(i64 %n) {
108+
; CHECK-LABEL: 'test_step4_div4'
109+
; CHECK-NEXT: Classifying expressions for: @test_step4_div4
110+
; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
111+
; CHECK-NEXT: --> {0,+,4}<%loop> U: [0,-3) S: [-9223372036854775808,9223372036854775805) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
112+
; CHECK-NEXT: %div.0 = udiv i64 %iv, 4
113+
; CHECK-NEXT: --> ({0,+,4}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
114+
; CHECK-NEXT: %iv.1 = add i64 %iv, 1
115+
; CHECK-NEXT: --> {1,+,4}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
116+
; CHECK-NEXT: %div.1 = udiv i64 %iv.1, 4
117+
; CHECK-NEXT: --> ({1,+,4}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
118+
; CHECK-NEXT: %iv.2 = add i64 %iv, 2
119+
; CHECK-NEXT: --> {2,+,4}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
120+
; CHECK-NEXT: %div.2 = udiv i64 %iv.2, 4
121+
; CHECK-NEXT: --> ({2,+,4}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
122+
; CHECK-NEXT: %iv.3 = add i64 %iv, 3
123+
; CHECK-NEXT: --> {3,+,4}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
124+
; CHECK-NEXT: %div.3 = udiv i64 %iv.3, 4
125+
; CHECK-NEXT: --> ({3,+,4}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
126+
; CHECK-NEXT: %iv.4 = add i64 %iv, 4
127+
; CHECK-NEXT: --> {4,+,4}<%loop> U: [0,-3) S: [-9223372036854775808,9223372036854775805) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
128+
; CHECK-NEXT: %div.4 = udiv i64 %iv.4, 4
129+
; CHECK-NEXT: --> ({4,+,4}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
130+
; CHECK-NEXT: %iv.5 = add i64 %iv, 5
131+
; CHECK-NEXT: --> {5,+,4}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
132+
; CHECK-NEXT: %div.5 = udiv i64 %iv.5, 4
133+
; CHECK-NEXT: --> ({5,+,4}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
134+
; CHECK-NEXT: %iv.next = add i64 %iv, 4
135+
; CHECK-NEXT: --> {4,+,4}<%loop> U: [0,-3) S: [-9223372036854775808,9223372036854775805) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
136+
; CHECK-NEXT: Determining loop execution counts for: @test_step4_div4
137+
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
138+
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
139+
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
140+
;
141+
entry:
142+
br label %loop
143+
144+
loop:
145+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
146+
%div.0 = udiv i64 %iv, 4
147+
call void @use(i64 %div.0)
148+
%iv.1 = add i64 %iv, 1
149+
%div.1 = udiv i64 %iv.1, 4
150+
call void @use(i64 %div.1)
151+
%iv.2 = add i64 %iv, 2
152+
%div.2 = udiv i64 %iv.2, 4
153+
call void @use(i64 %div.2)
154+
%iv.3 = add i64 %iv, 3
155+
%div.3 = udiv i64 %iv.3, 4
156+
call void @use(i64 %div.3)
157+
%iv.4 = add i64 %iv, 4
158+
%div.4 = udiv i64 %iv.4, 4
159+
call void @use(i64 %div.4)
160+
%iv.5 = add i64 %iv, 5
161+
%div.5 = udiv i64 %iv.5, 4
162+
call void @use(i64 %div.5)
163+
%iv.next = add i64 %iv, 4
164+
%cond = icmp slt i64 %iv, %n
165+
br i1 %cond, label %loop, label %exit
166+
167+
exit:
168+
ret void
169+
}

0 commit comments

Comments
 (0)