@@ -137,6 +137,92 @@ define <2 x i1> @ctlz_ne_bitwidth_v2i32(<2 x i32> %a) {
137
137
ret <2 x i1 > %cmp
138
138
}
139
139
140
+ define i1 @ctlz_ugt_zero_i32 (i32 %x ) {
141
+ ; CHECK-LABEL: @ctlz_ugt_zero_i32(
142
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[X:%.*]], -1
143
+ ; CHECK-NEXT: ret i1 [[CMP]]
144
+ ;
145
+ %lz = tail call i32 @llvm.ctlz.i32 (i32 %x , i1 false )
146
+ %cmp = icmp ugt i32 %lz , 0
147
+ ret i1 %cmp
148
+ }
149
+
150
+ define i1 @ctlz_ugt_one_i32 (i32 %x ) {
151
+ ; CHECK-LABEL: @ctlz_ugt_one_i32(
152
+ ; CHECK-NEXT: [[LZ:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false), !range !0
153
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[LZ]], 1
154
+ ; CHECK-NEXT: ret i1 [[CMP]]
155
+ ;
156
+ %lz = tail call i32 @llvm.ctlz.i32 (i32 %x , i1 false )
157
+ %cmp = icmp ugt i32 %lz , 1
158
+ ret i1 %cmp
159
+ }
160
+
161
+ define i1 @ctlz_ugt_other_i32 (i32 %x ) {
162
+ ; CHECK-LABEL: @ctlz_ugt_other_i32(
163
+ ; CHECK-NEXT: [[LZ:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false), !range !0
164
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[LZ]], 16
165
+ ; CHECK-NEXT: ret i1 [[CMP]]
166
+ ;
167
+ %lz = tail call i32 @llvm.ctlz.i32 (i32 %x , i1 false )
168
+ %cmp = icmp ugt i32 %lz , 16
169
+ ret i1 %cmp
170
+ }
171
+
172
+ define i1 @ctlz_ugt_bw_minus_one_i32 (i32 %x ) {
173
+ ; CHECK-LABEL: @ctlz_ugt_bw_minus_one_i32(
174
+ ; CHECK-NEXT: [[LZ:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false), !range !0
175
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[LZ]], 31
176
+ ; CHECK-NEXT: ret i1 [[CMP]]
177
+ ;
178
+ %lz = tail call i32 @llvm.ctlz.i32 (i32 %x , i1 false )
179
+ %cmp = icmp ugt i32 %lz , 31
180
+ ret i1 %cmp
181
+ }
182
+
183
+ define i1 @ctlz_ult_one_i32 (i32 %x ) {
184
+ ; CHECK-LABEL: @ctlz_ult_one_i32(
185
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[X:%.*]], 0
186
+ ; CHECK-NEXT: ret i1 [[CMP]]
187
+ ;
188
+ %lz = tail call i32 @llvm.ctlz.i32 (i32 %x , i1 false )
189
+ %cmp = icmp ult i32 %lz , 1
190
+ ret i1 %cmp
191
+ }
192
+
193
+ define i1 @ctlz_ult_other_i32 (i32 %x ) {
194
+ ; CHECK-LABEL: @ctlz_ult_other_i32(
195
+ ; CHECK-NEXT: [[LZ:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false), !range !0
196
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[LZ]], 16
197
+ ; CHECK-NEXT: ret i1 [[CMP]]
198
+ ;
199
+ %lz = tail call i32 @llvm.ctlz.i32 (i32 %x , i1 false )
200
+ %cmp = icmp ult i32 %lz , 16
201
+ ret i1 %cmp
202
+ }
203
+
204
+ define i1 @ctlz_ult_bw_minus_one_i32 (i32 %x ) {
205
+ ; CHECK-LABEL: @ctlz_ult_bw_minus_one_i32(
206
+ ; CHECK-NEXT: [[LZ:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false), !range !0
207
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[LZ]], 31
208
+ ; CHECK-NEXT: ret i1 [[CMP]]
209
+ ;
210
+ %lz = tail call i32 @llvm.ctlz.i32 (i32 %x , i1 false )
211
+ %cmp = icmp ult i32 %lz , 31
212
+ ret i1 %cmp
213
+ }
214
+
215
+ define i1 @ctlz_ult_bitwidth_i32 (i32 %x ) {
216
+ ; CHECK-LABEL: @ctlz_ult_bitwidth_i32(
217
+ ; CHECK-NEXT: [[LZ:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false), !range !0
218
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[LZ]], 32
219
+ ; CHECK-NEXT: ret i1 [[CMP]]
220
+ ;
221
+ %lz = tail call i32 @llvm.ctlz.i32 (i32 %x , i1 false )
222
+ %cmp = icmp ult i32 %lz , 32
223
+ ret i1 %cmp
224
+ }
225
+
140
226
define i1 @cttz_ne_bitwidth_i33 (i33 %x ) {
141
227
; CHECK-LABEL: @cttz_ne_bitwidth_i33(
142
228
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i33 [[X:%.*]], 0
@@ -234,6 +320,94 @@ define i1 @cttz_eq_other_i33_multiuse(i33 %x, i33* %p) {
234
320
ret i1 %cmp
235
321
}
236
322
323
+ define i1 @cttz_ugt_zero_i33 (i33 %x ) {
324
+ ; CHECK-LABEL: @cttz_ugt_zero_i33(
325
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i33 [[X:%.*]], 1
326
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i33 [[TMP1]], 0
327
+ ; CHECK-NEXT: ret i1 [[CMP]]
328
+ ;
329
+ %lz = tail call i33 @llvm.cttz.i33 (i33 %x , i1 false )
330
+ %cmp = icmp ugt i33 %lz , 0
331
+ ret i1 %cmp
332
+ }
333
+
334
+ define i1 @cttz_ugt_one_i33 (i33 %x ) {
335
+ ; CHECK-LABEL: @cttz_ugt_one_i33(
336
+ ; CHECK-NEXT: [[LZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1
337
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i33 [[LZ]], 1
338
+ ; CHECK-NEXT: ret i1 [[CMP]]
339
+ ;
340
+ %lz = tail call i33 @llvm.cttz.i33 (i33 %x , i1 false )
341
+ %cmp = icmp ugt i33 %lz , 1
342
+ ret i1 %cmp
343
+ }
344
+
345
+ define i1 @cttz_ugt_other_i33 (i33 %x ) {
346
+ ; CHECK-LABEL: @cttz_ugt_other_i33(
347
+ ; CHECK-NEXT: [[LZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1
348
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i33 [[LZ]], 16
349
+ ; CHECK-NEXT: ret i1 [[CMP]]
350
+ ;
351
+ %lz = tail call i33 @llvm.cttz.i33 (i33 %x , i1 false )
352
+ %cmp = icmp ugt i33 %lz , 16
353
+ ret i1 %cmp
354
+ }
355
+
356
+ define i1 @cttz_ugt_bw_minus_one_i33 (i33 %x ) {
357
+ ; CHECK-LABEL: @cttz_ugt_bw_minus_one_i33(
358
+ ; CHECK-NEXT: [[LZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1
359
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i33 [[LZ]], 32
360
+ ; CHECK-NEXT: ret i1 [[CMP]]
361
+ ;
362
+ %lz = tail call i33 @llvm.cttz.i33 (i33 %x , i1 false )
363
+ %cmp = icmp ugt i33 %lz , 32
364
+ ret i1 %cmp
365
+ }
366
+
367
+ define i1 @cttz_ult_one_i33 (i33 %x ) {
368
+ ; CHECK-LABEL: @cttz_ult_one_i33(
369
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i33 [[X:%.*]], 1
370
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i33 [[TMP1]], 0
371
+ ; CHECK-NEXT: ret i1 [[CMP]]
372
+ ;
373
+ %lz = tail call i33 @llvm.cttz.i33 (i33 %x , i1 false )
374
+ %cmp = icmp ult i33 %lz , 1
375
+ ret i1 %cmp
376
+ }
377
+
378
+ define i1 @cttz_ult_other_i33 (i33 %x ) {
379
+ ; CHECK-LABEL: @cttz_ult_other_i33(
380
+ ; CHECK-NEXT: [[LZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1
381
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i33 [[LZ]], 16
382
+ ; CHECK-NEXT: ret i1 [[CMP]]
383
+ ;
384
+ %lz = tail call i33 @llvm.cttz.i33 (i33 %x , i1 false )
385
+ %cmp = icmp ult i33 %lz , 16
386
+ ret i1 %cmp
387
+ }
388
+
389
+ define i1 @cttz_ult_bw_minus_one_i33 (i33 %x ) {
390
+ ; CHECK-LABEL: @cttz_ult_bw_minus_one_i33(
391
+ ; CHECK-NEXT: [[LZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1
392
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i33 [[LZ]], 32
393
+ ; CHECK-NEXT: ret i1 [[CMP]]
394
+ ;
395
+ %lz = tail call i33 @llvm.cttz.i33 (i33 %x , i1 false )
396
+ %cmp = icmp ult i33 %lz , 32
397
+ ret i1 %cmp
398
+ }
399
+
400
+ define i1 @cttz_ult_bitwidth_i33 (i33 %x ) {
401
+ ; CHECK-LABEL: @cttz_ult_bitwidth_i33(
402
+ ; CHECK-NEXT: [[LZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1
403
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i33 [[LZ]], 33
404
+ ; CHECK-NEXT: ret i1 [[CMP]]
405
+ ;
406
+ %lz = tail call i33 @llvm.cttz.i33 (i33 %x , i1 false )
407
+ %cmp = icmp ult i33 %lz , 33
408
+ ret i1 %cmp
409
+ }
410
+
237
411
define i1 @ctpop_eq_zero_i11 (i11 %x ) {
238
412
; CHECK-LABEL: @ctpop_eq_zero_i11(
239
413
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i11 [[X:%.*]], 0
0 commit comments