@@ -1202,7 +1202,6 @@ define <2 x i1> @cmp_excludes_zero_with_nonsplat_vec_wpoison(<2 x i8> %a, <2 x i
1202
1202
ret <2 x i1 > %r
1203
1203
}
1204
1204
1205
-
1206
1205
define <2 x i1 > @cmp_excludes_zero_with_nonsplat_vec_fail (<2 x i8 > %a , <2 x i8 > %b ) {
1207
1206
; CHECK-LABEL: @cmp_excludes_zero_with_nonsplat_vec_fail(
1208
1207
; CHECK-NEXT: [[C:%.*]] = icmp sge <2 x i8> [[A:%.*]], <i8 0, i8 4>
@@ -1314,8 +1313,8 @@ define i1 @range_attr(i8 range(i8 1, 0) %x, i8 %y) {
1314
1313
1315
1314
define i1 @neg_range_attr (i8 range(i8 -1 , 1 ) %x , i8 %y ) {
1316
1315
; CHECK-LABEL: @neg_range_attr(
1317
- ; CHECK-NEXT: [[I :%.*]] = or i8 [[Y:%.*]], [[X:%.*]]
1318
- ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[I ]], 0
1316
+ ; CHECK-NEXT: [[OR :%.*]] = or i8 [[Y:%.*]], [[X:%.*]]
1317
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[OR ]], 0
1319
1318
; CHECK-NEXT: ret i1 [[CMP]]
1320
1319
;
1321
1320
%or = or i8 %y , %x
@@ -1328,7 +1327,7 @@ declare range(i8 -1, 1) i8 @returns_contain_zero_range_helper()
1328
1327
1329
1328
define i1 @range_return (i8 %y ) {
1330
1329
; CHECK-LABEL: @range_return(
1331
- ; CHECK-NEXT: [[I :%.*]] = call i8 @returns_non_zero_range_helper()
1330
+ ; CHECK-NEXT: [[X :%.*]] = call i8 @returns_non_zero_range_helper()
1332
1331
; CHECK-NEXT: ret i1 false
1333
1332
;
1334
1333
%x = call i8 @returns_non_zero_range_helper ()
@@ -1339,8 +1338,8 @@ define i1 @range_return(i8 %y) {
1339
1338
1340
1339
define i1 @neg_range_return (i8 %y ) {
1341
1340
; CHECK-LABEL: @neg_range_return(
1342
- ; CHECK-NEXT: [[I :%.*]] = call i8 @returns_contain_zero_range_helper()
1343
- ; CHECK-NEXT: [[OR:%.*]] = or i8 [[Y:%.*]], [[I ]]
1341
+ ; CHECK-NEXT: [[X :%.*]] = call i8 @returns_contain_zero_range_helper()
1342
+ ; CHECK-NEXT: [[OR:%.*]] = or i8 [[Y:%.*]], [[X ]]
1344
1343
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[OR]], 0
1345
1344
; CHECK-NEXT: ret i1 [[CMP]]
1346
1345
;
@@ -1354,7 +1353,7 @@ declare i8 @returns_i8_helper()
1354
1353
1355
1354
define i1 @range_call (i8 %y ) {
1356
1355
; CHECK-LABEL: @range_call(
1357
- ; CHECK-NEXT: [[I :%.*]] = call range(i8 1, 0) i8 @returns_i8_helper()
1356
+ ; CHECK-NEXT: [[X :%.*]] = call range(i8 1, 0) i8 @returns_i8_helper()
1358
1357
; CHECK-NEXT: ret i1 false
1359
1358
;
1360
1359
%x = call range(i8 1 , 0 ) i8 @returns_i8_helper ()
@@ -1365,8 +1364,8 @@ define i1 @range_call(i8 %y) {
1365
1364
1366
1365
define i1 @neg_range_call (i8 %y ) {
1367
1366
; CHECK-LABEL: @neg_range_call(
1368
- ; CHECK-NEXT: [[I :%.*]] = call range(i8 -1, 1) i8 @returns_i8_helper()
1369
- ; CHECK-NEXT: [[OR:%.*]] = or i8 [[Y:%.*]], [[I ]]
1367
+ ; CHECK-NEXT: [[X :%.*]] = call range(i8 -1, 1) i8 @returns_i8_helper()
1368
+ ; CHECK-NEXT: [[OR:%.*]] = or i8 [[Y:%.*]], [[X ]]
1370
1369
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[OR]], 0
1371
1370
; CHECK-NEXT: ret i1 [[CMP]]
1372
1371
;
@@ -1401,7 +1400,7 @@ declare range(i8 -1, 1) <2 x i8> @returns_contain_zero_range_helper_vec()
1401
1400
1402
1401
define <2 x i1 > @range_return_vec (<2 x i8 > %y ) {
1403
1402
; CHECK-LABEL: @range_return_vec(
1404
- ; CHECK-NEXT: [[I :%.*]] = call <2 x i8> @returns_non_zero_range_helper_vec()
1403
+ ; CHECK-NEXT: [[X :%.*]] = call <2 x i8> @returns_non_zero_range_helper_vec()
1405
1404
; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true>
1406
1405
;
1407
1406
%x = call <2 x i8 > @returns_non_zero_range_helper_vec ()
@@ -1412,8 +1411,8 @@ define <2 x i1> @range_return_vec(<2 x i8> %y) {
1412
1411
1413
1412
define <2 x i1 > @neg_range_return_vec (<2 x i8 > %y ) {
1414
1413
; CHECK-LABEL: @neg_range_return_vec(
1415
- ; CHECK-NEXT: [[I :%.*]] = call <2 x i8> @returns_contain_zero_range_helper_vec()
1416
- ; CHECK-NEXT: [[OR:%.*]] = or <2 x i8> [[Y:%.*]], [[I ]]
1414
+ ; CHECK-NEXT: [[X :%.*]] = call <2 x i8> @returns_contain_zero_range_helper_vec()
1415
+ ; CHECK-NEXT: [[OR:%.*]] = or <2 x i8> [[Y:%.*]], [[X ]]
1417
1416
; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i8> [[OR]], zeroinitializer
1418
1417
; CHECK-NEXT: ret <2 x i1> [[CMP]]
1419
1418
;
@@ -1427,7 +1426,7 @@ declare <2 x i8> @returns_i8_helper_vec()
1427
1426
1428
1427
define <2 x i1 > @range_call_vec (<2 x i8 > %y ) {
1429
1428
; CHECK-LABEL: @range_call_vec(
1430
- ; CHECK-NEXT: [[I :%.*]] = call range(i8 1, 0) <2 x i8> @returns_i8_helper_vec()
1429
+ ; CHECK-NEXT: [[X :%.*]] = call range(i8 1, 0) <2 x i8> @returns_i8_helper_vec()
1431
1430
; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true>
1432
1431
;
1433
1432
%x = call range(i8 1 , 0 ) <2 x i8 > @returns_i8_helper_vec ()
@@ -1438,8 +1437,8 @@ define <2 x i1> @range_call_vec(<2 x i8> %y) {
1438
1437
1439
1438
define <2 x i1 > @neg_range_call_vec (<2 x i8 > %y ) {
1440
1439
; CHECK-LABEL: @neg_range_call_vec(
1441
- ; CHECK-NEXT: [[I :%.*]] = call range(i8 -1, 1) <2 x i8> @returns_i8_helper_vec()
1442
- ; CHECK-NEXT: [[OR:%.*]] = or <2 x i8> [[Y:%.*]], [[I ]]
1440
+ ; CHECK-NEXT: [[X :%.*]] = call range(i8 -1, 1) <2 x i8> @returns_i8_helper_vec()
1441
+ ; CHECK-NEXT: [[OR:%.*]] = or <2 x i8> [[Y:%.*]], [[X ]]
1443
1442
; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i8> [[OR]], zeroinitializer
1444
1443
; CHECK-NEXT: ret <2 x i1> [[CMP]]
1445
1444
;
@@ -1449,5 +1448,58 @@ define <2 x i1> @neg_range_call_vec(<2 x i8> %y) {
1449
1448
ret <2 x i1 > %cmp
1450
1449
}
1451
1450
1451
+ define i1 @trunc_nsw_non_zero (i8 %x ) {
1452
+ ; CHECK-LABEL: @trunc_nsw_non_zero(
1453
+ ; CHECK-NEXT: [[X_NE_Z:%.*]] = icmp ne i8 [[X:%.*]], 0
1454
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[X_NE_Z]])
1455
+ ; CHECK-NEXT: [[V:%.*]] = trunc nsw i8 [[X]] to i4
1456
+ ; CHECK-NEXT: [[R:%.*]] = icmp ne i4 [[V]], 0
1457
+ ; CHECK-NEXT: ret i1 [[R]]
1458
+ ;
1459
+ %x_ne_z = icmp ne i8 %x , 0
1460
+ call void @llvm.assume (i1 %x_ne_z )
1461
+ %v = trunc nsw i8 %x to i4
1462
+ %r = icmp ne i4 %v , 0
1463
+ ret i1 %r
1464
+ }
1465
+
1466
+ define i1 @trunc_nuw_non_zero (i8 %xx ) {
1467
+ ; CHECK-LABEL: @trunc_nuw_non_zero(
1468
+ ; CHECK-NEXT: [[X:%.*]] = add nuw i8 [[XX:%.*]], 1
1469
+ ; CHECK-NEXT: [[V:%.*]] = trunc nuw i8 [[X]] to i4
1470
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i4 [[V]], 0
1471
+ ; CHECK-NEXT: ret i1 [[R]]
1472
+ ;
1473
+ %x = add nuw i8 %xx , 1
1474
+ %v = trunc nuw i8 %x to i4
1475
+ %r = icmp eq i4 %v , 0
1476
+ ret i1 %r
1477
+ }
1478
+
1479
+ define i1 @trunc_non_zero_fail (i8 %x ) {
1480
+ ; CHECK-LABEL: @trunc_non_zero_fail(
1481
+ ; CHECK-NEXT: [[X_NE_Z:%.*]] = icmp ne i8 [[X:%.*]], 0
1482
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[X_NE_Z]])
1483
+ ; CHECK-NEXT: [[R:%.*]] = trunc i8 [[X]] to i1
1484
+ ; CHECK-NEXT: ret i1 [[R]]
1485
+ ;
1486
+ %x_ne_z = icmp ne i8 %x , 0
1487
+ call void @llvm.assume (i1 %x_ne_z )
1488
+ %r = trunc i8 %x to i1
1489
+ ret i1 %r
1490
+ }
1491
+
1492
+ define i1 @trunc_nsw_nuw_non_zero_fail (i8 %xx ) {
1493
+ ; CHECK-LABEL: @trunc_nsw_nuw_non_zero_fail(
1494
+ ; CHECK-NEXT: [[X:%.*]] = add nsw i8 [[XX:%.*]], 1
1495
+ ; CHECK-NEXT: [[V:%.*]] = trunc nuw nsw i8 [[X]] to i4
1496
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i4 [[V]], 0
1497
+ ; CHECK-NEXT: ret i1 [[R]]
1498
+ ;
1499
+ %x = add nsw i8 %xx , 1
1500
+ %v = trunc nsw nuw i8 %x to i4
1501
+ %r = icmp eq i4 %v , 0
1502
+ ret i1 %r
1503
+ }
1452
1504
1453
1505
declare i32 @llvm.experimental.get.vector.length.i32 (i32 , i32 , i1 )
0 commit comments