@@ -267,18 +267,33 @@ define i32 @smin_known_nonzero(i32 %xx, i32 %yy) {
267
267
ret i32 %r
268
268
}
269
269
270
+ define i32 @smin_known_zero_2 (i32 %x , i32 %y ) {
271
+ ; CHECK-LABEL: smin_known_zero_2:
272
+ ; CHECK: # %bb.0:
273
+ ; CHECK-NEXT: cmpl $-54, %edi
274
+ ; CHECK-NEXT: movl $-54, %eax
275
+ ; CHECK-NEXT: cmovll %edi, %eax
276
+ ; CHECK-NEXT: bsfl %eax, %ecx
277
+ ; CHECK-NEXT: movl $32, %eax
278
+ ; CHECK-NEXT: cmovnel %ecx, %eax
279
+ ; CHECK-NEXT: retq
280
+ %z = call i32 @llvm.smin.i32 (i32 %x , i32 -54 )
281
+ %r = call i32 @llvm.cttz.i32 (i32 %z , i1 false )
282
+ ret i32 %r
283
+ }
284
+
270
285
define i32 @smin_maybe_zero (i32 %x , i32 %y ) {
271
286
; CHECK-LABEL: smin_maybe_zero:
272
287
; CHECK: # %bb.0:
273
288
; CHECK-NEXT: cmpl $54, %edi
274
289
; CHECK-NEXT: movl $54, %eax
275
290
; CHECK-NEXT: cmovll %edi, %eax
276
291
; CHECK-NEXT: testl %eax, %eax
277
- ; CHECK-NEXT: je .LBB15_1
292
+ ; CHECK-NEXT: je .LBB16_1
278
293
; CHECK-NEXT: # %bb.2: # %cond.false
279
294
; CHECK-NEXT: rep bsfl %eax, %eax
280
295
; CHECK-NEXT: retq
281
- ; CHECK-NEXT: .LBB15_1 :
296
+ ; CHECK-NEXT: .LBB16_1 :
282
297
; CHECK-NEXT: movl $32, %eax
283
298
; CHECK-NEXT: retq
284
299
%z = call i32 @llvm.smin.i32 (i32 %x , i32 54 )
@@ -305,8 +320,8 @@ define i32 @smax_known_nonzero(i32 %xx, i32 %yy) {
305
320
ret i32 %r
306
321
}
307
322
308
- define i32 @smax_maybe_zero (i32 %x , i32 %y ) {
309
- ; CHECK-LABEL: smax_maybe_zero :
323
+ define i32 @smax_known_zero_2 (i32 %x , i32 %y ) {
324
+ ; CHECK-LABEL: smax_known_zero_2 :
310
325
; CHECK: # %bb.0:
311
326
; CHECK-NEXT: cmpl $55, %edi
312
327
; CHECK-NEXT: movl $54, %eax
@@ -320,6 +335,25 @@ define i32 @smax_maybe_zero(i32 %x, i32 %y) {
320
335
ret i32 %r
321
336
}
322
337
338
+ define i32 @smax_maybe_zero (i32 %x , i32 %y ) {
339
+ ; CHECK-LABEL: smax_maybe_zero:
340
+ ; CHECK: # %bb.0:
341
+ ; CHECK-NEXT: testl %edi, %edi
342
+ ; CHECK-NEXT: movl $-1, %eax
343
+ ; CHECK-NEXT: cmovnsl %edi, %eax
344
+ ; CHECK-NEXT: testl %eax, %eax
345
+ ; CHECK-NEXT: je .LBB19_1
346
+ ; CHECK-NEXT: # %bb.2: # %cond.false
347
+ ; CHECK-NEXT: rep bsfl %eax, %eax
348
+ ; CHECK-NEXT: retq
349
+ ; CHECK-NEXT: .LBB19_1:
350
+ ; CHECK-NEXT: movl $32, %eax
351
+ ; CHECK-NEXT: retq
352
+ %z = call i32 @llvm.smax.i32 (i32 %x , i32 -1 )
353
+ %r = call i32 @llvm.cttz.i32 (i32 %z , i1 false )
354
+ ret i32 %r
355
+ }
356
+
323
357
define i32 @rotr_known_nonzero (i32 %xx , i32 %y ) {
324
358
; CHECK-LABEL: rotr_known_nonzero:
325
359
; CHECK: # %bb.0:
@@ -328,11 +362,11 @@ define i32 @rotr_known_nonzero(i32 %xx, i32 %y) {
328
362
; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
329
363
; CHECK-NEXT: rorl %cl, %edi
330
364
; CHECK-NEXT: testl %edi, %edi
331
- ; CHECK-NEXT: je .LBB18_1
365
+ ; CHECK-NEXT: je .LBB20_1
332
366
; CHECK-NEXT: # %bb.2: # %cond.false
333
367
; CHECK-NEXT: rep bsfl %edi, %eax
334
368
; CHECK-NEXT: retq
335
- ; CHECK-NEXT: .LBB18_1 :
369
+ ; CHECK-NEXT: .LBB20_1 :
336
370
; CHECK-NEXT: movl $32, %eax
337
371
; CHECK-NEXT: retq
338
372
%x = or i32 %xx , 256
@@ -351,11 +385,11 @@ define i32 @rotr_maybe_zero(i32 %x, i32 %y) {
351
385
; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
352
386
; CHECK-NEXT: rorl %cl, %edi
353
387
; CHECK-NEXT: testl %edi, %edi
354
- ; CHECK-NEXT: je .LBB19_1
388
+ ; CHECK-NEXT: je .LBB21_1
355
389
; CHECK-NEXT: # %bb.2: # %cond.false
356
390
; CHECK-NEXT: rep bsfl %edi, %eax
357
391
; CHECK-NEXT: retq
358
- ; CHECK-NEXT: .LBB19_1 :
392
+ ; CHECK-NEXT: .LBB21_1 :
359
393
; CHECK-NEXT: movl $32, %eax
360
394
; CHECK-NEXT: retq
361
395
%shr = lshr i32 %x , %y
@@ -388,11 +422,11 @@ define i32 @rotr_with_fshr_maybe_zero(i32 %x, i32 %y) {
388
422
; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
389
423
; CHECK-NEXT: rorl %cl, %edi
390
424
; CHECK-NEXT: testl %edi, %edi
391
- ; CHECK-NEXT: je .LBB21_1
425
+ ; CHECK-NEXT: je .LBB23_1
392
426
; CHECK-NEXT: # %bb.2: # %cond.false
393
427
; CHECK-NEXT: rep bsfl %edi, %eax
394
428
; CHECK-NEXT: retq
395
- ; CHECK-NEXT: .LBB21_1 :
429
+ ; CHECK-NEXT: .LBB23_1 :
396
430
; CHECK-NEXT: movl $32, %eax
397
431
; CHECK-NEXT: retq
398
432
%z = call i32 @llvm.fshr.i32 (i32 %x , i32 %x , i32 %y )
@@ -408,11 +442,11 @@ define i32 @rotl_known_nonzero(i32 %xx, i32 %y) {
408
442
; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
409
443
; CHECK-NEXT: roll %cl, %edi
410
444
; CHECK-NEXT: testl %edi, %edi
411
- ; CHECK-NEXT: je .LBB22_1
445
+ ; CHECK-NEXT: je .LBB24_1
412
446
; CHECK-NEXT: # %bb.2: # %cond.false
413
447
; CHECK-NEXT: rep bsfl %edi, %eax
414
448
; CHECK-NEXT: retq
415
- ; CHECK-NEXT: .LBB22_1 :
449
+ ; CHECK-NEXT: .LBB24_1 :
416
450
; CHECK-NEXT: movl $32, %eax
417
451
; CHECK-NEXT: retq
418
452
%x = or i32 %xx , 256
@@ -431,11 +465,11 @@ define i32 @rotl_maybe_zero(i32 %x, i32 %y) {
431
465
; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
432
466
; CHECK-NEXT: roll %cl, %edi
433
467
; CHECK-NEXT: testl %edi, %edi
434
- ; CHECK-NEXT: je .LBB23_1
468
+ ; CHECK-NEXT: je .LBB25_1
435
469
; CHECK-NEXT: # %bb.2: # %cond.false
436
470
; CHECK-NEXT: rep bsfl %edi, %eax
437
471
; CHECK-NEXT: retq
438
- ; CHECK-NEXT: .LBB23_1 :
472
+ ; CHECK-NEXT: .LBB25_1 :
439
473
; CHECK-NEXT: movl $32, %eax
440
474
; CHECK-NEXT: retq
441
475
%shl = shl i32 %x , %y
@@ -468,11 +502,11 @@ define i32 @rotl_with_fshl_maybe_zero(i32 %x, i32 %y) {
468
502
; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
469
503
; CHECK-NEXT: roll %cl, %edi
470
504
; CHECK-NEXT: testl %edi, %edi
471
- ; CHECK-NEXT: je .LBB25_1
505
+ ; CHECK-NEXT: je .LBB27_1
472
506
; CHECK-NEXT: # %bb.2: # %cond.false
473
507
; CHECK-NEXT: rep bsfl %edi, %eax
474
508
; CHECK-NEXT: retq
475
- ; CHECK-NEXT: .LBB25_1 :
509
+ ; CHECK-NEXT: .LBB27_1 :
476
510
; CHECK-NEXT: movl $32, %eax
477
511
; CHECK-NEXT: retq
478
512
%z = call i32 @llvm.fshl.i32 (i32 %x , i32 %x , i32 %y )
@@ -516,11 +550,11 @@ define i32 @sra_maybe_zero(i32 %x, i32 %y) {
516
550
; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
517
551
; CHECK-NEXT: sarl %cl, %esi
518
552
; CHECK-NEXT: testl %esi, %esi
519
- ; CHECK-NEXT: je .LBB28_1
553
+ ; CHECK-NEXT: je .LBB30_1
520
554
; CHECK-NEXT: # %bb.2: # %cond.false
521
555
; CHECK-NEXT: rep bsfl %esi, %eax
522
556
; CHECK-NEXT: retq
523
- ; CHECK-NEXT: .LBB28_1 :
557
+ ; CHECK-NEXT: .LBB30_1 :
524
558
; CHECK-NEXT: movl $32, %eax
525
559
; CHECK-NEXT: retq
526
560
%z = ashr exact i32 %y , %x
@@ -564,11 +598,11 @@ define i32 @srl_maybe_zero(i32 %x, i32 %y) {
564
598
; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
565
599
; CHECK-NEXT: shrl %cl, %esi
566
600
; CHECK-NEXT: testl %esi, %esi
567
- ; CHECK-NEXT: je .LBB31_1
601
+ ; CHECK-NEXT: je .LBB33_1
568
602
; CHECK-NEXT: # %bb.2: # %cond.false
569
603
; CHECK-NEXT: rep bsfl %esi, %eax
570
604
; CHECK-NEXT: retq
571
- ; CHECK-NEXT: .LBB31_1 :
605
+ ; CHECK-NEXT: .LBB33_1 :
572
606
; CHECK-NEXT: movl $32, %eax
573
607
; CHECK-NEXT: retq
574
608
%z = lshr exact i32 %y , %x
@@ -598,11 +632,11 @@ define i32 @udiv_maybe_zero(i32 %x, i32 %y) {
598
632
; CHECK-NEXT: xorl %edx, %edx
599
633
; CHECK-NEXT: divl %esi
600
634
; CHECK-NEXT: testl %eax, %eax
601
- ; CHECK-NEXT: je .LBB33_1
635
+ ; CHECK-NEXT: je .LBB35_1
602
636
; CHECK-NEXT: # %bb.2: # %cond.false
603
637
; CHECK-NEXT: rep bsfl %eax, %eax
604
638
; CHECK-NEXT: retq
605
- ; CHECK-NEXT: .LBB33_1 :
639
+ ; CHECK-NEXT: .LBB35_1 :
606
640
; CHECK-NEXT: movl $32, %eax
607
641
; CHECK-NEXT: retq
608
642
%z = udiv exact i32 %x , %y
@@ -632,11 +666,11 @@ define i32 @sdiv_maybe_zero(i32 %x, i32 %y) {
632
666
; CHECK-NEXT: cltd
633
667
; CHECK-NEXT: idivl %esi
634
668
; CHECK-NEXT: testl %eax, %eax
635
- ; CHECK-NEXT: je .LBB35_1
669
+ ; CHECK-NEXT: je .LBB37_1
636
670
; CHECK-NEXT: # %bb.2: # %cond.false
637
671
; CHECK-NEXT: rep bsfl %eax, %eax
638
672
; CHECK-NEXT: retq
639
- ; CHECK-NEXT: .LBB35_1 :
673
+ ; CHECK-NEXT: .LBB37_1 :
640
674
; CHECK-NEXT: movl $32, %eax
641
675
; CHECK-NEXT: retq
642
676
%z = sdiv exact i32 %x , %y
@@ -662,11 +696,11 @@ define i32 @add_maybe_zero(i32 %xx, i32 %y) {
662
696
; CHECK: # %bb.0:
663
697
; CHECK-NEXT: orl $1, %edi
664
698
; CHECK-NEXT: addl %esi, %edi
665
- ; CHECK-NEXT: je .LBB37_1
699
+ ; CHECK-NEXT: je .LBB39_1
666
700
; CHECK-NEXT: # %bb.2: # %cond.false
667
701
; CHECK-NEXT: rep bsfl %edi, %eax
668
702
; CHECK-NEXT: retq
669
- ; CHECK-NEXT: .LBB37_1 :
703
+ ; CHECK-NEXT: .LBB39_1 :
670
704
; CHECK-NEXT: movl $32, %eax
671
705
; CHECK-NEXT: retq
672
706
%x = or i32 %xx , 1
@@ -713,11 +747,11 @@ define i32 @sub_maybe_zero(i32 %x) {
713
747
; CHECK-NEXT: movl %edi, %eax
714
748
; CHECK-NEXT: orl $64, %eax
715
749
; CHECK-NEXT: subl %edi, %eax
716
- ; CHECK-NEXT: je .LBB40_1
750
+ ; CHECK-NEXT: je .LBB42_1
717
751
; CHECK-NEXT: # %bb.2: # %cond.false
718
752
; CHECK-NEXT: rep bsfl %eax, %eax
719
753
; CHECK-NEXT: retq
720
- ; CHECK-NEXT: .LBB40_1 :
754
+ ; CHECK-NEXT: .LBB42_1 :
721
755
; CHECK-NEXT: movl $32, %eax
722
756
; CHECK-NEXT: retq
723
757
%y = or i32 %x , 64
@@ -730,11 +764,11 @@ define i32 @sub_maybe_zero2(i32 %x) {
730
764
; CHECK-LABEL: sub_maybe_zero2:
731
765
; CHECK: # %bb.0:
732
766
; CHECK-NEXT: negl %edi
733
- ; CHECK-NEXT: je .LBB41_1
767
+ ; CHECK-NEXT: je .LBB43_1
734
768
; CHECK-NEXT: # %bb.2: # %cond.false
735
769
; CHECK-NEXT: rep bsfl %edi, %eax
736
770
; CHECK-NEXT: retq
737
- ; CHECK-NEXT: .LBB41_1 :
771
+ ; CHECK-NEXT: .LBB43_1 :
738
772
; CHECK-NEXT: movl $32, %eax
739
773
; CHECK-NEXT: retq
740
774
%z = sub i32 0 , %x
@@ -748,11 +782,11 @@ define i32 @mul_known_nonzero_nsw(i32 %x, i32 %yy) {
748
782
; CHECK-NEXT: orl $256, %esi # imm = 0x100
749
783
; CHECK-NEXT: imull %edi, %esi
750
784
; CHECK-NEXT: testl %esi, %esi
751
- ; CHECK-NEXT: je .LBB42_1
785
+ ; CHECK-NEXT: je .LBB44_1
752
786
; CHECK-NEXT: # %bb.2: # %cond.false
753
787
; CHECK-NEXT: rep bsfl %esi, %eax
754
788
; CHECK-NEXT: retq
755
- ; CHECK-NEXT: .LBB42_1 :
789
+ ; CHECK-NEXT: .LBB44_1 :
756
790
; CHECK-NEXT: movl $32, %eax
757
791
; CHECK-NEXT: retq
758
792
%y = or i32 %yy , 256
@@ -767,11 +801,11 @@ define i32 @mul_known_nonzero_nuw(i32 %x, i32 %yy) {
767
801
; CHECK-NEXT: orl $256, %esi # imm = 0x100
768
802
; CHECK-NEXT: imull %edi, %esi
769
803
; CHECK-NEXT: testl %esi, %esi
770
- ; CHECK-NEXT: je .LBB43_1
804
+ ; CHECK-NEXT: je .LBB45_1
771
805
; CHECK-NEXT: # %bb.2: # %cond.false
772
806
; CHECK-NEXT: rep bsfl %esi, %eax
773
807
; CHECK-NEXT: retq
774
- ; CHECK-NEXT: .LBB43_1 :
808
+ ; CHECK-NEXT: .LBB45_1 :
775
809
; CHECK-NEXT: movl $32, %eax
776
810
; CHECK-NEXT: retq
777
811
%y = or i32 %yy , 256
@@ -785,11 +819,11 @@ define i32 @mul_maybe_zero(i32 %x, i32 %y) {
785
819
; CHECK: # %bb.0:
786
820
; CHECK-NEXT: imull %esi, %edi
787
821
; CHECK-NEXT: testl %edi, %edi
788
- ; CHECK-NEXT: je .LBB44_1
822
+ ; CHECK-NEXT: je .LBB46_1
789
823
; CHECK-NEXT: # %bb.2: # %cond.false
790
824
; CHECK-NEXT: rep bsfl %edi, %eax
791
825
; CHECK-NEXT: retq
792
- ; CHECK-NEXT: .LBB44_1 :
826
+ ; CHECK-NEXT: .LBB46_1 :
793
827
; CHECK-NEXT: movl $32, %eax
794
828
; CHECK-NEXT: retq
795
829
%z = mul nuw nsw i32 %y , %x
@@ -822,11 +856,11 @@ define i32 @bitcast_maybe_zero(<2 x i16> %x) {
822
856
; CHECK: # %bb.0:
823
857
; CHECK-NEXT: movd %xmm0, %eax
824
858
; CHECK-NEXT: testl %eax, %eax
825
- ; CHECK-NEXT: je .LBB46_1
859
+ ; CHECK-NEXT: je .LBB48_1
826
860
; CHECK-NEXT: # %bb.2: # %cond.false
827
861
; CHECK-NEXT: rep bsfl %eax, %eax
828
862
; CHECK-NEXT: retq
829
- ; CHECK-NEXT: .LBB46_1 :
863
+ ; CHECK-NEXT: .LBB48_1 :
830
864
; CHECK-NEXT: movl $32, %eax
831
865
; CHECK-NEXT: retq
832
866
%z = bitcast <2 x i16 > %x to i32
@@ -839,11 +873,11 @@ define i32 @bitcast_from_float(float %x) {
839
873
; CHECK: # %bb.0:
840
874
; CHECK-NEXT: movd %xmm0, %eax
841
875
; CHECK-NEXT: testl %eax, %eax
842
- ; CHECK-NEXT: je .LBB47_1
876
+ ; CHECK-NEXT: je .LBB49_1
843
877
; CHECK-NEXT: # %bb.2: # %cond.false
844
878
; CHECK-NEXT: rep bsfl %eax, %eax
845
879
; CHECK-NEXT: retq
846
- ; CHECK-NEXT: .LBB47_1 :
880
+ ; CHECK-NEXT: .LBB49_1 :
847
881
; CHECK-NEXT: movl $32, %eax
848
882
; CHECK-NEXT: retq
849
883
%z = bitcast float %x to i32
@@ -871,12 +905,12 @@ define i32 @zext_maybe_zero(i16 %x) {
871
905
; CHECK-LABEL: zext_maybe_zero:
872
906
; CHECK: # %bb.0:
873
907
; CHECK-NEXT: testw %di, %di
874
- ; CHECK-NEXT: je .LBB49_1
908
+ ; CHECK-NEXT: je .LBB51_1
875
909
; CHECK-NEXT: # %bb.2: # %cond.false
876
910
; CHECK-NEXT: movzwl %di, %eax
877
911
; CHECK-NEXT: rep bsfl %eax, %eax
878
912
; CHECK-NEXT: retq
879
- ; CHECK-NEXT: .LBB49_1 :
913
+ ; CHECK-NEXT: .LBB51_1 :
880
914
; CHECK-NEXT: movl $32, %eax
881
915
; CHECK-NEXT: retq
882
916
%z = zext i16 %x to i32
@@ -904,12 +938,12 @@ define i32 @sext_maybe_zero(i16 %x) {
904
938
; CHECK-LABEL: sext_maybe_zero:
905
939
; CHECK: # %bb.0:
906
940
; CHECK-NEXT: testw %di, %di
907
- ; CHECK-NEXT: je .LBB51_1
941
+ ; CHECK-NEXT: je .LBB53_1
908
942
; CHECK-NEXT: # %bb.2: # %cond.false
909
943
; CHECK-NEXT: movswl %di, %eax
910
944
; CHECK-NEXT: rep bsfl %eax, %eax
911
945
; CHECK-NEXT: retq
912
- ; CHECK-NEXT: .LBB51_1 :
946
+ ; CHECK-NEXT: .LBB53_1 :
913
947
; CHECK-NEXT: movl $32, %eax
914
948
; CHECK-NEXT: retq
915
949
%z = sext i16 %x to i32
0 commit comments