@@ -309,6 +309,28 @@ define i1 @andn_cmp_i8(i8 %x, i8 %y) {
309
309
ret i1 %cmp
310
310
}
311
311
312
+ ; FIXME: PR48768 - 'andn' clears the overflow flag, so we don't need a separate 'test'.
313
+ define i1 @andn_cmp_i32_overflow (i32 %x , i32 %y ) {
314
+ ; X86-LABEL: andn_cmp_i32_overflow:
315
+ ; X86: # %bb.0:
316
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
317
+ ; X86-NEXT: andnl {{[0-9]+}}(%esp), %eax, %eax
318
+ ; X86-NEXT: testl %eax, %eax
319
+ ; X86-NEXT: setle %al
320
+ ; X86-NEXT: retl
321
+ ;
322
+ ; X64-LABEL: andn_cmp_i32_overflow:
323
+ ; X64: # %bb.0:
324
+ ; X64-NEXT: andnl %edi, %esi, %eax
325
+ ; X64-NEXT: testl %eax, %eax
326
+ ; X64-NEXT: setle %al
327
+ ; X64-NEXT: retq
328
+ %noty = xor i32 %y , -1
329
+ %and = and i32 %x , %noty
330
+ %cmp = icmp slt i32 %and , 1
331
+ ret i1 %cmp
332
+ }
333
+
312
334
declare i32 @llvm.x86.bmi.bextr.32 (i32 , i32 )
313
335
314
336
define i32 @bextr32 (i32 %x , i32 %y ) {
@@ -498,10 +520,10 @@ define i32 @blsi32_z(i32 %a, i32 %b) nounwind {
498
520
; X86-LABEL: blsi32_z:
499
521
; X86: # %bb.0:
500
522
; X86-NEXT: blsil {{[0-9]+}}(%esp), %eax
501
- ; X86-NEXT: jne .LBB24_2
523
+ ; X86-NEXT: jne .LBB25_2
502
524
; X86-NEXT: # %bb.1:
503
525
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
504
- ; X86-NEXT: .LBB24_2 :
526
+ ; X86-NEXT: .LBB25_2 :
505
527
; X86-NEXT: retl
506
528
;
507
529
; X64-LABEL: blsi32_z:
@@ -605,11 +627,11 @@ define i64 @blsi64_z(i64 %a, i64 %b) nounwind {
605
627
; X86-NEXT: andl %ecx, %eax
606
628
; X86-NEXT: movl %eax, %ecx
607
629
; X86-NEXT: orl %edx, %ecx
608
- ; X86-NEXT: jne .LBB28_2
630
+ ; X86-NEXT: jne .LBB29_2
609
631
; X86-NEXT: # %bb.1:
610
632
; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
611
633
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
612
- ; X86-NEXT: .LBB28_2 :
634
+ ; X86-NEXT: .LBB29_2 :
613
635
; X86-NEXT: popl %esi
614
636
; X86-NEXT: retl
615
637
;
@@ -730,10 +752,10 @@ define i32 @blsmsk32_z(i32 %a, i32 %b) nounwind {
730
752
; X86-LABEL: blsmsk32_z:
731
753
; X86: # %bb.0:
732
754
; X86-NEXT: blsmskl {{[0-9]+}}(%esp), %eax
733
- ; X86-NEXT: jne .LBB33_2
755
+ ; X86-NEXT: jne .LBB34_2
734
756
; X86-NEXT: # %bb.1:
735
757
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
736
- ; X86-NEXT: .LBB33_2 :
758
+ ; X86-NEXT: .LBB34_2 :
737
759
; X86-NEXT: retl
738
760
;
739
761
; X64-LABEL: blsmsk32_z:
@@ -835,11 +857,11 @@ define i64 @blsmsk64_z(i64 %a, i64 %b) nounwind {
835
857
; X86-NEXT: xorl %esi, %edx
836
858
; X86-NEXT: movl %eax, %ecx
837
859
; X86-NEXT: orl %edx, %ecx
838
- ; X86-NEXT: jne .LBB37_2
860
+ ; X86-NEXT: jne .LBB38_2
839
861
; X86-NEXT: # %bb.1:
840
862
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
841
863
; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
842
- ; X86-NEXT: .LBB37_2 :
864
+ ; X86-NEXT: .LBB38_2 :
843
865
; X86-NEXT: popl %esi
844
866
; X86-NEXT: retl
845
867
;
@@ -960,10 +982,10 @@ define i32 @blsr32_z(i32 %a, i32 %b) nounwind {
960
982
; X86-LABEL: blsr32_z:
961
983
; X86: # %bb.0:
962
984
; X86-NEXT: blsrl {{[0-9]+}}(%esp), %eax
963
- ; X86-NEXT: jne .LBB42_2
985
+ ; X86-NEXT: jne .LBB43_2
964
986
; X86-NEXT: # %bb.1:
965
987
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
966
- ; X86-NEXT: .LBB42_2 :
988
+ ; X86-NEXT: .LBB43_2 :
967
989
; X86-NEXT: retl
968
990
;
969
991
; X64-LABEL: blsr32_z:
@@ -1065,11 +1087,11 @@ define i64 @blsr64_z(i64 %a, i64 %b) nounwind {
1065
1087
; X86-NEXT: andl %esi, %edx
1066
1088
; X86-NEXT: movl %eax, %ecx
1067
1089
; X86-NEXT: orl %edx, %ecx
1068
- ; X86-NEXT: jne .LBB46_2
1090
+ ; X86-NEXT: jne .LBB47_2
1069
1091
; X86-NEXT: # %bb.1:
1070
1092
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
1071
1093
; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
1072
- ; X86-NEXT: .LBB46_2 :
1094
+ ; X86-NEXT: .LBB47_2 :
1073
1095
; X86-NEXT: popl %esi
1074
1096
; X86-NEXT: retl
1075
1097
;
@@ -1203,20 +1225,20 @@ define void @pr40060(i32, i32) {
1203
1225
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
1204
1226
; X86-NEXT: bextrl %eax, {{[0-9]+}}(%esp), %eax
1205
1227
; X86-NEXT: testl %eax, %eax
1206
- ; X86-NEXT: js .LBB51_1
1228
+ ; X86-NEXT: js .LBB52_1
1207
1229
; X86-NEXT: # %bb.2:
1208
1230
; X86-NEXT: jmp bar # TAILCALL
1209
- ; X86-NEXT: .LBB51_1 :
1231
+ ; X86-NEXT: .LBB52_1 :
1210
1232
; X86-NEXT: retl
1211
1233
;
1212
1234
; X64-LABEL: pr40060:
1213
1235
; X64: # %bb.0:
1214
1236
; X64-NEXT: bextrl %esi, %edi, %eax
1215
1237
; X64-NEXT: testl %eax, %eax
1216
- ; X64-NEXT: js .LBB51_1
1238
+ ; X64-NEXT: js .LBB52_1
1217
1239
; X64-NEXT: # %bb.2:
1218
1240
; X64-NEXT: jmp bar # TAILCALL
1219
- ; X64-NEXT: .LBB51_1 :
1241
+ ; X64-NEXT: .LBB52_1 :
1220
1242
; X64-NEXT: retq
1221
1243
%3 = tail call i32 @llvm.x86.bmi.bextr.32 (i32 %0 , i32 %1 )
1222
1244
%4 = icmp sgt i32 %3 , -1
@@ -1235,10 +1257,10 @@ define i32 @blsr32_branch(i32 %x) {
1235
1257
; X86-NEXT: .cfi_def_cfa_offset 8
1236
1258
; X86-NEXT: .cfi_offset %esi, -8
1237
1259
; X86-NEXT: blsrl {{[0-9]+}}(%esp), %esi
1238
- ; X86-NEXT: jne .LBB52_2
1260
+ ; X86-NEXT: jne .LBB53_2
1239
1261
; X86-NEXT: # %bb.1:
1240
1262
; X86-NEXT: calll bar
1241
- ; X86-NEXT: .LBB52_2 :
1263
+ ; X86-NEXT: .LBB53_2 :
1242
1264
; X86-NEXT: movl %esi, %eax
1243
1265
; X86-NEXT: popl %esi
1244
1266
; X86-NEXT: .cfi_def_cfa_offset 4
@@ -1250,10 +1272,10 @@ define i32 @blsr32_branch(i32 %x) {
1250
1272
; X64-NEXT: .cfi_def_cfa_offset 16
1251
1273
; X64-NEXT: .cfi_offset %rbx, -16
1252
1274
; X64-NEXT: blsrl %edi, %ebx
1253
- ; X64-NEXT: jne .LBB52_2
1275
+ ; X64-NEXT: jne .LBB53_2
1254
1276
; X64-NEXT: # %bb.1:
1255
1277
; X64-NEXT: callq bar
1256
- ; X64-NEXT: .LBB52_2 :
1278
+ ; X64-NEXT: .LBB53_2 :
1257
1279
; X64-NEXT: movl %ebx, %eax
1258
1280
; X64-NEXT: popq %rbx
1259
1281
; X64-NEXT: .cfi_def_cfa_offset 8
@@ -1287,10 +1309,10 @@ define i64 @blsr64_branch(i64 %x) {
1287
1309
; X86-NEXT: andl %ecx, %edi
1288
1310
; X86-NEXT: movl %esi, %eax
1289
1311
; X86-NEXT: orl %edi, %eax
1290
- ; X86-NEXT: jne .LBB53_2
1312
+ ; X86-NEXT: jne .LBB54_2
1291
1313
; X86-NEXT: # %bb.1:
1292
1314
; X86-NEXT: calll bar
1293
- ; X86-NEXT: .LBB53_2 :
1315
+ ; X86-NEXT: .LBB54_2 :
1294
1316
; X86-NEXT: movl %esi, %eax
1295
1317
; X86-NEXT: movl %edi, %edx
1296
1318
; X86-NEXT: popl %esi
@@ -1305,10 +1327,10 @@ define i64 @blsr64_branch(i64 %x) {
1305
1327
; X64-NEXT: .cfi_def_cfa_offset 16
1306
1328
; X64-NEXT: .cfi_offset %rbx, -16
1307
1329
; X64-NEXT: blsrq %rdi, %rbx
1308
- ; X64-NEXT: jne .LBB53_2
1330
+ ; X64-NEXT: jne .LBB54_2
1309
1331
; X64-NEXT: # %bb.1:
1310
1332
; X64-NEXT: callq bar
1311
- ; X64-NEXT: .LBB53_2 :
1333
+ ; X64-NEXT: .LBB54_2 :
1312
1334
; X64-NEXT: movq %rbx, %rax
1313
1335
; X64-NEXT: popq %rbx
1314
1336
; X64-NEXT: .cfi_def_cfa_offset 8
@@ -1330,10 +1352,10 @@ define i32 @blsi32_branch(i32 %x) {
1330
1352
; X86-NEXT: .cfi_def_cfa_offset 8
1331
1353
; X86-NEXT: .cfi_offset %esi, -8
1332
1354
; X86-NEXT: blsil {{[0-9]+}}(%esp), %esi
1333
- ; X86-NEXT: jne .LBB54_2
1355
+ ; X86-NEXT: jne .LBB55_2
1334
1356
; X86-NEXT: # %bb.1:
1335
1357
; X86-NEXT: calll bar
1336
- ; X86-NEXT: .LBB54_2 :
1358
+ ; X86-NEXT: .LBB55_2 :
1337
1359
; X86-NEXT: movl %esi, %eax
1338
1360
; X86-NEXT: popl %esi
1339
1361
; X86-NEXT: .cfi_def_cfa_offset 4
@@ -1345,10 +1367,10 @@ define i32 @blsi32_branch(i32 %x) {
1345
1367
; X64-NEXT: .cfi_def_cfa_offset 16
1346
1368
; X64-NEXT: .cfi_offset %rbx, -16
1347
1369
; X64-NEXT: blsil %edi, %ebx
1348
- ; X64-NEXT: jne .LBB54_2
1370
+ ; X64-NEXT: jne .LBB55_2
1349
1371
; X64-NEXT: # %bb.1:
1350
1372
; X64-NEXT: callq bar
1351
- ; X64-NEXT: .LBB54_2 :
1373
+ ; X64-NEXT: .LBB55_2 :
1352
1374
; X64-NEXT: movl %ebx, %eax
1353
1375
; X64-NEXT: popq %rbx
1354
1376
; X64-NEXT: .cfi_def_cfa_offset 8
@@ -1382,10 +1404,10 @@ define i64 @blsi64_branch(i64 %x) {
1382
1404
; X86-NEXT: andl %eax, %edi
1383
1405
; X86-NEXT: movl %edi, %eax
1384
1406
; X86-NEXT: orl %esi, %eax
1385
- ; X86-NEXT: jne .LBB55_2
1407
+ ; X86-NEXT: jne .LBB56_2
1386
1408
; X86-NEXT: # %bb.1:
1387
1409
; X86-NEXT: calll bar
1388
- ; X86-NEXT: .LBB55_2 :
1410
+ ; X86-NEXT: .LBB56_2 :
1389
1411
; X86-NEXT: movl %edi, %eax
1390
1412
; X86-NEXT: movl %esi, %edx
1391
1413
; X86-NEXT: popl %esi
@@ -1400,10 +1422,10 @@ define i64 @blsi64_branch(i64 %x) {
1400
1422
; X64-NEXT: .cfi_def_cfa_offset 16
1401
1423
; X64-NEXT: .cfi_offset %rbx, -16
1402
1424
; X64-NEXT: blsiq %rdi, %rbx
1403
- ; X64-NEXT: jne .LBB55_2
1425
+ ; X64-NEXT: jne .LBB56_2
1404
1426
; X64-NEXT: # %bb.1:
1405
1427
; X64-NEXT: callq bar
1406
- ; X64-NEXT: .LBB55_2 :
1428
+ ; X64-NEXT: .LBB56_2 :
1407
1429
; X64-NEXT: movq %rbx, %rax
1408
1430
; X64-NEXT: popq %rbx
1409
1431
; X64-NEXT: .cfi_def_cfa_offset 8
@@ -1424,19 +1446,19 @@ define void @pr42118_i32(i32 %x) {
1424
1446
; X86-LABEL: pr42118_i32:
1425
1447
; X86: # %bb.0:
1426
1448
; X86-NEXT: blsrl {{[0-9]+}}(%esp), %eax
1427
- ; X86-NEXT: jne .LBB56_1
1449
+ ; X86-NEXT: jne .LBB57_1
1428
1450
; X86-NEXT: # %bb.2:
1429
1451
; X86-NEXT: jmp bar # TAILCALL
1430
- ; X86-NEXT: .LBB56_1 :
1452
+ ; X86-NEXT: .LBB57_1 :
1431
1453
; X86-NEXT: retl
1432
1454
;
1433
1455
; X64-LABEL: pr42118_i32:
1434
1456
; X64: # %bb.0:
1435
1457
; X64-NEXT: blsrl %edi, %eax
1436
- ; X64-NEXT: jne .LBB56_1
1458
+ ; X64-NEXT: jne .LBB57_1
1437
1459
; X64-NEXT: # %bb.2:
1438
1460
; X64-NEXT: jmp bar # TAILCALL
1439
- ; X64-NEXT: .LBB56_1 :
1461
+ ; X64-NEXT: .LBB57_1 :
1440
1462
; X64-NEXT: retq
1441
1463
%tmp = sub i32 0 , %x
1442
1464
%tmp1 = and i32 %tmp , %x
@@ -1464,12 +1486,12 @@ define void @pr42118_i64(i64 %x) {
1464
1486
; X86-NEXT: andl %eax, %edx
1465
1487
; X86-NEXT: andl %ecx, %esi
1466
1488
; X86-NEXT: orl %edx, %esi
1467
- ; X86-NEXT: jne .LBB57_1
1489
+ ; X86-NEXT: jne .LBB58_1
1468
1490
; X86-NEXT: # %bb.2:
1469
1491
; X86-NEXT: popl %esi
1470
1492
; X86-NEXT: .cfi_def_cfa_offset 4
1471
1493
; X86-NEXT: jmp bar # TAILCALL
1472
- ; X86-NEXT: .LBB57_1 :
1494
+ ; X86-NEXT: .LBB58_1 :
1473
1495
; X86-NEXT: .cfi_def_cfa_offset 8
1474
1496
; X86-NEXT: popl %esi
1475
1497
; X86-NEXT: .cfi_def_cfa_offset 4
@@ -1478,10 +1500,10 @@ define void @pr42118_i64(i64 %x) {
1478
1500
; X64-LABEL: pr42118_i64:
1479
1501
; X64: # %bb.0:
1480
1502
; X64-NEXT: blsrq %rdi, %rax
1481
- ; X64-NEXT: jne .LBB57_1
1503
+ ; X64-NEXT: jne .LBB58_1
1482
1504
; X64-NEXT: # %bb.2:
1483
1505
; X64-NEXT: jmp bar # TAILCALL
1484
- ; X64-NEXT: .LBB57_1 :
1506
+ ; X64-NEXT: .LBB58_1 :
1485
1507
; X64-NEXT: retq
1486
1508
%tmp = sub i64 0 , %x
1487
1509
%tmp1 = and i64 %tmp , %x
@@ -1499,11 +1521,11 @@ define i32 @blsi_cflag_32(i32 %x, i32 %y) nounwind {
1499
1521
; X86: # %bb.0:
1500
1522
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
1501
1523
; X86-NEXT: testl %eax, %eax
1502
- ; X86-NEXT: jne .LBB58_1
1524
+ ; X86-NEXT: jne .LBB59_1
1503
1525
; X86-NEXT: # %bb.2:
1504
1526
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
1505
1527
; X86-NEXT: retl
1506
- ; X86-NEXT: .LBB58_1 :
1528
+ ; X86-NEXT: .LBB59_1 :
1507
1529
; X86-NEXT: blsil %eax, %eax
1508
1530
; X86-NEXT: retl
1509
1531
;
@@ -1532,15 +1554,15 @@ define i64 @blsi_cflag_64(i64 %x, i64 %y) nounwind {
1532
1554
; X86-NEXT: sbbl %esi, %edx
1533
1555
; X86-NEXT: movl %ecx, %edi
1534
1556
; X86-NEXT: orl %esi, %edi
1535
- ; X86-NEXT: jne .LBB59_1
1557
+ ; X86-NEXT: jne .LBB60_1
1536
1558
; X86-NEXT: # %bb.2:
1537
1559
; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
1538
1560
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
1539
- ; X86-NEXT: jmp .LBB59_3
1540
- ; X86-NEXT: .LBB59_1 :
1561
+ ; X86-NEXT: jmp .LBB60_3
1562
+ ; X86-NEXT: .LBB60_1 :
1541
1563
; X86-NEXT: andl %esi, %edx
1542
1564
; X86-NEXT: andl %ecx, %eax
1543
- ; X86-NEXT: .LBB59_3 :
1565
+ ; X86-NEXT: .LBB60_3 :
1544
1566
; X86-NEXT: popl %esi
1545
1567
; X86-NEXT: popl %edi
1546
1568
; X86-NEXT: retl
0 commit comments