@@ -1302,10 +1302,8 @@ define i1 @lshr_neg_sgt_zero(i8 %x) {
1302
1302
1303
1303
define i1 @exactly_one_set_signbit (i8 %x , i8 %y ) {
1304
1304
; CHECK-LABEL: @exactly_one_set_signbit(
1305
- ; CHECK-NEXT: [[XSIGN:%.*]] = lshr i8 [[X:%.*]], 7
1306
- ; CHECK-NEXT: [[YPOS:%.*]] = icmp sgt i8 [[Y:%.*]], -1
1307
- ; CHECK-NEXT: [[YPOSZ:%.*]] = zext i1 [[YPOS]] to i8
1308
- ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[XSIGN]], [[YPOSZ]]
1305
+ ; CHECK-NEXT: [[XOR_SIGNBITS:%.*]] = xor i8 [[X:%.*]], [[Y:%.*]]
1306
+ ; CHECK-NEXT: [[R:%.*]] = icmp slt i8 [[XOR_SIGNBITS]], 0
1309
1307
; CHECK-NEXT: ret i1 [[R]]
1310
1308
;
1311
1309
%xsign = lshr i8 %x , 7
@@ -1319,9 +1317,8 @@ define i1 @exactly_one_set_signbit_use1(i8 %x, i8 %y) {
1319
1317
; CHECK-LABEL: @exactly_one_set_signbit_use1(
1320
1318
; CHECK-NEXT: [[XSIGN:%.*]] = lshr i8 [[X:%.*]], 7
1321
1319
; CHECK-NEXT: call void @use(i8 [[XSIGN]])
1322
- ; CHECK-NEXT: [[YPOS:%.*]] = icmp sgt i8 [[Y:%.*]], -1
1323
- ; CHECK-NEXT: [[YPOSZ:%.*]] = zext i1 [[YPOS]] to i8
1324
- ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[XSIGN]], [[YPOSZ]]
1320
+ ; CHECK-NEXT: [[XOR_SIGNBITS:%.*]] = xor i8 [[X]], [[Y:%.*]]
1321
+ ; CHECK-NEXT: [[R:%.*]] = icmp slt i8 [[XOR_SIGNBITS]], 0
1325
1322
; CHECK-NEXT: ret i1 [[R]]
1326
1323
;
1327
1324
%xsign = lshr i8 %x , 7
@@ -1334,10 +1331,8 @@ define i1 @exactly_one_set_signbit_use1(i8 %x, i8 %y) {
1334
1331
1335
1332
define <2 x i1 > @same_signbit (<2 x i8 > %x , <2 x i8 > %y ) {
1336
1333
; CHECK-LABEL: @same_signbit(
1337
- ; CHECK-NEXT: [[XSIGN:%.*]] = lshr <2 x i8> [[X:%.*]], <i8 7, i8 7>
1338
- ; CHECK-NEXT: [[YPOS:%.*]] = icmp sgt <2 x i8> [[Y:%.*]], <i8 -1, i8 -1>
1339
- ; CHECK-NEXT: [[YPOSZ:%.*]] = zext <2 x i1> [[YPOS]] to <2 x i8>
1340
- ; CHECK-NEXT: [[R:%.*]] = icmp ne <2 x i8> [[XSIGN]], [[YPOSZ]]
1334
+ ; CHECK-NEXT: [[XOR_SIGNBITS:%.*]] = xor <2 x i8> [[X:%.*]], [[Y:%.*]]
1335
+ ; CHECK-NEXT: [[R:%.*]] = icmp sgt <2 x i8> [[XOR_SIGNBITS]], <i8 -1, i8 -1>
1341
1336
; CHECK-NEXT: ret <2 x i1> [[R]]
1342
1337
;
1343
1338
%xsign = lshr <2 x i8 > %x , <i8 7 , i8 7 >
@@ -1349,11 +1344,11 @@ define <2 x i1> @same_signbit(<2 x i8> %x, <2 x i8> %y) {
1349
1344
1350
1345
define i1 @same_signbit_use2 (i8 %x , i8 %y ) {
1351
1346
; CHECK-LABEL: @same_signbit_use2(
1352
- ; CHECK-NEXT: [[XSIGN:%.*]] = lshr i8 [[X:%.*]], 7
1353
1347
; CHECK-NEXT: [[YPOS:%.*]] = icmp sgt i8 [[Y:%.*]], -1
1354
1348
; CHECK-NEXT: [[YPOSZ:%.*]] = zext i1 [[YPOS]] to i8
1355
1349
; CHECK-NEXT: call void @use(i8 [[YPOSZ]])
1356
- ; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[XSIGN]], [[YPOSZ]]
1350
+ ; CHECK-NEXT: [[XOR_SIGNBITS:%.*]] = xor i8 [[X:%.*]], [[Y]]
1351
+ ; CHECK-NEXT: [[R:%.*]] = icmp sgt i8 [[XOR_SIGNBITS]], -1
1357
1352
; CHECK-NEXT: ret i1 [[R]]
1358
1353
;
1359
1354
%xsign = lshr i8 %x , 7
@@ -1364,6 +1359,8 @@ define i1 @same_signbit_use2(i8 %x, i8 %y) {
1364
1359
ret i1 %r
1365
1360
}
1366
1361
1362
+ ; negative test
1363
+
1367
1364
define i1 @same_signbit_use3 (i8 %x , i8 %y ) {
1368
1365
; CHECK-LABEL: @same_signbit_use3(
1369
1366
; CHECK-NEXT: [[XSIGN:%.*]] = lshr i8 [[X:%.*]], 7
@@ -1385,10 +1382,8 @@ define i1 @same_signbit_use3(i8 %x, i8 %y) {
1385
1382
1386
1383
define <2 x i1 > @same_signbit_poison_elts (<2 x i8 > %x , <2 x i8 > %y ) {
1387
1384
; CHECK-LABEL: @same_signbit_poison_elts(
1388
- ; CHECK-NEXT: [[XSIGN:%.*]] = lshr <2 x i8> [[X:%.*]], <i8 7, i8 poison>
1389
- ; CHECK-NEXT: [[YPOS:%.*]] = icmp sgt <2 x i8> [[Y:%.*]], <i8 -1, i8 poison>
1390
- ; CHECK-NEXT: [[YPOSZ:%.*]] = zext <2 x i1> [[YPOS]] to <2 x i8>
1391
- ; CHECK-NEXT: [[R:%.*]] = icmp ne <2 x i8> [[XSIGN]], [[YPOSZ]]
1385
+ ; CHECK-NEXT: [[XOR_SIGNBITS:%.*]] = xor <2 x i8> [[X:%.*]], [[Y:%.*]]
1386
+ ; CHECK-NEXT: [[R:%.*]] = icmp sgt <2 x i8> [[XOR_SIGNBITS]], <i8 -1, i8 -1>
1392
1387
; CHECK-NEXT: ret <2 x i1> [[R]]
1393
1388
;
1394
1389
%xsign = lshr <2 x i8 > %x , <i8 7 , i8 poison>
@@ -1398,6 +1393,8 @@ define <2 x i1> @same_signbit_poison_elts(<2 x i8> %x, <2 x i8> %y) {
1398
1393
ret <2 x i1 > %r
1399
1394
}
1400
1395
1396
+ ; negative test
1397
+
1401
1398
define i1 @same_signbit_wrong_type (i8 %x , i32 %y ) {
1402
1399
; CHECK-LABEL: @same_signbit_wrong_type(
1403
1400
; CHECK-NEXT: [[XSIGN:%.*]] = lshr i8 [[X:%.*]], 7
@@ -1412,6 +1409,9 @@ define i1 @same_signbit_wrong_type(i8 %x, i32 %y) {
1412
1409
%r = icmp ne i8 %xsign , %yposz
1413
1410
ret i1 %r
1414
1411
}
1412
+
1413
+ ; negative test
1414
+
1415
1415
define i1 @exactly_one_set_signbit_wrong_shamt (i8 %x , i8 %y ) {
1416
1416
; CHECK-LABEL: @exactly_one_set_signbit_wrong_shamt(
1417
1417
; CHECK-NEXT: [[XSIGN:%.*]] = lshr i8 [[X:%.*]], 6
@@ -1427,6 +1427,9 @@ define i1 @exactly_one_set_signbit_wrong_shamt(i8 %x, i8 %y) {
1427
1427
ret i1 %r
1428
1428
}
1429
1429
1430
+ ; negative test
1431
+ ; TODO: This could reduce.
1432
+
1430
1433
define i1 @exactly_one_set_signbit_wrong_shr (i8 %x , i8 %y ) {
1431
1434
; CHECK-LABEL: @exactly_one_set_signbit_wrong_shr(
1432
1435
; CHECK-NEXT: [[XSIGN:%.*]] = ashr i8 [[X:%.*]], 7
@@ -1442,6 +1445,9 @@ define i1 @exactly_one_set_signbit_wrong_shr(i8 %x, i8 %y) {
1442
1445
ret i1 %r
1443
1446
}
1444
1447
1448
+ ; negative test
1449
+ ; TODO: This could reduce.
1450
+
1445
1451
define i1 @exactly_one_set_signbit_wrong_pred (i8 %x , i8 %y ) {
1446
1452
; CHECK-LABEL: @exactly_one_set_signbit_wrong_pred(
1447
1453
; CHECK-NEXT: [[XSIGN:%.*]] = lshr i8 [[X:%.*]], 7
0 commit comments