Skip to content

Commit b675d68

Browse files
committed
[ValueTracking] Add tests for isKnowNonZero of trunc nuw/nsw; NFC
1 parent 92631a4 commit b675d68

File tree

1 file changed

+67
-15
lines changed

1 file changed

+67
-15
lines changed

llvm/test/Analysis/ValueTracking/known-non-zero.ll

Lines changed: 67 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
12061205
define <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

13151314
define 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

13291328
define 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

13401339
define 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

13551354
define 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

13661365
define 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

14021401
define <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

14131412
define <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

14281427
define <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

14391438
define <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

14531505
declare i32 @llvm.experimental.get.vector.length.i32(i32, i32, i1)

0 commit comments

Comments
 (0)