Skip to content
This repository was archived by the owner on Apr 23, 2020. It is now read-only.

Commit 15ec533

Browse files
committed
[NFC] Add baseline tests for int isKnownNonZero
Add baseline tests for improvements of isKnownNonZero for integer types. Differential Revision: https://reviews.llvm.org/D60932 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359267 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent f0d90dd commit 15ec533

File tree

2 files changed

+197
-0
lines changed

2 files changed

+197
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -instcombine -S | FileCheck %s
3+
4+
declare i64 @llvm.cttz.i64(i64, i1)
5+
6+
declare i64 @llvm.ctlz.i64(i64, i1)
7+
8+
declare <8 x i64> @llvm.cttz.v8i64(<8 x i64>, i1)
9+
10+
define i32 @test0(i64 %x) {
11+
; CHECK-LABEL: @test0(
12+
; CHECK-NEXT: start:
13+
; CHECK-NEXT: [[C:%.*]] = icmp eq i64 [[X:%.*]], 0
14+
; CHECK-NEXT: br i1 [[C]], label [[EXIT:%.*]], label [[NON_ZERO:%.*]]
15+
; CHECK: non_zero:
16+
; CHECK-NEXT: [[CTZ:%.*]] = call i64 @llvm.cttz.i64(i64 [[X]], i1 false), !range !0
17+
; CHECK-NEXT: [[CTZ32:%.*]] = trunc i64 [[CTZ]] to i32
18+
; CHECK-NEXT: br label [[EXIT]]
19+
; CHECK: exit:
20+
; CHECK-NEXT: [[RES:%.*]] = phi i32 [ [[CTZ32]], [[NON_ZERO]] ], [ 0, [[START:%.*]] ]
21+
; CHECK-NEXT: ret i32 [[RES]]
22+
;
23+
start:
24+
%c = icmp eq i64 %x, 0
25+
br i1 %c, label %exit, label %non_zero
26+
27+
non_zero:
28+
%ctz = call i64 @llvm.cttz.i64(i64 %x, i1 false)
29+
%ctz32 = trunc i64 %ctz to i32
30+
br label %exit
31+
32+
exit:
33+
%res = phi i32 [ %ctz32, %non_zero ], [ 0, %start ]
34+
ret i32 %res
35+
}
36+
37+
define i32 @test1(i64 %x) {
38+
; CHECK-LABEL: @test1(
39+
; CHECK-NEXT: start:
40+
; CHECK-NEXT: [[C:%.*]] = icmp eq i64 [[X:%.*]], 0
41+
; CHECK-NEXT: br i1 [[C]], label [[EXIT:%.*]], label [[NON_ZERO:%.*]]
42+
; CHECK: non_zero:
43+
; CHECK-NEXT: [[CTZ:%.*]] = call i64 @llvm.ctlz.i64(i64 [[X]], i1 false), !range !0
44+
; CHECK-NEXT: [[CTZ32:%.*]] = trunc i64 [[CTZ]] to i32
45+
; CHECK-NEXT: br label [[EXIT]]
46+
; CHECK: exit:
47+
; CHECK-NEXT: [[RES:%.*]] = phi i32 [ [[CTZ32]], [[NON_ZERO]] ], [ 0, [[START:%.*]] ]
48+
; CHECK-NEXT: ret i32 [[RES]]
49+
;
50+
start:
51+
%c = icmp eq i64 %x, 0
52+
br i1 %c, label %exit, label %non_zero
53+
54+
non_zero:
55+
%ctz = call i64 @llvm.ctlz.i64(i64 %x, i1 false)
56+
%ctz32 = trunc i64 %ctz to i32
57+
br label %exit
58+
59+
exit:
60+
%res = phi i32 [ %ctz32, %non_zero ], [ 0, %start ]
61+
ret i32 %res
62+
}
63+
64+
define <8 x i64> @test2(<8 x i64> %x) {
65+
; CHECK-LABEL: @test2(
66+
; CHECK-NEXT: start:
67+
; CHECK-NEXT: [[A:%.*]] = icmp eq <8 x i64> [[X:%.*]], zeroinitializer
68+
; CHECK-NEXT: [[B:%.*]] = bitcast <8 x i1> [[A]] to i8
69+
; CHECK-NEXT: [[C:%.*]] = icmp eq i8 [[B]], 0
70+
; CHECK-NEXT: br i1 [[C]], label [[EXIT:%.*]], label [[NON_ZERO:%.*]]
71+
; CHECK: non_zero:
72+
; CHECK-NEXT: [[CTZ:%.*]] = call <8 x i64> @llvm.cttz.v8i64(<8 x i64> [[X]], i1 false)
73+
; CHECK-NEXT: br label [[EXIT]]
74+
; CHECK: exit:
75+
; CHECK-NEXT: [[RES:%.*]] = phi <8 x i64> [ [[CTZ]], [[NON_ZERO]] ], [ zeroinitializer, [[START:%.*]] ]
76+
; CHECK-NEXT: ret <8 x i64> [[RES]]
77+
;
78+
start:
79+
%a = icmp eq <8 x i64> %x, zeroinitializer
80+
%b = bitcast <8 x i1> %a to i8
81+
%c = icmp eq i8 %b, 0
82+
br i1 %c, label %exit, label %non_zero
83+
84+
non_zero:
85+
; NB: We cannot determine that vectors are known to be zero based
86+
; on the dominating condition
87+
%ctz = call <8 x i64> @llvm.cttz.v8i64(<8 x i64> %x, i1 false)
88+
br label %exit
89+
90+
exit:
91+
%res = phi <8 x i64> [ %ctz, %non_zero ], [ zeroinitializer, %start ]
92+
ret <8 x i64> %res
93+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -instsimplify -S | FileCheck %s
3+
4+
define i64 @test0(i64 %x) {
5+
; CHECK-LABEL: @test0(
6+
; CHECK-NEXT: start:
7+
; CHECK-NEXT: [[A:%.*]] = icmp eq i64 [[X:%.*]], 0
8+
; CHECK-NEXT: br i1 [[A]], label [[EXIT:%.*]], label [[NON_ZERO:%.*]]
9+
; CHECK: non_zero:
10+
; CHECK-NEXT: [[B:%.*]] = icmp eq i64 [[X]], 0
11+
; CHECK-NEXT: br i1 [[B]], label [[UNREACHABLE:%.*]], label [[EXIT]]
12+
; CHECK: unreachable:
13+
; CHECK-NEXT: br label [[EXIT]]
14+
; CHECK: exit:
15+
; CHECK-NEXT: [[C:%.*]] = phi i64 [ 0, [[START:%.*]] ], [ 1, [[NON_ZERO]] ], [ 2, [[UNREACHABLE]] ]
16+
; CHECK-NEXT: ret i64 [[C]]
17+
;
18+
start:
19+
%a = icmp eq i64 %x, 0
20+
br i1 %a, label %exit, label %non_zero
21+
22+
non_zero:
23+
%b = icmp eq i64 %x, 0
24+
br i1 %b, label %unreachable, label %exit
25+
26+
unreachable:
27+
br label %exit
28+
29+
exit:
30+
%c = phi i64 [ 0, %start ], [ 1, %non_zero ], [ 2, %unreachable ]
31+
ret i64 %c
32+
}
33+
34+
define i64 @test1(i64 %x) {
35+
; CHECK-LABEL: @test1(
36+
; CHECK-NEXT: start:
37+
; CHECK-NEXT: [[A:%.*]] = icmp eq i64 [[X:%.*]], 0
38+
; CHECK-NEXT: br i1 [[A]], label [[EXIT:%.*]], label [[NON_ZERO:%.*]]
39+
; CHECK: non_zero:
40+
; CHECK-NEXT: [[B:%.*]] = icmp ugt i64 [[X]], 0
41+
; CHECK-NEXT: br i1 [[B]], label [[EXIT]], label [[UNREACHABLE:%.*]]
42+
; CHECK: unreachable:
43+
; CHECK-NEXT: br label [[EXIT]]
44+
; CHECK: exit:
45+
; CHECK-NEXT: [[C:%.*]] = phi i64 [ 0, [[START:%.*]] ], [ [[X]], [[NON_ZERO]] ], [ 0, [[UNREACHABLE]] ]
46+
; CHECK-NEXT: ret i64 [[C]]
47+
;
48+
start:
49+
%a = icmp eq i64 %x, 0
50+
br i1 %a, label %exit, label %non_zero
51+
52+
non_zero:
53+
%b = icmp ugt i64 %x, 0
54+
br i1 %b, label %exit, label %unreachable
55+
56+
unreachable:
57+
br label %exit
58+
59+
exit:
60+
%c = phi i64 [ 0, %start ], [ %x, %non_zero ], [ 0, %unreachable ]
61+
ret i64 %c
62+
}
63+
64+
define i1 @test2(i64 %x, i1 %y) {
65+
; CHECK-LABEL: @test2(
66+
; CHECK-NEXT: start:
67+
; CHECK-NEXT: [[A:%.*]] = icmp eq i64 [[X:%.*]], 0
68+
; CHECK-NEXT: br i1 [[A]], label [[EXIT:%.*]], label [[NON_ZERO:%.*]]
69+
; CHECK: non_zero:
70+
; CHECK-NEXT: br i1 [[Y:%.*]], label [[ONE:%.*]], label [[TWO:%.*]]
71+
; CHECK: one:
72+
; CHECK-NEXT: br label [[MAINBLOCK:%.*]]
73+
; CHECK: two:
74+
; CHECK-NEXT: br label [[MAINBLOCK]]
75+
; CHECK: mainblock:
76+
; CHECK-NEXT: [[P:%.*]] = phi i64 [ [[X]], [[ONE]] ], [ 42, [[TWO]] ]
77+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[P]], 0
78+
; CHECK-NEXT: br label [[EXIT]]
79+
; CHECK: exit:
80+
; CHECK-NEXT: [[RES:%.*]] = phi i1 [ [[CMP]], [[MAINBLOCK]] ], [ true, [[START:%.*]] ]
81+
; CHECK-NEXT: ret i1 [[RES]]
82+
;
83+
start:
84+
%a = icmp eq i64 %x, 0
85+
br i1 %a, label %exit, label %non_zero
86+
87+
non_zero:
88+
br i1 %y, label %one, label %two
89+
90+
one:
91+
br label %mainblock
92+
93+
two:
94+
br label %mainblock
95+
96+
mainblock:
97+
%p = phi i64 [ %x, %one ], [ 42, %two ]
98+
%cmp = icmp eq i64 %p, 0
99+
br label %exit
100+
101+
exit:
102+
%res = phi i1 [ %cmp, %mainblock ], [ 1, %start ]
103+
ret i1 %res
104+
}

0 commit comments

Comments
 (0)