@@ -1299,3 +1299,131 @@ define i1 @lshr_neg_sgt_zero(i8 %x) {
1299
1299
%r = icmp sgt i8 %s , 0
1300
1300
ret i1 %r
1301
1301
}
1302
+
1303
+ define i1 @exactly_one_set_signbit (i8 %x , i8 %y ) {
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]]
1309
+ ; CHECK-NEXT: ret i1 [[R]]
1310
+ ;
1311
+ %xsign = lshr i8 %x , 7
1312
+ %ypos = icmp sgt i8 %y , -1
1313
+ %yposz = zext i1 %ypos to i8
1314
+ %r = icmp eq i8 %xsign , %yposz
1315
+ ret i1 %r
1316
+ }
1317
+
1318
+ define i1 @exactly_one_set_signbit_use1 (i8 %x , i8 %y ) {
1319
+ ; CHECK-LABEL: @exactly_one_set_signbit_use1(
1320
+ ; CHECK-NEXT: [[XSIGN:%.*]] = lshr i8 [[X:%.*]], 7
1321
+ ; 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]]
1325
+ ; CHECK-NEXT: ret i1 [[R]]
1326
+ ;
1327
+ %xsign = lshr i8 %x , 7
1328
+ call void @use (i8 %xsign )
1329
+ %ypos = icmp sgt i8 %y , -1
1330
+ %yposz = zext i1 %ypos to i8
1331
+ %r = icmp eq i8 %xsign , %yposz
1332
+ ret i1 %r
1333
+ }
1334
+
1335
+ define <2 x i1 > @same_signbit (<2 x i8 > %x , <2 x i8 > %y ) {
1336
+ ; 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 eq <2 x i8> [[XSIGN]], [[YPOSZ]]
1341
+ ; CHECK-NEXT: ret <2 x i1> [[R]]
1342
+ ;
1343
+ %xsign = lshr <2 x i8 > %x , <i8 7 , i8 7 >
1344
+ %ypos = icmp sgt <2 x i8 > %y , <i8 -1 , i8 -1 >
1345
+ %yposz = zext <2 x i1 > %ypos to <2 x i8 >
1346
+ %r = icmp eq <2 x i8 > %xsign , %yposz
1347
+ ret <2 x i1 > %r
1348
+ }
1349
+
1350
+ define i1 @same_signbit_use2 (i8 %x , i8 %y ) {
1351
+ ; CHECK-LABEL: @same_signbit_use2(
1352
+ ; CHECK-NEXT: [[XSIGN:%.*]] = lshr i8 [[X:%.*]], 7
1353
+ ; CHECK-NEXT: [[YPOS:%.*]] = icmp sgt i8 [[Y:%.*]], -1
1354
+ ; CHECK-NEXT: [[YPOSZ:%.*]] = zext i1 [[YPOS]] to i8
1355
+ ; CHECK-NEXT: call void @use(i8 [[YPOSZ]])
1356
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[XSIGN]], [[YPOSZ]]
1357
+ ; CHECK-NEXT: ret i1 [[R]]
1358
+ ;
1359
+ %xsign = lshr i8 %x , 7
1360
+ %ypos = icmp sgt i8 %y , -1
1361
+ %yposz = zext i1 %ypos to i8
1362
+ call void @use (i8 %yposz )
1363
+ %r = icmp eq i8 %xsign , %yposz
1364
+ ret i1 %r
1365
+ }
1366
+
1367
+ define i1 @same_signbit_use3 (i8 %x , i8 %y ) {
1368
+ ; CHECK-LABEL: @same_signbit_use3(
1369
+ ; CHECK-NEXT: [[XSIGN:%.*]] = lshr i8 [[X:%.*]], 7
1370
+ ; CHECK-NEXT: call void @use(i8 [[XSIGN]])
1371
+ ; CHECK-NEXT: [[YPOS:%.*]] = icmp sgt i8 [[Y:%.*]], -1
1372
+ ; CHECK-NEXT: [[YPOSZ:%.*]] = zext i1 [[YPOS]] to i8
1373
+ ; CHECK-NEXT: call void @use(i8 [[YPOSZ]])
1374
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[XSIGN]], [[YPOSZ]]
1375
+ ; CHECK-NEXT: ret i1 [[R]]
1376
+ ;
1377
+ %xsign = lshr i8 %x , 7
1378
+ call void @use (i8 %xsign )
1379
+ %ypos = icmp sgt i8 %y , -1
1380
+ %yposz = zext i1 %ypos to i8
1381
+ call void @use (i8 %yposz )
1382
+ %r = icmp eq i8 %xsign , %yposz
1383
+ ret i1 %r
1384
+ }
1385
+
1386
+ define i1 @exactly_one_set_signbit_wrong_shamt (i8 %x , i8 %y ) {
1387
+ ; CHECK-LABEL: @exactly_one_set_signbit_wrong_shamt(
1388
+ ; CHECK-NEXT: [[XSIGN:%.*]] = lshr i8 [[X:%.*]], 6
1389
+ ; CHECK-NEXT: [[YPOS:%.*]] = icmp sgt i8 [[Y:%.*]], -1
1390
+ ; CHECK-NEXT: [[YPOSZ:%.*]] = zext i1 [[YPOS]] to i8
1391
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[XSIGN]], [[YPOSZ]]
1392
+ ; CHECK-NEXT: ret i1 [[R]]
1393
+ ;
1394
+ %xsign = lshr i8 %x , 6
1395
+ %ypos = icmp sgt i8 %y , -1
1396
+ %yposz = zext i1 %ypos to i8
1397
+ %r = icmp eq i8 %xsign , %yposz
1398
+ ret i1 %r
1399
+ }
1400
+
1401
+ define i1 @exactly_one_set_signbit_wrong_shr (i8 %x , i8 %y ) {
1402
+ ; CHECK-LABEL: @exactly_one_set_signbit_wrong_shr(
1403
+ ; CHECK-NEXT: [[XSIGN:%.*]] = ashr i8 [[X:%.*]], 7
1404
+ ; CHECK-NEXT: [[YPOS:%.*]] = icmp sgt i8 [[Y:%.*]], -1
1405
+ ; CHECK-NEXT: [[YPOSZ:%.*]] = zext i1 [[YPOS]] to i8
1406
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[XSIGN]], [[YPOSZ]]
1407
+ ; CHECK-NEXT: ret i1 [[R]]
1408
+ ;
1409
+ %xsign = ashr i8 %x , 7
1410
+ %ypos = icmp sgt i8 %y , -1
1411
+ %yposz = zext i1 %ypos to i8
1412
+ %r = icmp eq i8 %xsign , %yposz
1413
+ ret i1 %r
1414
+ }
1415
+
1416
+ define i1 @exactly_one_set_signbit_wrong_pred (i8 %x , i8 %y ) {
1417
+ ; CHECK-LABEL: @exactly_one_set_signbit_wrong_pred(
1418
+ ; CHECK-NEXT: [[XSIGN:%.*]] = lshr i8 [[X:%.*]], 7
1419
+ ; CHECK-NEXT: [[YPOS:%.*]] = icmp sgt i8 [[Y:%.*]], -1
1420
+ ; CHECK-NEXT: [[YPOSZ:%.*]] = zext i1 [[YPOS]] to i8
1421
+ ; CHECK-NEXT: [[R:%.*]] = icmp ugt i8 [[XSIGN]], [[YPOSZ]]
1422
+ ; CHECK-NEXT: ret i1 [[R]]
1423
+ ;
1424
+ %xsign = lshr i8 %x , 7
1425
+ %ypos = icmp sgt i8 %y , -1
1426
+ %yposz = zext i1 %ypos to i8
1427
+ %r = icmp sgt i8 %xsign , %yposz
1428
+ ret i1 %r
1429
+ }
0 commit comments