2
2
; RUN: opt < %s -disable-output -passes="print<scalar-evolution>" \
3
3
; RUN: -scalar-evolution-classify-expressions=0 2>&1 | FileCheck %s
4
4
5
- declare void @llvm.experimental.guard (i1 , ...)
6
-
7
- define void @test_1 (i32 %n ) nounwind {
8
- ; Prove that (n > 1) ===> (n / 2 > 0).
9
- ; CHECK-LABEL: 'test_1'
10
- ; CHECK-NEXT: Determining loop execution counts for: @test_1
5
+ define void @implied1 (i32 %n ) {
6
+ ; Prove that (n s> 1) ===> (n / 2 s> 0).
7
+ ; CHECK-LABEL: 'implied1'
8
+ ; CHECK-NEXT: Determining loop execution counts for: @implied1
11
9
; CHECK-NEXT: Loop %header: backedge-taken count is (-1 + %n.div.2)<nsw>
12
10
; CHECK-NEXT: Loop %header: constant max backedge-taken count is i32 1073741822
13
11
; CHECK-NEXT: Loop %header: symbolic max backedge-taken count is (-1 + %n.div.2)<nsw>
@@ -29,10 +27,35 @@ exit:
29
27
ret void
30
28
}
31
29
32
- define void @test_1neg (i32 %n ) nounwind {
33
- ; Prove that (n > 0) =\=> (n / 2 > 0).
34
- ; CHECK-LABEL: 'test_1neg'
35
- ; CHECK-NEXT: Determining loop execution counts for: @test_1neg
30
+ define void @implied1_samesign (i32 %n ) {
31
+ ; Prove that (n > 1) ===> (n / 2 s> 0).
32
+ ; CHECK-LABEL: 'implied1_samesign'
33
+ ; CHECK-NEXT: Determining loop execution counts for: @implied1_samesign
34
+ ; CHECK-NEXT: Loop %header: backedge-taken count is (-1 + %n.div.2)<nsw>
35
+ ; CHECK-NEXT: Loop %header: constant max backedge-taken count is i32 1073741822
36
+ ; CHECK-NEXT: Loop %header: symbolic max backedge-taken count is (-1 + %n.div.2)<nsw>
37
+ ; CHECK-NEXT: Loop %header: Trip multiple is 1
38
+ ;
39
+ entry:
40
+ %cmp1 = icmp samesign ugt i32 %n , 1
41
+ %n.div.2 = sdiv i32 %n , 2
42
+ call void @llvm.assume (i1 %cmp1 )
43
+ br label %header
44
+
45
+ header:
46
+ %indvar = phi i32 [ %indvar.next , %header ], [ 0 , %entry ]
47
+ %indvar.next = add i32 %indvar , 1
48
+ %exitcond = icmp sgt i32 %n.div.2 , %indvar.next
49
+ br i1 %exitcond , label %header , label %exit
50
+
51
+ exit:
52
+ ret void
53
+ }
54
+
55
+ define void @implied1_neg (i32 %n ) {
56
+ ; Prove that (n s> 0) =\=> (n / 2 s> 0).
57
+ ; CHECK-LABEL: 'implied1_neg'
58
+ ; CHECK-NEXT: Determining loop execution counts for: @implied1_neg
36
59
; CHECK-NEXT: Loop %header: backedge-taken count is (-1 + (1 smax %n.div.2))<nsw>
37
60
; CHECK-NEXT: Loop %header: constant max backedge-taken count is i32 1073741822
38
61
; CHECK-NEXT: Loop %header: symbolic max backedge-taken count is (-1 + (1 smax %n.div.2))<nsw>
@@ -54,10 +77,10 @@ exit:
54
77
ret void
55
78
}
56
79
57
- define void @test_2 (i32 %n ) nounwind {
58
- ; Prove that (n >= 2) ===> (n / 2 > 0).
59
- ; CHECK-LABEL: 'test_2 '
60
- ; CHECK-NEXT: Determining loop execution counts for: @test_2
80
+ define void @implied2 (i32 %n ) {
81
+ ; Prove that (n s >= 2) ===> (n / 2 s > 0).
82
+ ; CHECK-LABEL: 'implied2 '
83
+ ; CHECK-NEXT: Determining loop execution counts for: @implied2
61
84
; CHECK-NEXT: Loop %header: backedge-taken count is (-1 + %n.div.2)<nsw>
62
85
; CHECK-NEXT: Loop %header: constant max backedge-taken count is i32 1073741822
63
86
; CHECK-NEXT: Loop %header: symbolic max backedge-taken count is (-1 + %n.div.2)<nsw>
@@ -79,10 +102,35 @@ exit:
79
102
ret void
80
103
}
81
104
82
- define void @test_2neg (i32 %n ) nounwind {
83
- ; Prove that (n >= 1) =\=> (n / 2 > 0).
84
- ; CHECK-LABEL: 'test_2neg'
85
- ; CHECK-NEXT: Determining loop execution counts for: @test_2neg
105
+ define void @implied2_samesign (i32 %n ) {
106
+ ; Prove that (n >= 2) ===> (n / 2 s> 0).
107
+ ; CHECK-LABEL: 'implied2_samesign'
108
+ ; CHECK-NEXT: Determining loop execution counts for: @implied2_samesign
109
+ ; CHECK-NEXT: Loop %header: backedge-taken count is (-1 + (1 smax %n.div.2))<nsw>
110
+ ; CHECK-NEXT: Loop %header: constant max backedge-taken count is i32 1073741822
111
+ ; CHECK-NEXT: Loop %header: symbolic max backedge-taken count is (-1 + (1 smax %n.div.2))<nsw>
112
+ ; CHECK-NEXT: Loop %header: Trip multiple is 1
113
+ ;
114
+ entry:
115
+ %cmp1 = icmp samesign uge i32 %n , 2
116
+ %n.div.2 = sdiv i32 %n , 2
117
+ call void @llvm.assume (i1 %cmp1 )
118
+ br label %header
119
+
120
+ header:
121
+ %indvar = phi i32 [ %indvar.next , %header ], [ 0 , %entry ]
122
+ %indvar.next = add i32 %indvar , 1
123
+ %exitcond = icmp sgt i32 %n.div.2 , %indvar.next
124
+ br i1 %exitcond , label %header , label %exit
125
+
126
+ exit:
127
+ ret void
128
+ }
129
+
130
+ define void @implied2_neg (i32 %n ) {
131
+ ; Prove that (n s>= 1) =\=> (n / 2 s> 0).
132
+ ; CHECK-LABEL: 'implied2_neg'
133
+ ; CHECK-NEXT: Determining loop execution counts for: @implied2_neg
86
134
; CHECK-NEXT: Loop %header: backedge-taken count is (-1 + (1 smax %n.div.2))<nsw>
87
135
; CHECK-NEXT: Loop %header: constant max backedge-taken count is i32 1073741822
88
136
; CHECK-NEXT: Loop %header: symbolic max backedge-taken count is (-1 + (1 smax %n.div.2))<nsw>
@@ -104,10 +152,10 @@ exit:
104
152
ret void
105
153
}
106
154
107
- define void @test_3 (i32 %n ) nounwind {
108
- ; Prove that (n > -2) ===> (n / 2 >= 0).
109
- ; CHECK-LABEL: 'test_3 '
110
- ; CHECK-NEXT: Determining loop execution counts for: @test_3
155
+ define void @implied3 (i32 %n ) {
156
+ ; Prove that (n s > -2) ===> (n / 2 s >= 0).
157
+ ; CHECK-LABEL: 'implied3 '
158
+ ; CHECK-NEXT: Determining loop execution counts for: @implied3
111
159
; CHECK-NEXT: Loop %header: backedge-taken count is (1 + %n.div.2)<nsw>
112
160
; CHECK-NEXT: Loop %header: constant max backedge-taken count is i32 1073741824
113
161
; CHECK-NEXT: Loop %header: symbolic max backedge-taken count is (1 + %n.div.2)<nsw>
@@ -129,10 +177,35 @@ exit:
129
177
ret void
130
178
}
131
179
132
- define void @test_3neg (i32 %n ) nounwind {
180
+ define void @implied3_samesign (i32 %n ) {
181
+ ; Prove that (n > -2) ===> (n / 2 s>= 0).
182
+ ; CHECK-LABEL: 'implied3_samesign'
183
+ ; CHECK-NEXT: Determining loop execution counts for: @implied3_samesign
184
+ ; CHECK-NEXT: Loop %header: backedge-taken count is (1 + %n.div.2)<nsw>
185
+ ; CHECK-NEXT: Loop %header: constant max backedge-taken count is i32 1
186
+ ; CHECK-NEXT: Loop %header: symbolic max backedge-taken count is (1 + %n.div.2)<nsw>
187
+ ; CHECK-NEXT: Loop %header: Trip multiple is 1
188
+ ;
189
+ entry:
190
+ %cmp1 = icmp samesign ugt i32 %n , -2
191
+ %n.div.2 = sdiv i32 %n , 2
192
+ call void @llvm.assume (i1 %cmp1 )
193
+ br label %header
194
+
195
+ header:
196
+ %indvar = phi i32 [ %indvar.next , %header ], [ 0 , %entry ]
197
+ %indvar.next = add i32 %indvar , 1
198
+ %exitcond = icmp sge i32 %n.div.2 , %indvar
199
+ br i1 %exitcond , label %header , label %exit
200
+
201
+ exit:
202
+ ret void
203
+ }
204
+
205
+ define void @implied3_neg (i32 %n ) {
133
206
; Prove that (n > -3) =\=> (n / 2 >= 0).
134
- ; CHECK-LABEL: 'test_3neg '
135
- ; CHECK-NEXT: Determining loop execution counts for: @test_3neg
207
+ ; CHECK-LABEL: 'implied3_neg '
208
+ ; CHECK-NEXT: Determining loop execution counts for: @implied3_neg
136
209
; CHECK-NEXT: Loop %header: backedge-taken count is (0 smax (1 + %n.div.2)<nsw>)
137
210
; CHECK-NEXT: Loop %header: constant max backedge-taken count is i32 1073741824
138
211
; CHECK-NEXT: Loop %header: symbolic max backedge-taken count is (0 smax (1 + %n.div.2)<nsw>)
@@ -154,10 +227,10 @@ exit:
154
227
ret void
155
228
}
156
229
157
- define void @test_4 (i32 %n ) nounwind {
158
- ; Prove that (n >= -1) ===> (n / 2 >= 0).
159
- ; CHECK-LABEL: 'test_4 '
160
- ; CHECK-NEXT: Determining loop execution counts for: @test_4
230
+ define void @implied4 (i32 %n ) {
231
+ ; Prove that (n s >= -1) ===> (n / 2 s >= 0).
232
+ ; CHECK-LABEL: 'implied4 '
233
+ ; CHECK-NEXT: Determining loop execution counts for: @implied4
161
234
; CHECK-NEXT: Loop %header: backedge-taken count is (1 + %n.div.2)<nsw>
162
235
; CHECK-NEXT: Loop %header: constant max backedge-taken count is i32 1073741824
163
236
; CHECK-NEXT: Loop %header: symbolic max backedge-taken count is (1 + %n.div.2)<nsw>
@@ -179,10 +252,35 @@ exit:
179
252
ret void
180
253
}
181
254
182
- define void @test_4neg (i32 %n ) nounwind {
183
- ; Prove that (n >= -2) =\=> (n / 2 >= 0).
184
- ; CHECK-LABEL: 'test_4neg'
185
- ; CHECK-NEXT: Determining loop execution counts for: @test_4neg
255
+ define void @implied4_samesign (i32 %n ) {
256
+ ; Prove that (n >= -1) ===> (n / 2 s>= 0).
257
+ ; CHECK-LABEL: 'implied4_samesign'
258
+ ; CHECK-NEXT: Determining loop execution counts for: @implied4_samesign
259
+ ; CHECK-NEXT: Loop %header: backedge-taken count is (1 + %n.div.2)<nsw>
260
+ ; CHECK-NEXT: Loop %header: constant max backedge-taken count is i32 1
261
+ ; CHECK-NEXT: Loop %header: symbolic max backedge-taken count is (1 + %n.div.2)<nsw>
262
+ ; CHECK-NEXT: Loop %header: Trip multiple is 1
263
+ ;
264
+ entry:
265
+ %cmp1 = icmp samesign uge i32 %n , -1
266
+ %n.div.2 = sdiv i32 %n , 2
267
+ call void @llvm.assume (i1 %cmp1 )
268
+ br label %header
269
+
270
+ header:
271
+ %indvar = phi i32 [ %indvar.next , %header ], [ 0 , %entry ]
272
+ %indvar.next = add i32 %indvar , 1
273
+ %exitcond = icmp sge i32 %n.div.2 , %indvar
274
+ br i1 %exitcond , label %header , label %exit
275
+
276
+ exit:
277
+ ret void
278
+ }
279
+
280
+ define void @implied4_neg (i32 %n ) {
281
+ ; Prove that (n s>= -2) =\=> (n / 2 s>= 0).
282
+ ; CHECK-LABEL: 'implied4_neg'
283
+ ; CHECK-NEXT: Determining loop execution counts for: @implied4_neg
186
284
; CHECK-NEXT: Loop %header: backedge-taken count is (0 smax (1 + %n.div.2)<nsw>)
187
285
; CHECK-NEXT: Loop %header: constant max backedge-taken count is i32 1073741824
188
286
; CHECK-NEXT: Loop %header: symbolic max backedge-taken count is (0 smax (1 + %n.div.2)<nsw>)
0 commit comments