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