@@ -1202,7 +1202,6 @@ define <2 x i1> @cmp_excludes_zero_with_nonsplat_vec_wpoison(<2 x i8> %a, <2 x i
12021202 ret <2 x i1 > %r
12031203}
12041204
1205-
12061205define <2 x i1 > @cmp_excludes_zero_with_nonsplat_vec_fail (<2 x i8 > %a , <2 x i8 > %b ) {
12071206; CHECK-LABEL: @cmp_excludes_zero_with_nonsplat_vec_fail(
12081207; 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) {
13141313
13151314define i1 @neg_range_attr (i8 range(i8 -1 , 1 ) %x , i8 %y ) {
13161315; 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
13191318; CHECK-NEXT: ret i1 [[CMP]]
13201319;
13211320 %or = or i8 %y , %x
@@ -1328,7 +1327,7 @@ declare range(i8 -1, 1) i8 @returns_contain_zero_range_helper()
13281327
13291328define i1 @range_return (i8 %y ) {
13301329; 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()
13321331; CHECK-NEXT: ret i1 false
13331332;
13341333 %x = call i8 @returns_non_zero_range_helper ()
@@ -1339,8 +1338,8 @@ define i1 @range_return(i8 %y) {
13391338
13401339define i1 @neg_range_return (i8 %y ) {
13411340; 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 ]]
13441343; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[OR]], 0
13451344; CHECK-NEXT: ret i1 [[CMP]]
13461345;
@@ -1354,7 +1353,7 @@ declare i8 @returns_i8_helper()
13541353
13551354define i1 @range_call (i8 %y ) {
13561355; 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()
13581357; CHECK-NEXT: ret i1 false
13591358;
13601359 %x = call range(i8 1 , 0 ) i8 @returns_i8_helper ()
@@ -1365,8 +1364,8 @@ define i1 @range_call(i8 %y) {
13651364
13661365define i1 @neg_range_call (i8 %y ) {
13671366; 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 ]]
13701369; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[OR]], 0
13711370; CHECK-NEXT: ret i1 [[CMP]]
13721371;
@@ -1401,7 +1400,7 @@ declare range(i8 -1, 1) <2 x i8> @returns_contain_zero_range_helper_vec()
14011400
14021401define <2 x i1 > @range_return_vec (<2 x i8 > %y ) {
14031402; 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()
14051404; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true>
14061405;
14071406 %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) {
14121411
14131412define <2 x i1 > @neg_range_return_vec (<2 x i8 > %y ) {
14141413; 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 ]]
14171416; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i8> [[OR]], zeroinitializer
14181417; CHECK-NEXT: ret <2 x i1> [[CMP]]
14191418;
@@ -1427,7 +1426,7 @@ declare <2 x i8> @returns_i8_helper_vec()
14271426
14281427define <2 x i1 > @range_call_vec (<2 x i8 > %y ) {
14291428; 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()
14311430; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true>
14321431;
14331432 %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) {
14381437
14391438define <2 x i1 > @neg_range_call_vec (<2 x i8 > %y ) {
14401439; 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 ]]
14431442; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i8> [[OR]], zeroinitializer
14441443; CHECK-NEXT: ret <2 x i1> [[CMP]]
14451444;
@@ -1449,5 +1448,58 @@ define <2 x i1> @neg_range_call_vec(<2 x i8> %y) {
14491448 ret <2 x i1 > %cmp
14501449}
14511450
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+ }
14521504
14531505declare i32 @llvm.experimental.get.vector.length.i32 (i32 , i32 , i1 )
0 commit comments