@@ -49,9 +49,7 @@ define i32 @select_known_nonzero(i1 %c, i32 %x) {
49
49
; CHECK-NEXT: testb $1, %dil
50
50
; CHECK-NEXT: movl $122, %eax
51
51
; CHECK-NEXT: cmovnel %esi, %eax
52
- ; CHECK-NEXT: bsfl %eax, %ecx
53
- ; CHECK-NEXT: movl $32, %eax
54
- ; CHECK-NEXT: cmovnel %ecx, %eax
52
+ ; CHECK-NEXT: rep bsfl %eax, %eax
55
53
; CHECK-NEXT: retq
56
54
%y = or i32 %x , 1
57
55
%z = select i1 %c , i32 %y , i32 122
@@ -87,9 +85,7 @@ define i32 @shl_known_nonzero_1s_bit_set(i32 %x) {
87
85
; CHECK-NEXT: movl $123, %eax
88
86
; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
89
87
; CHECK-NEXT: shll %cl, %eax
90
- ; CHECK-NEXT: bsfl %eax, %ecx
91
- ; CHECK-NEXT: movl $32, %eax
92
- ; CHECK-NEXT: cmovnel %ecx, %eax
88
+ ; CHECK-NEXT: rep bsfl %eax, %eax
93
89
; CHECK-NEXT: retq
94
90
%z = shl i32 123 , %x
95
91
%r = call i32 @llvm.cttz.i32 (i32 %z , i1 false )
@@ -103,9 +99,7 @@ define i32 @shl_known_nonzero_nsw(i32 %x, i32 %yy) {
103
99
; CHECK-NEXT: orl $256, %esi # imm = 0x100
104
100
; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
105
101
; CHECK-NEXT: shll %cl, %esi
106
- ; CHECK-NEXT: bsfl %esi, %ecx
107
- ; CHECK-NEXT: movl $32, %eax
108
- ; CHECK-NEXT: cmovnel %ecx, %eax
102
+ ; CHECK-NEXT: rep bsfl %esi, %eax
109
103
; CHECK-NEXT: retq
110
104
%y = or i32 %yy , 256
111
105
%z = shl nsw i32 %y , %x
@@ -120,9 +114,7 @@ define i32 @shl_known_nonzero_nuw(i32 %x, i32 %yy) {
120
114
; CHECK-NEXT: orl $256, %esi # imm = 0x100
121
115
; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
122
116
; CHECK-NEXT: shll %cl, %esi
123
- ; CHECK-NEXT: bsfl %esi, %ecx
124
- ; CHECK-NEXT: movl $32, %eax
125
- ; CHECK-NEXT: cmovnel %ecx, %eax
117
+ ; CHECK-NEXT: rep bsfl %esi, %eax
126
118
; CHECK-NEXT: retq
127
119
%y = or i32 %yy , 256
128
120
%z = shl nuw i32 %y , %x
@@ -155,9 +147,7 @@ define i32 @uaddsat_known_nonzero(i32 %x) {
155
147
; CHECK-NEXT: incl %edi
156
148
; CHECK-NEXT: movl $-1, %eax
157
149
; CHECK-NEXT: cmovnel %edi, %eax
158
- ; CHECK-NEXT: bsfl %eax, %ecx
159
- ; CHECK-NEXT: movl $32, %eax
160
- ; CHECK-NEXT: cmovnel %ecx, %eax
150
+ ; CHECK-NEXT: rep bsfl %eax, %eax
161
151
; CHECK-NEXT: retq
162
152
%z = call i32 @llvm.uadd.sat.i32 (i32 %x , i32 1 )
163
153
%r = call i32 @llvm.cttz.i32 (i32 %z , i1 false )
@@ -192,9 +182,7 @@ define i32 @umax_known_nonzero(i32 %x, i32 %y) {
192
182
; CHECK-NEXT: shll %cl, %eax
193
183
; CHECK-NEXT: cmpl %eax, %edi
194
184
; CHECK-NEXT: cmoval %edi, %eax
195
- ; CHECK-NEXT: bsfl %eax, %ecx
196
- ; CHECK-NEXT: movl $32, %eax
197
- ; CHECK-NEXT: cmovnel %ecx, %eax
185
+ ; CHECK-NEXT: rep bsfl %eax, %eax
198
186
; CHECK-NEXT: retq
199
187
%yy = shl nuw i32 4 , %y
200
188
%z = call i32 @llvm.umax.i32 (i32 %x , i32 %yy )
@@ -230,9 +218,7 @@ define i32 @umin_known_nonzero(i32 %xx, i32 %yy) {
230
218
; CHECK-NEXT: addl $4, %esi
231
219
; CHECK-NEXT: cmpl %esi, %eax
232
220
; CHECK-NEXT: cmovbl %eax, %esi
233
- ; CHECK-NEXT: bsfl %esi, %ecx
234
- ; CHECK-NEXT: movl $32, %eax
235
- ; CHECK-NEXT: cmovnel %ecx, %eax
221
+ ; CHECK-NEXT: rep bsfl %esi, %eax
236
222
; CHECK-NEXT: retq
237
223
%x = shl nuw i32 4 , %xx
238
224
%y = add nuw nsw i32 %yy , 4
@@ -313,9 +299,7 @@ define i32 @rotr_with_fshr_known_nonzero(i32 %xx, i32 %y) {
313
299
; CHECK-NEXT: orl $256, %edi # imm = 0x100
314
300
; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
315
301
; CHECK-NEXT: rorl %cl, %edi
316
- ; CHECK-NEXT: bsfl %edi, %ecx
317
- ; CHECK-NEXT: movl $32, %eax
318
- ; CHECK-NEXT: cmovnel %ecx, %eax
302
+ ; CHECK-NEXT: rep bsfl %edi, %eax
319
303
; CHECK-NEXT: retq
320
304
%x = or i32 %xx , 256
321
305
%z = call i32 @llvm.fshr.i32 (i32 %x , i32 %x , i32 %y )
@@ -395,9 +379,7 @@ define i32 @rotl_with_fshl_known_nonzero(i32 %xx, i32 %y) {
395
379
; CHECK-NEXT: orl $256, %edi # imm = 0x100
396
380
; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
397
381
; CHECK-NEXT: roll %cl, %edi
398
- ; CHECK-NEXT: bsfl %edi, %ecx
399
- ; CHECK-NEXT: movl $32, %eax
400
- ; CHECK-NEXT: cmovnel %ecx, %eax
382
+ ; CHECK-NEXT: rep bsfl %edi, %eax
401
383
; CHECK-NEXT: retq
402
384
%x = or i32 %xx , 256
403
385
%z = call i32 @llvm.fshl.i32 (i32 %x , i32 %x , i32 %y )
@@ -445,9 +427,7 @@ define i32 @sra_known_nonzero_exact(i32 %x, i32 %yy) {
445
427
; CHECK-NEXT: orl $256, %esi # imm = 0x100
446
428
; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
447
429
; CHECK-NEXT: sarl %cl, %esi
448
- ; CHECK-NEXT: bsfl %esi, %ecx
449
- ; CHECK-NEXT: movl $32, %eax
450
- ; CHECK-NEXT: cmovnel %ecx, %eax
430
+ ; CHECK-NEXT: rep bsfl %esi, %eax
451
431
; CHECK-NEXT: retq
452
432
%y = or i32 %yy , 256
453
433
%z = ashr exact i32 %y , %x
@@ -481,9 +461,7 @@ define i32 @srl_known_nonzero_sign_bit_set(i32 %x) {
481
461
; CHECK-NEXT: movl $-2147360405, %eax # imm = 0x8001E16B
482
462
; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
483
463
; CHECK-NEXT: shrl %cl, %eax
484
- ; CHECK-NEXT: bsfl %eax, %ecx
485
- ; CHECK-NEXT: movl $32, %eax
486
- ; CHECK-NEXT: cmovnel %ecx, %eax
464
+ ; CHECK-NEXT: rep bsfl %eax, %eax
487
465
; CHECK-NEXT: retq
488
466
%z = lshr i32 2147606891 , %x
489
467
%r = call i32 @llvm.cttz.i32 (i32 %z , i1 false )
@@ -497,9 +475,7 @@ define i32 @srl_known_nonzero_exact(i32 %x, i32 %yy) {
497
475
; CHECK-NEXT: orl $256, %esi # imm = 0x100
498
476
; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
499
477
; CHECK-NEXT: shrl %cl, %esi
500
- ; CHECK-NEXT: bsfl %esi, %ecx
501
- ; CHECK-NEXT: movl $32, %eax
502
- ; CHECK-NEXT: cmovnel %ecx, %eax
478
+ ; CHECK-NEXT: rep bsfl %esi, %eax
503
479
; CHECK-NEXT: retq
504
480
%y = or i32 %yy , 256
505
481
%z = lshr exact i32 %y , %x
@@ -533,9 +509,7 @@ define i32 @udiv_known_nonzero(i32 %xx, i32 %y) {
533
509
; CHECK-NEXT: orl $64, %eax
534
510
; CHECK-NEXT: xorl %edx, %edx
535
511
; CHECK-NEXT: divl %esi
536
- ; CHECK-NEXT: bsfl %eax, %ecx
537
- ; CHECK-NEXT: movl $32, %eax
538
- ; CHECK-NEXT: cmovnel %ecx, %eax
512
+ ; CHECK-NEXT: rep bsfl %eax, %eax
539
513
; CHECK-NEXT: retq
540
514
%x = or i32 %xx , 64
541
515
%z = udiv exact i32 %x , %y
@@ -569,9 +543,7 @@ define i32 @sdiv_known_nonzero(i32 %xx, i32 %y) {
569
543
; CHECK-NEXT: orl $64, %eax
570
544
; CHECK-NEXT: cltd
571
545
; CHECK-NEXT: idivl %esi
572
- ; CHECK-NEXT: bsfl %eax, %ecx
573
- ; CHECK-NEXT: movl $32, %eax
574
- ; CHECK-NEXT: cmovnel %ecx, %eax
546
+ ; CHECK-NEXT: rep bsfl %eax, %eax
575
547
; CHECK-NEXT: retq
576
548
%x = or i32 %xx , 64
577
549
%z = sdiv exact i32 %x , %y
@@ -603,9 +575,7 @@ define i32 @add_known_nonzero(i32 %xx, i32 %y) {
603
575
; CHECK: # %bb.0:
604
576
; CHECK-NEXT: orl $1, %edi
605
577
; CHECK-NEXT: addl %esi, %edi
606
- ; CHECK-NEXT: bsfl %edi, %ecx
607
- ; CHECK-NEXT: movl $32, %eax
608
- ; CHECK-NEXT: cmovnel %ecx, %eax
578
+ ; CHECK-NEXT: rep bsfl %edi, %eax
609
579
; CHECK-NEXT: retq
610
580
%x = or i32 %xx , 1
611
581
%z = add nuw i32 %x , %y
@@ -639,9 +609,7 @@ define i32 @sub_known_nonzero_neg_case(i32 %xx) {
639
609
; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
640
610
; CHECK-NEXT: shll %cl, %eax
641
611
; CHECK-NEXT: negl %eax
642
- ; CHECK-NEXT: bsfl %eax, %ecx
643
- ; CHECK-NEXT: movl $32, %eax
644
- ; CHECK-NEXT: cmovnel %ecx, %eax
612
+ ; CHECK-NEXT: rep bsfl %eax, %eax
645
613
; CHECK-NEXT: retq
646
614
%x = shl nuw nsw i32 256 , %xx
647
615
%z = sub i32 0 , %x
@@ -656,9 +624,7 @@ define i32 @sub_known_nonzero_ne_case(i32 %xx, i32 %yy) {
656
624
; CHECK-NEXT: orl $64, %eax
657
625
; CHECK-NEXT: andl $-65, %edi
658
626
; CHECK-NEXT: subl %eax, %edi
659
- ; CHECK-NEXT: bsfl %edi, %ecx
660
- ; CHECK-NEXT: movl $32, %eax
661
- ; CHECK-NEXT: cmovnel %ecx, %eax
627
+ ; CHECK-NEXT: rep bsfl %edi, %eax
662
628
; CHECK-NEXT: retq
663
629
%x = or i32 %xx , 64
664
630
%y = and i32 %xx , -65
@@ -819,9 +785,7 @@ define i32 @zext_known_nonzero(i16 %xx) {
819
785
; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
820
786
; CHECK-NEXT: shll %cl, %eax
821
787
; CHECK-NEXT: movzwl %ax, %eax
822
- ; CHECK-NEXT: bsfl %eax, %ecx
823
- ; CHECK-NEXT: movl $32, %eax
824
- ; CHECK-NEXT: cmovnel %ecx, %eax
788
+ ; CHECK-NEXT: rep bsfl %eax, %eax
825
789
; CHECK-NEXT: retq
826
790
%x = shl nuw nsw i16 256 , %xx
827
791
%z = zext i16 %x to i32
@@ -854,9 +818,7 @@ define i32 @sext_known_nonzero(i16 %xx) {
854
818
; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
855
819
; CHECK-NEXT: shll %cl, %eax
856
820
; CHECK-NEXT: cwtl
857
- ; CHECK-NEXT: bsfl %eax, %ecx
858
- ; CHECK-NEXT: movl $32, %eax
859
- ; CHECK-NEXT: cmovnel %ecx, %eax
821
+ ; CHECK-NEXT: rep bsfl %eax, %eax
860
822
; CHECK-NEXT: retq
861
823
%x = shl nuw nsw i16 256 , %xx
862
824
%z = sext i16 %x to i32
0 commit comments