xref: /llvm-project/llvm/test/Analysis/ValueTracking/phi-known-nonzero.ll (revision 39e9862e6b9f3134911813782663462fc29f8ff3)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=instsimplify < %s -S | FileCheck %s
3
4define i1 @phi_ugt_non_zero(i8 %x) {
5; CHECK-LABEL: @phi_ugt_non_zero(
6; CHECK-NEXT:  entry:
7; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], 32
8; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
9; CHECK:       T:
10; CHECK-NEXT:    ret i1 false
11; CHECK:       F:
12; CHECK-NEXT:    br label [[T]]
13;
14entry:
15  %cmp = icmp ugt i8 %x, 32
16  br i1 %cmp, label %T, label %F
17T:
18  %v = phi i8 [ %x, %entry], [-1, %F]
19  %r = icmp eq i8 %v, 0
20  ret i1 %r
21F:
22  br label %T
23}
24
25define i1 @phi_uge_non_zero(i8 %x) {
26; CHECK-LABEL: @phi_uge_non_zero(
27; CHECK-NEXT:  entry:
28; CHECK-NEXT:    [[CMP:%.*]] = icmp uge i8 [[X:%.*]], 32
29; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
30; CHECK:       T:
31; CHECK-NEXT:    ret i1 false
32; CHECK:       F:
33; CHECK-NEXT:    br label [[T]]
34;
35entry:
36  %cmp = icmp uge i8 %x, 32
37  br i1 %cmp, label %T, label %F
38T:
39  %v = phi i8 [ %x, %entry], [-1, %F]
40  %r = icmp eq i8 %v, 0
41  ret i1 %r
42F:
43  br label %T
44}
45
46define i1 @phi_ugt_non_zero_fail(i8 %x) {
47; CHECK-LABEL: @phi_ugt_non_zero_fail(
48; CHECK-NEXT:  entry:
49; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], 32
50; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
51; CHECK:       T:
52; CHECK-NEXT:    [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ 0, [[F]] ]
53; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[V]], 0
54; CHECK-NEXT:    ret i1 [[R]]
55; CHECK:       F:
56; CHECK-NEXT:    br label [[T]]
57;
58entry:
59  %cmp = icmp ugt i8 %x, 32
60  br i1 %cmp, label %T, label %F
61T:
62  %v = phi i8 [ %x, %entry], [0, %F]
63  %r = icmp eq i8 %v, 0
64  ret i1 %r
65F:
66  br label %T
67}
68
69define i1 @phi_ult_non_zero(i8 %x) {
70; CHECK-LABEL: @phi_ult_non_zero(
71; CHECK-NEXT:  entry:
72; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i8 [[X:%.*]], 123
73; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
74; CHECK:       T:
75; CHECK-NEXT:    br label [[F]]
76; CHECK:       F:
77; CHECK-NEXT:    ret i1 false
78;
79entry:
80  %cmp = icmp ult i8 %x, 123
81  br i1 %cmp, label %T, label %F
82T:
83  br label %F
84F:
85  %v = phi i8 [ %x, %entry], [-1, %T]
86  %r = icmp eq i8 %v, 0
87  ret i1 %r
88}
89
90define i1 @phi_ule_non_zero(i8 %x) {
91; CHECK-LABEL: @phi_ule_non_zero(
92; CHECK-NEXT:  entry:
93; CHECK-NEXT:    [[CMP:%.*]] = icmp ule i8 [[X:%.*]], 123
94; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
95; CHECK:       T:
96; CHECK-NEXT:    br label [[F]]
97; CHECK:       F:
98; CHECK-NEXT:    ret i1 false
99;
100entry:
101  %cmp = icmp ule i8 %x, 123
102  br i1 %cmp, label %T, label %F
103T:
104  br label %F
105F:
106  %v = phi i8 [ %x, %entry], [-1, %T]
107  %r = icmp eq i8 %v, 0
108  ret i1 %r
109}
110
111define i1 @phi_ule_non_zero_fail_wrong_succ(i8 %x) {
112; CHECK-LABEL: @phi_ule_non_zero_fail_wrong_succ(
113; CHECK-NEXT:  entry:
114; CHECK-NEXT:    [[CMP:%.*]] = icmp ule i8 [[X:%.*]], 123
115; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
116; CHECK:       T:
117; CHECK-NEXT:    [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[F]] ]
118; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[V]], 0
119; CHECK-NEXT:    ret i1 [[R]]
120; CHECK:       F:
121; CHECK-NEXT:    br label [[T]]
122;
123entry:
124  %cmp = icmp ule i8 %x, 123
125  br i1 %cmp, label %T, label %F
126T:
127  %v = phi i8 [ %x, %entry], [-1, %F]
128  %r = icmp eq i8 %v, 0
129  ret i1 %r
130F:
131  br label %T
132}
133
134define i1 @phi_ult_non_zero_fail(i8 %x) {
135; CHECK-LABEL: @phi_ult_non_zero_fail(
136; CHECK-NEXT:  entry:
137; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i8 [[X:%.*]], 123
138; CHECK-NEXT:    [[X2:%.*]] = add i8 [[X]], [[X]]
139; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
140; CHECK:       T:
141; CHECK-NEXT:    br label [[F]]
142; CHECK:       F:
143; CHECK-NEXT:    [[V:%.*]] = phi i8 [ [[X2]], [[ENTRY:%.*]] ], [ -1, [[T]] ]
144; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[V]], 0
145; CHECK-NEXT:    ret i1 [[R]]
146;
147entry:
148  %cmp = icmp ult i8 %x, 123
149  %x2 = add i8 %x, %x
150  br i1 %cmp, label %T, label %F
151T:
152  br label %F
153F:
154  %v = phi i8 [ %x2, %entry], [-1, %T]
155  %r = icmp eq i8 %v, 0
156  ret i1 %r
157}
158
159define i1 @phi_ne_non_zero(i8 %x) {
160; CHECK-LABEL: @phi_ne_non_zero(
161; CHECK-NEXT:  entry:
162; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i8 [[X:%.*]], 0
163; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
164; CHECK:       T:
165; CHECK-NEXT:    ret i1 false
166; CHECK:       F:
167; CHECK-NEXT:    br label [[T]]
168;
169entry:
170  %cmp = icmp ne i8 %x, 0
171  br i1 %cmp, label %T, label %F
172T:
173  %v = phi i8 [ %x, %entry], [-1, %F]
174  %r = icmp eq i8 %v, 0
175  ret i1 %r
176F:
177  br label %T
178}
179
180define i1 @phi_eq_non_zero(i8 %x) {
181; CHECK-LABEL: @phi_eq_non_zero(
182; CHECK-NEXT:  entry:
183; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i8 [[X:%.*]], 44
184; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
185; CHECK:       T:
186; CHECK-NEXT:    ret i1 false
187; CHECK:       F:
188; CHECK-NEXT:    br label [[T]]
189;
190entry:
191  %cmp = icmp eq i8 %x, 44
192  br i1 %cmp, label %T, label %F
193T:
194  %v = phi i8 [ %x, %entry], [-1, %F]
195  %r = icmp eq i8 %v, 0
196  ret i1 %r
197F:
198  br label %T
199}
200
201define i1 @phi_eq_non_zero2(i8 %x) {
202; CHECK-LABEL: @phi_eq_non_zero2(
203; CHECK-NEXT:  entry:
204; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i8 [[X:%.*]], 0
205; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
206; CHECK:       T:
207; CHECK-NEXT:    br label [[F]]
208; CHECK:       F:
209; CHECK-NEXT:    ret i1 false
210;
211entry:
212  %cmp = icmp eq i8 %x, 0
213  br i1 %cmp, label %T, label %F
214T:
215  br label %F
216F:
217  %v = phi i8 [ %x, %entry], [-1, %T]
218  %r = icmp eq i8 %v, 0
219  ret i1 %r
220}
221
222define i1 @phi_sgt_non_zero(i8 %x) {
223; CHECK-LABEL: @phi_sgt_non_zero(
224; CHECK-NEXT:  entry:
225; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], 1
226; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
227; CHECK:       T:
228; CHECK-NEXT:    ret i1 false
229; CHECK:       F:
230; CHECK-NEXT:    br label [[T]]
231;
232entry:
233  %cmp = icmp sgt i8 %x, 1
234  br i1 %cmp, label %T, label %F
235T:
236  %v = phi i8 [ %x, %entry], [-1, %F]
237  %r = icmp eq i8 %v, 0
238  ret i1 %r
239F:
240  br label %T
241}
242
243define i1 @phi_sgt_non_zero_fail(i8 %x) {
244; CHECK-LABEL: @phi_sgt_non_zero_fail(
245; CHECK-NEXT:  entry:
246; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], -1
247; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
248; CHECK:       T:
249; CHECK-NEXT:    [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[F]] ]
250; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[V]], 0
251; CHECK-NEXT:    ret i1 [[R]]
252; CHECK:       F:
253; CHECK-NEXT:    br label [[T]]
254;
255entry:
256  %cmp = icmp sgt i8 %x, -1
257  br i1 %cmp, label %T, label %F
258T:
259  %v = phi i8 [ %x, %entry], [-1, %F]
260  %r = icmp eq i8 %v, 0
261  ret i1 %r
262F:
263  br label %T
264}
265