Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Analysis / ValueTracking / phi-known-nonzero.ll
blobd80d1704c73d1de50912932545398c17d60cc7b2
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -passes=instsimplify < %s -S | FileCheck %s
4 define 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]]
14 entry:
15   %cmp = icmp ugt i8 %x, 32
16   br i1 %cmp, label %T, label %F
18   %v = phi i8 [ %x, %entry], [-1, %F]
19   %r = icmp eq i8 %v, 0
20   ret i1 %r
22   br label %T
25 define 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]]
35 entry:
36   %cmp = icmp uge i8 %x, 32
37   br i1 %cmp, label %T, label %F
39   %v = phi i8 [ %x, %entry], [-1, %F]
40   %r = icmp eq i8 %v, 0
41   ret i1 %r
43   br label %T
46 define 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]]
58 entry:
59   %cmp = icmp ugt i8 %x, 32
60   br i1 %cmp, label %T, label %F
62   %v = phi i8 [ %x, %entry], [0, %F]
63   %r = icmp eq i8 %v, 0
64   ret i1 %r
66   br label %T
69 define 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
79 entry:
80   %cmp = icmp ult i8 %x, 123
81   br i1 %cmp, label %T, label %F
83   br label %F
85   %v = phi i8 [ %x, %entry], [-1, %T]
86   %r = icmp eq i8 %v, 0
87   ret i1 %r
90 define 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
100 entry:
101   %cmp = icmp ule i8 %x, 123
102   br i1 %cmp, label %T, label %F
104   br label %F
106   %v = phi i8 [ %x, %entry], [-1, %T]
107   %r = icmp eq i8 %v, 0
108   ret i1 %r
111 define 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]]
123 entry:
124   %cmp = icmp ule i8 %x, 123
125   br i1 %cmp, label %T, label %F
127   %v = phi i8 [ %x, %entry], [-1, %F]
128   %r = icmp eq i8 %v, 0
129   ret i1 %r
131   br label %T
134 define 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]]
147 entry:
148   %cmp = icmp ult i8 %x, 123
149   %x2 = add i8 %x, %x
150   br i1 %cmp, label %T, label %F
152   br label %F
154   %v = phi i8 [ %x2, %entry], [-1, %T]
155   %r = icmp eq i8 %v, 0
156   ret i1 %r
159 define 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]]
169 entry:
170   %cmp = icmp ne i8 %x, 0
171   br i1 %cmp, label %T, label %F
173   %v = phi i8 [ %x, %entry], [-1, %F]
174   %r = icmp eq i8 %v, 0
175   ret i1 %r
177   br label %T
180 define 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]]
190 entry:
191   %cmp = icmp eq i8 %x, 44
192   br i1 %cmp, label %T, label %F
194   %v = phi i8 [ %x, %entry], [-1, %F]
195   %r = icmp eq i8 %v, 0
196   ret i1 %r
198   br label %T
201 define 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
211 entry:
212   %cmp = icmp eq i8 %x, 0
213   br i1 %cmp, label %T, label %F
215   br label %F
217   %v = phi i8 [ %x, %entry], [-1, %T]
218   %r = icmp eq i8 %v, 0
219   ret i1 %r
222 define 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]]
232 entry:
233   %cmp = icmp sgt i8 %x, 1
234   br i1 %cmp, label %T, label %F
236   %v = phi i8 [ %x, %entry], [-1, %F]
237   %r = icmp eq i8 %v, 0
238   ret i1 %r
240   br label %T
243 define 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]]
255 entry:
256   %cmp = icmp sgt i8 %x, -1
257   br i1 %cmp, label %T, label %F
259   %v = phi i8 [ %x, %entry], [-1, %F]
260   %r = icmp eq i8 %v, 0
261   ret i1 %r
263   br label %T