@@ -169,6 +169,19 @@ define i1 @ctlz_ugt_other_i32(i32 %x) {
169
169
ret i1 %cmp
170
170
}
171
171
172
+ define i1 @ctlz_ugt_other_multiuse_i32 (i32 %x , i32* %p ) {
173
+ ; CHECK-LABEL: @ctlz_ugt_other_multiuse_i32(
174
+ ; CHECK-NEXT: [[LZ:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false), !range !0
175
+ ; CHECK-NEXT: store i32 [[LZ]], i32* [[P:%.*]], align 4
176
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[LZ]], 16
177
+ ; CHECK-NEXT: ret i1 [[CMP]]
178
+ ;
179
+ %lz = tail call i32 @llvm.ctlz.i32 (i32 %x , i1 false )
180
+ store i32 %lz , i32* %p
181
+ %cmp = icmp ugt i32 %lz , 16
182
+ ret i1 %cmp
183
+ }
184
+
172
185
define i1 @ctlz_ugt_bw_minus_one_i32 (i32 %x ) {
173
186
; CHECK-LABEL: @ctlz_ugt_bw_minus_one_i32(
174
187
; CHECK-NEXT: [[LZ:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false), !range !0
@@ -180,47 +193,60 @@ define i1 @ctlz_ugt_bw_minus_one_i32(i32 %x) {
180
193
ret i1 %cmp
181
194
}
182
195
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]]
196
+ define < 2 x i1 > @ctlz_ult_one_v2i32 (< 2 x i32 > %x ) {
197
+ ; CHECK-LABEL: @ctlz_ult_one_v2i32 (
198
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i32> [[X:%.*]], zeroinitializer
199
+ ; CHECK-NEXT: ret <2 x i1> [[CMP]]
187
200
;
188
- %lz = tail call i32 @llvm.ctlz.i32 ( i32 %x , i1 false )
189
- %cmp = icmp ult i32 %lz , 1
190
- ret i1 %cmp
201
+ %lz = tail call < 2 x i32 > @llvm.ctlz.v2i32 (< 2 x i32 > %x , i1 false )
202
+ %cmp = icmp ult < 2 x i32 > %lz , < i32 1 , i32 1 >
203
+ ret < 2 x i1 > %cmp
191
204
}
192
205
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]]
206
+ define < 2 x i1 > @ctlz_ult_other_v2i32 (< 2 x i32 > %x ) {
207
+ ; CHECK-LABEL: @ctlz_ult_other_v2i32 (
208
+ ; CHECK-NEXT: [[LZ:%.*]] = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[X:%.*]], i1 false)
209
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i32> [[LZ]], <i32 16, i32 16>
210
+ ; CHECK-NEXT: ret <2 x i1> [[CMP]]
198
211
;
199
- %lz = tail call i32 @llvm.ctlz.i32 ( i32 %x , i1 false )
200
- %cmp = icmp ult i32 %lz , 16
201
- ret i1 %cmp
212
+ %lz = tail call < 2 x i32 > @llvm.ctlz.v2i32 (< 2 x i32 > %x , i1 false )
213
+ %cmp = icmp ult < 2 x i32 > %lz , < i32 16 , i32 16 >
214
+ ret < 2 x i1 > %cmp
202
215
}
203
216
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]]
217
+ define <2 x i1 > @ctlz_ult_other_multiuse_v2i32 (<2 x i32 > %x , <2 x i32 >* %p ) {
218
+ ; CHECK-LABEL: @ctlz_ult_other_multiuse_v2i32(
219
+ ; CHECK-NEXT: [[LZ:%.*]] = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[X:%.*]], i1 false)
220
+ ; CHECK-NEXT: store <2 x i32> [[LZ]], <2 x i32>* [[P:%.*]], align 8
221
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i32> [[LZ]], <i32 16, i32 16>
222
+ ; CHECK-NEXT: ret <2 x i1> [[CMP]]
209
223
;
210
- %lz = tail call i32 @llvm.ctlz.i32 (i32 %x , i1 false )
211
- %cmp = icmp ult i32 %lz , 31
212
- ret i1 %cmp
224
+ %lz = tail call <2 x i32 > @llvm.ctlz.v2i32 (<2 x i32 > %x , i1 false )
225
+ store <2 x i32 > %lz , <2 x i32 >* %p
226
+ %cmp = icmp ult <2 x i32 > %lz , <i32 16 , i32 16 >
227
+ ret <2 x i1 > %cmp
213
228
}
214
229
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]]
230
+ define < 2 x i1 > @ctlz_ult_bw_minus_one_v2i32 (< 2 x i32 > %x ) {
231
+ ; CHECK-LABEL: @ctlz_ult_bw_minus_one_v2i32 (
232
+ ; CHECK-NEXT: [[LZ:%.*]] = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[X:%.*]], i1 false)
233
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i32> [[LZ]], <i32 31, i32 31>
234
+ ; CHECK-NEXT: ret <2 x i1> [[CMP]]
220
235
;
221
- %lz = tail call i32 @llvm.ctlz.i32 (i32 %x , i1 false )
222
- %cmp = icmp ult i32 %lz , 32
223
- ret i1 %cmp
236
+ %lz = tail call <2 x i32 > @llvm.ctlz.v2i32 (<2 x i32 > %x , i1 false )
237
+ %cmp = icmp ult <2 x i32 > %lz , <i32 31 , i32 31 >
238
+ ret <2 x i1 > %cmp
239
+ }
240
+
241
+ define <2 x i1 > @ctlz_ult_bitwidth_v2i32 (<2 x i32 > %x ) {
242
+ ; CHECK-LABEL: @ctlz_ult_bitwidth_v2i32(
243
+ ; CHECK-NEXT: [[LZ:%.*]] = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[X:%.*]], i1 false)
244
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i32> [[LZ]], <i32 32, i32 32>
245
+ ; CHECK-NEXT: ret <2 x i1> [[CMP]]
246
+ ;
247
+ %lz = tail call <2 x i32 > @llvm.ctlz.v2i32 (<2 x i32 > %x , i1 false )
248
+ %cmp = icmp ult <2 x i32 > %lz , <i32 32 , i32 32 >
249
+ ret <2 x i1 > %cmp
224
250
}
225
251
226
252
define i1 @cttz_ne_bitwidth_i33 (i33 %x ) {
@@ -309,14 +335,14 @@ define <2 x i1> @cttz_ne_other_v2i32(<2 x i32> %a) {
309
335
310
336
define i1 @cttz_eq_other_i33_multiuse (i33 %x , i33* %p ) {
311
337
; CHECK-LABEL: @cttz_eq_other_i33_multiuse(
312
- ; CHECK-NEXT: [[LZ :%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1
313
- ; CHECK-NEXT: store i33 [[LZ ]], i33* [[P:%.*]], align 4
314
- ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i33 [[LZ ]], 4
338
+ ; CHECK-NEXT: [[TZ :%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1
339
+ ; CHECK-NEXT: store i33 [[TZ ]], i33* [[P:%.*]], align 4
340
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i33 [[TZ ]], 4
315
341
; CHECK-NEXT: ret i1 [[CMP]]
316
342
;
317
- %lz = tail call i33 @llvm.cttz.i33 (i33 %x , i1 false )
318
- store i33 %lz , i33* %p
319
- %cmp = icmp eq i33 %lz , 4
343
+ %tz = tail call i33 @llvm.cttz.i33 (i33 %x , i1 false )
344
+ store i33 %tz , i33* %p
345
+ %cmp = icmp eq i33 %tz , 4
320
346
ret i1 %cmp
321
347
}
322
348
@@ -326,86 +352,111 @@ define i1 @cttz_ugt_zero_i33(i33 %x) {
326
352
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i33 [[TMP1]], 0
327
353
; CHECK-NEXT: ret i1 [[CMP]]
328
354
;
329
- %lz = tail call i33 @llvm.cttz.i33 (i33 %x , i1 false )
330
- %cmp = icmp ugt i33 %lz , 0
355
+ %tz = tail call i33 @llvm.cttz.i33 (i33 %x , i1 false )
356
+ %cmp = icmp ugt i33 %tz , 0
331
357
ret i1 %cmp
332
358
}
333
359
334
360
define i1 @cttz_ugt_one_i33 (i33 %x ) {
335
361
; 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
362
+ ; CHECK-NEXT: [[TZ :%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1
363
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i33 [[TZ ]], 1
338
364
; CHECK-NEXT: ret i1 [[CMP]]
339
365
;
340
- %lz = tail call i33 @llvm.cttz.i33 (i33 %x , i1 false )
341
- %cmp = icmp ugt i33 %lz , 1
366
+ %tz = tail call i33 @llvm.cttz.i33 (i33 %x , i1 false )
367
+ %cmp = icmp ugt i33 %tz , 1
342
368
ret i1 %cmp
343
369
}
344
370
345
371
define i1 @cttz_ugt_other_i33 (i33 %x ) {
346
372
; 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
373
+ ; CHECK-NEXT: [[TZ :%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1
374
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i33 [[TZ ]], 16
349
375
; CHECK-NEXT: ret i1 [[CMP]]
350
376
;
351
- %lz = tail call i33 @llvm.cttz.i33 (i33 %x , i1 false )
352
- %cmp = icmp ugt i33 %lz , 16
377
+ %tz = tail call i33 @llvm.cttz.i33 (i33 %x , i1 false )
378
+ %cmp = icmp ugt i33 %tz , 16
353
379
ret i1 %cmp
354
380
}
355
381
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
382
+ define i1 @cttz_ugt_other_multiuse_i33 (i33 %x , i33* %p ) {
383
+ ; CHECK-LABEL: @cttz_ugt_other_multiuse_i33(
384
+ ; CHECK-NEXT: [[TZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1
385
+ ; CHECK-NEXT: store i33 [[TZ]], i33* [[P:%.*]], align 4
386
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i33 [[TZ]], 16
360
387
; CHECK-NEXT: ret i1 [[CMP]]
361
388
;
362
- %lz = tail call i33 @llvm.cttz.i33 (i33 %x , i1 false )
363
- %cmp = icmp ugt i33 %lz , 32
389
+ %tz = tail call i33 @llvm.cttz.i33 (i33 %x , i1 false )
390
+ store i33 %tz , i33* %p
391
+ %cmp = icmp ugt i33 %tz , 16
364
392
ret i1 %cmp
365
393
}
366
394
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
395
+ define i1 @cttz_ugt_bw_minus_one_i33 (i33 %x ) {
396
+ ; CHECK-LABEL: @cttz_ugt_bw_minus_one_i33 (
397
+ ; CHECK-NEXT: [[TZ :%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range ! 1
398
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i33 [[TZ ]], 32
371
399
; CHECK-NEXT: ret i1 [[CMP]]
372
400
;
373
- %lz = tail call i33 @llvm.cttz.i33 (i33 %x , i1 false )
374
- %cmp = icmp ult i33 %lz , 1
401
+ %tz = tail call i33 @llvm.cttz.i33 (i33 %x , i1 false )
402
+ %cmp = icmp ugt i33 %tz , 32
375
403
ret i1 %cmp
376
404
}
377
405
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]]
406
+ define <2 x i1 > @cttz_ult_one_v2i32 (<2 x i32 > %x ) {
407
+ ; CHECK-LABEL: @cttz_ult_one_v2i32(
408
+ ; CHECK-NEXT: [[CMP:%.*]] = trunc <2 x i32> [[X:%.*]] to <2 x i1>
409
+ ; CHECK-NEXT: ret <2 x i1> [[CMP]]
383
410
;
384
- %lz = tail call i33 @llvm.cttz.i33 ( i33 %x , i1 false )
385
- %cmp = icmp ult i33 %lz , 16
386
- ret i1 %cmp
411
+ %tz = tail call < 2 x i32 > @llvm.cttz.v2i32 (< 2 x i32 > %x , i1 false )
412
+ %cmp = icmp ult < 2 x i32 > %tz , < i32 1 , i32 1 >
413
+ ret < 2 x i1 > %cmp
387
414
}
388
415
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]]
416
+ define < 2 x i1 > @cttz_ult_other_v2i32 (< 2 x i32 > %x ) {
417
+ ; CHECK-LABEL: @cttz_ult_other_v2i32 (
418
+ ; CHECK-NEXT: [[TZ :%.*]] = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[X:%.*]], i1 false)
419
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i32> [[TZ ]], <i32 16, i32 16>
420
+ ; CHECK-NEXT: ret <2 x i1> [[CMP]]
394
421
;
395
- %lz = tail call i33 @llvm.cttz.i33 ( i33 %x , i1 false )
396
- %cmp = icmp ult i33 %lz , 32
397
- ret i1 %cmp
422
+ %tz = tail call < 2 x i32 > @llvm.cttz.v2i32 (< 2 x i32 > %x , i1 false )
423
+ %cmp = icmp ult < 2 x i32 > %tz , < i32 16 , i32 16 >
424
+ ret < 2 x i1 > %cmp
398
425
}
399
426
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]]
427
+ define <2 x i1 > @cttz_ult_other_multiuse_v2i32 (<2 x i32 > %x , <2 x i32 >* %p ) {
428
+ ; CHECK-LABEL: @cttz_ult_other_multiuse_v2i32(
429
+ ; CHECK-NEXT: [[TZ:%.*]] = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[X:%.*]], i1 false)
430
+ ; CHECK-NEXT: store <2 x i32> [[TZ]], <2 x i32>* [[P:%.*]], align 8
431
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i32> [[TZ]], <i32 16, i32 16>
432
+ ; CHECK-NEXT: ret <2 x i1> [[CMP]]
405
433
;
406
- %lz = tail call i33 @llvm.cttz.i33 (i33 %x , i1 false )
407
- %cmp = icmp ult i33 %lz , 33
408
- ret i1 %cmp
434
+ %tz = tail call <2 x i32 > @llvm.cttz.v2i32 (<2 x i32 > %x , i1 false )
435
+ store <2 x i32 > %tz , <2 x i32 >* %p
436
+ %cmp = icmp ult <2 x i32 > %tz , <i32 16 , i32 16 >
437
+ ret <2 x i1 > %cmp
438
+ }
439
+
440
+ define <2 x i1 > @cttz_ult_bw_minus_one_v2i32 (<2 x i32 > %x ) {
441
+ ; CHECK-LABEL: @cttz_ult_bw_minus_one_v2i32(
442
+ ; CHECK-NEXT: [[TZ:%.*]] = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[X:%.*]], i1 false)
443
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i32> [[TZ]], <i32 31, i32 31>
444
+ ; CHECK-NEXT: ret <2 x i1> [[CMP]]
445
+ ;
446
+ %tz = tail call <2 x i32 > @llvm.cttz.v2i32 (<2 x i32 > %x , i1 false )
447
+ %cmp = icmp ult <2 x i32 > %tz , <i32 31 , i32 31 >
448
+ ret <2 x i1 > %cmp
449
+ }
450
+
451
+ define <2 x i1 > @cttz_ult_bitwidth_v2i32 (<2 x i32 > %x ) {
452
+ ; CHECK-LABEL: @cttz_ult_bitwidth_v2i32(
453
+ ; CHECK-NEXT: [[TZ:%.*]] = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[X:%.*]], i1 false)
454
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i32> [[TZ]], <i32 32, i32 32>
455
+ ; CHECK-NEXT: ret <2 x i1> [[CMP]]
456
+ ;
457
+ %tz = tail call <2 x i32 > @llvm.cttz.v2i32 (<2 x i32 > %x , i1 false )
458
+ %cmp = icmp ult <2 x i32 > %tz , <i32 32 , i32 32 >
459
+ ret <2 x i1 > %cmp
409
460
}
410
461
411
462
define i1 @ctpop_eq_zero_i11 (i11 %x ) {
0 commit comments