xref: /llvm-project/llvm/test/Transforms/SCCP/range-and.ll (revision 0f4d9f9b71be8a95cd24534bf914fc9a6fb0ff30)
10db72442SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --verbose
28ebb3eacSBjorn Pettersson; RUN: opt -S -passes=sccp %s | FileCheck %s
3e30c2578SFlorian Hahn
40db72442SFlorian Hahndeclare void @use(i1)
50db72442SFlorian Hahn
60db72442SFlorian Hahndefine void @and_range_limit(i64 %a) {
70db72442SFlorian Hahn; CHECK-LABEL: @and_range_limit(
80db72442SFlorian Hahn; CHECK-NEXT:    [[R:%.*]] = and i64 [[A:%.*]], 255
90db72442SFlorian Hahn; CHECK-NEXT:    [[C_0:%.*]] = icmp slt i64 [[R]], 15
100db72442SFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_0]])
118a36594aSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
120db72442SFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp eq i64 [[R]], 100
130db72442SFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_2]])
148a36594aSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
150db72442SFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp ne i64 [[R]], 100
160db72442SFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_4]])
178a36594aSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
180db72442SFlorian Hahn; CHECK-NEXT:    ret void
190db72442SFlorian Hahn;
200db72442SFlorian Hahn  %r = and i64 %a, 255
210db72442SFlorian Hahn  %c.0 = icmp slt i64 %r, 15
220db72442SFlorian Hahn  call void @use(i1 %c.0)
230db72442SFlorian Hahn  %c.1 = icmp slt i64 %r, 256
240db72442SFlorian Hahn  call void @use(i1 %c.1)
250db72442SFlorian Hahn  %c.2 = icmp eq i64 %r, 100
260db72442SFlorian Hahn  call void @use(i1 %c.2)
270db72442SFlorian Hahn  %c.3 = icmp eq i64 %r, 300
280db72442SFlorian Hahn  call void @use(i1 %c.3)
290db72442SFlorian Hahn  %c.4 = icmp ne i64 %r, 100
300db72442SFlorian Hahn  call void @use(i1 %c.4)
310db72442SFlorian Hahn  %c.5 = icmp ne i64 %r, 300
320db72442SFlorian Hahn  call void @use(i1 %c.5)
330db72442SFlorian Hahn  ret void
340db72442SFlorian Hahn}
350db72442SFlorian Hahn
360db72442SFlorian Hahn; Below are test cases for PR44949.
37e30c2578SFlorian Hahn
38e30c2578SFlorian Hahn; We can remove `%res = and i64 %p, 255`, because %r = 0 and we can eliminate
39e30c2578SFlorian Hahn; %p as well.
40e30c2578SFlorian Hahndefine i64 @constant_and_undef(i1 %c1, i64 %a) {
41e30c2578SFlorian Hahn; CHECK-LABEL: @constant_and_undef(
42e30c2578SFlorian Hahn; CHECK-NEXT:  entry:
43e30c2578SFlorian Hahn; CHECK-NEXT:    br i1 [[C1:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
44e30c2578SFlorian Hahn; CHECK:       bb1:
45e30c2578SFlorian Hahn; CHECK-NEXT:    br label [[BB3:%.*]]
46e30c2578SFlorian Hahn; CHECK:       bb2:
47e30c2578SFlorian Hahn; CHECK-NEXT:    br label [[BB3]]
48e30c2578SFlorian Hahn; CHECK:       bb3:
49e30c2578SFlorian Hahn; CHECK-NEXT:    ret i64 0
50e30c2578SFlorian Hahn;
51e30c2578SFlorian Hahnentry:
52e30c2578SFlorian Hahn  br i1 %c1, label %bb1, label %bb2
53e30c2578SFlorian Hahn
54e30c2578SFlorian Hahnbb1:
55e30c2578SFlorian Hahn  br label %bb3
56e30c2578SFlorian Hahn
57e30c2578SFlorian Hahnbb2:
58e30c2578SFlorian Hahn  %r = and i64 %a, 0
59e30c2578SFlorian Hahn  br label %bb3
60e30c2578SFlorian Hahn
61e30c2578SFlorian Hahnbb3:
62e30c2578SFlorian Hahn  %p = phi i64 [ undef, %bb1 ], [ %r, %bb2 ]
63e30c2578SFlorian Hahn  %res = and i64 %p, 255
64e30c2578SFlorian Hahn  ret i64 %res
65e30c2578SFlorian Hahn}
66e30c2578SFlorian Hahn
67e30c2578SFlorian Hahn; Check that we go to overdefined when merging a constant range with undef. We
68e30c2578SFlorian Hahn; cannot remove '%res = and i64 %p, 255'.
69e30c2578SFlorian Hahndefine i64 @constant_range_and_undef(i1 %cond, i64 %a) {
70e30c2578SFlorian Hahn; CHECK-LABEL: @constant_range_and_undef(
71e30c2578SFlorian Hahn; CHECK-NEXT:  entry:
72e30c2578SFlorian Hahn; CHECK-NEXT:    br i1 [[COND:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
73e30c2578SFlorian Hahn; CHECK:       bb1:
74e30c2578SFlorian Hahn; CHECK-NEXT:    br label [[BB3:%.*]]
75e30c2578SFlorian Hahn; CHECK:       bb2:
76e30c2578SFlorian Hahn; CHECK-NEXT:    [[R:%.*]] = and i64 [[A:%.*]], 255
77e30c2578SFlorian Hahn; CHECK-NEXT:    br label [[BB3]]
78e30c2578SFlorian Hahn; CHECK:       bb3:
79e30c2578SFlorian Hahn; CHECK-NEXT:    [[P:%.*]] = phi i64 [ undef, [[BB1]] ], [ [[R]], [[BB2]] ]
80e30c2578SFlorian Hahn; CHECK-NEXT:    [[RES:%.*]] = and i64 [[P]], 255
81e30c2578SFlorian Hahn; CHECK-NEXT:    ret i64 [[RES]]
82e30c2578SFlorian Hahn;
83e30c2578SFlorian Hahnentry:
84e30c2578SFlorian Hahn  br i1 %cond, label %bb1, label %bb2
85e30c2578SFlorian Hahn
86e30c2578SFlorian Hahnbb1:
87e30c2578SFlorian Hahn  br label %bb3
88e30c2578SFlorian Hahn
89e30c2578SFlorian Hahnbb2:
90e30c2578SFlorian Hahn  %r = and i64 %a, 255
91e30c2578SFlorian Hahn  br label %bb3
92e30c2578SFlorian Hahn
93e30c2578SFlorian Hahnbb3:
94e30c2578SFlorian Hahn  %p = phi i64 [ undef, %bb1 ], [ %r, %bb2 ]
95e30c2578SFlorian Hahn  %res = and i64 %p, 255
96e30c2578SFlorian Hahn  ret i64 %res
97e30c2578SFlorian Hahn}
98e30c2578SFlorian Hahn
99e30c2578SFlorian Hahn; Same as @constant_range_and_undef, with the undef coming from the other
100e30c2578SFlorian Hahn; block.
101e30c2578SFlorian Hahndefine i64 @constant_range_and_undef_switched_incoming(i1 %cond, i64 %a) {
102e30c2578SFlorian Hahn; CHECK-LABEL: @constant_range_and_undef_switched_incoming(
103e30c2578SFlorian Hahn; CHECK-NEXT:  entry:
104e30c2578SFlorian Hahn; CHECK-NEXT:    br i1 [[COND:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
105e30c2578SFlorian Hahn; CHECK:       bb1:
106e30c2578SFlorian Hahn; CHECK-NEXT:    [[R:%.*]] = and i64 [[A:%.*]], 255
107e30c2578SFlorian Hahn; CHECK-NEXT:    br label [[BB3:%.*]]
108e30c2578SFlorian Hahn; CHECK:       bb2:
109e30c2578SFlorian Hahn; CHECK-NEXT:    br label [[BB3]]
110e30c2578SFlorian Hahn; CHECK:       bb3:
111e30c2578SFlorian Hahn; CHECK-NEXT:    [[P:%.*]] = phi i64 [ [[R]], [[BB1]] ], [ undef, [[BB2]] ]
112e30c2578SFlorian Hahn; CHECK-NEXT:    [[RES:%.*]] = and i64 [[P]], 255
113e30c2578SFlorian Hahn; CHECK-NEXT:    ret i64 [[RES]]
114e30c2578SFlorian Hahn;
115e30c2578SFlorian Hahnentry:
116e30c2578SFlorian Hahn  br i1 %cond, label %bb1, label %bb2
117e30c2578SFlorian Hahn
118e30c2578SFlorian Hahnbb1:
119e30c2578SFlorian Hahn  %r = and i64 %a, 255
120e30c2578SFlorian Hahn  br label %bb3
121e30c2578SFlorian Hahn
122e30c2578SFlorian Hahnbb2:
123e30c2578SFlorian Hahn  br label %bb3
124e30c2578SFlorian Hahn
125e30c2578SFlorian Hahnbb3:
126e30c2578SFlorian Hahn  %p = phi i64 [ %r, %bb1 ], [ undef, %bb2 ]
127e30c2578SFlorian Hahn  %res = and i64 %p, 255
128e30c2578SFlorian Hahn  ret i64 %res
129e30c2578SFlorian Hahn}
130e30c2578SFlorian Hahn
131b3754375SFlorian Hahndefine i64 @constant_range_and_255_100(i1 %cond, i64 %a) {
132e30c2578SFlorian Hahn; CHECK-LABEL: @constant_range_and_255_100(
133e30c2578SFlorian Hahn; CHECK-NEXT:  entry:
134e30c2578SFlorian Hahn; CHECK-NEXT:    br i1 [[COND:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
135e30c2578SFlorian Hahn; CHECK:       bb1:
136e30c2578SFlorian Hahn; CHECK-NEXT:    [[R_1:%.*]] = and i64 [[A:%.*]], 100
137e30c2578SFlorian Hahn; CHECK-NEXT:    br label [[BB3:%.*]]
138e30c2578SFlorian Hahn; CHECK:       bb2:
139e30c2578SFlorian Hahn; CHECK-NEXT:    [[R_2:%.*]] = and i64 [[A]], 255
140e30c2578SFlorian Hahn; CHECK-NEXT:    br label [[BB3]]
141e30c2578SFlorian Hahn; CHECK:       bb3:
142e30c2578SFlorian Hahn; CHECK-NEXT:    [[P:%.*]] = phi i64 [ [[R_1]], [[BB1]] ], [ [[R_2]], [[BB2]] ]
143*0f4d9f9bSAlexander Shaposhnikov; CHECK-NEXT:    [[P_AND:%.*]] = and i64 [[P]], 255
144b3754375SFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
145b3754375SFlorian Hahn; CHECK-NEXT:    ret i64 [[P_AND]]
146e30c2578SFlorian Hahn;
147e30c2578SFlorian Hahnentry:
148e30c2578SFlorian Hahn  br i1 %cond, label %bb1, label %bb2
149e30c2578SFlorian Hahn
150e30c2578SFlorian Hahnbb1:
151e30c2578SFlorian Hahn  %r.1 = and i64 %a, 100
152e30c2578SFlorian Hahn  br label %bb3
153e30c2578SFlorian Hahn
154e30c2578SFlorian Hahnbb2:
155e30c2578SFlorian Hahn  %r.2 = and i64 %a, 255
156e30c2578SFlorian Hahn  br label %bb3
157e30c2578SFlorian Hahn
158e30c2578SFlorian Hahnbb3:
159e30c2578SFlorian Hahn  %p = phi i64 [ %r.1, %bb1 ], [ %r.2, %bb2 ]
160*0f4d9f9bSAlexander Shaposhnikov  %p.and = and i64 %p, 255
161e30c2578SFlorian Hahn  %c = icmp ult i64 %p.and, 256
162b3754375SFlorian Hahn  call void @use(i1 %c)
163b3754375SFlorian Hahn  ret i64 %p.and
164e30c2578SFlorian Hahn}
165e30c2578SFlorian Hahn
166e30c2578SFlorian Hahn
167e30c2578SFlorian Hahndefine i64 @constant_range_and_undef2(i1 %c1, i1 %c2, i64 %a) {
168e30c2578SFlorian Hahn; CHECK-LABEL: @constant_range_and_undef2(
169e30c2578SFlorian Hahn; CHECK-NEXT:  entry:
170e30c2578SFlorian Hahn; CHECK-NEXT:    br i1 [[C1:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
171e30c2578SFlorian Hahn; CHECK:       bb1:
172e30c2578SFlorian Hahn; CHECK-NEXT:    [[V1:%.*]] = add i64 undef, undef
173e30c2578SFlorian Hahn; CHECK-NEXT:    br label [[BB3:%.*]]
174e30c2578SFlorian Hahn; CHECK:       bb2:
175e30c2578SFlorian Hahn; CHECK-NEXT:    [[V2:%.*]] = and i64 [[A:%.*]], 255
176e30c2578SFlorian Hahn; CHECK-NEXT:    br label [[BB3]]
177e30c2578SFlorian Hahn; CHECK:       bb3:
178e30c2578SFlorian Hahn; CHECK-NEXT:    [[P:%.*]] = phi i64 [ [[V1]], [[BB1]] ], [ [[V2]], [[BB2]] ]
179e30c2578SFlorian Hahn; CHECK-NEXT:    br i1 [[C2:%.*]], label [[BB4:%.*]], label [[BB5:%.*]]
180e30c2578SFlorian Hahn; CHECK:       bb4:
181e30c2578SFlorian Hahn; CHECK-NEXT:    br label [[BB6:%.*]]
182e30c2578SFlorian Hahn; CHECK:       bb5:
183e30c2578SFlorian Hahn; CHECK-NEXT:    [[V3:%.*]] = and i64 [[A]], 255
184e30c2578SFlorian Hahn; CHECK-NEXT:    br label [[BB6]]
185e30c2578SFlorian Hahn; CHECK:       bb6:
186e30c2578SFlorian Hahn; CHECK-NEXT:    [[P2:%.*]] = phi i64 [ [[P]], [[BB4]] ], [ [[V3]], [[BB5]] ]
187e30c2578SFlorian Hahn; CHECK-NEXT:    [[RES:%.*]] = and i64 [[P2]], 255
188e30c2578SFlorian Hahn; CHECK-NEXT:    ret i64 [[RES]]
189e30c2578SFlorian Hahn;
190e30c2578SFlorian Hahnentry:
191e30c2578SFlorian Hahn  br i1 %c1, label %bb1, label %bb2
192e30c2578SFlorian Hahn
193e30c2578SFlorian Hahnbb1:
194e30c2578SFlorian Hahn  %v1 = add i64 undef, undef
195e30c2578SFlorian Hahn  br label %bb3
196e30c2578SFlorian Hahn
197e30c2578SFlorian Hahnbb2:
198e30c2578SFlorian Hahn  %v2 = and i64 %a, 255
199e30c2578SFlorian Hahn  br label %bb3
200e30c2578SFlorian Hahn
201e30c2578SFlorian Hahnbb3:
202e30c2578SFlorian Hahn  %p = phi i64 [ %v1, %bb1 ], [ %v2, %bb2 ]
203e30c2578SFlorian Hahn  br i1 %c2, label %bb4, label %bb5
204e30c2578SFlorian Hahn
205e30c2578SFlorian Hahnbb4:
206e30c2578SFlorian Hahn  br label %bb6
207e30c2578SFlorian Hahn
208e30c2578SFlorian Hahnbb5:
209e30c2578SFlorian Hahn  %v3 = and i64 %a, 255
210e30c2578SFlorian Hahn  br label %bb6
211e30c2578SFlorian Hahn
212e30c2578SFlorian Hahnbb6:
213e30c2578SFlorian Hahn  %p2 = phi i64 [ %p, %bb4 ], [ %v3, %bb5 ]
214e30c2578SFlorian Hahn  %res = and i64 %p2, 255
215e30c2578SFlorian Hahn  ret i64 %res
216e30c2578SFlorian Hahn}
217e30c2578SFlorian Hahn
218e30c2578SFlorian Hahndefine i1 @constant_range_and_undef_3(i1 %cond, i64 %a) {
219e30c2578SFlorian Hahn; CHECK-LABEL: @constant_range_and_undef_3(
220e30c2578SFlorian Hahn; CHECK-NEXT:  entry:
221e30c2578SFlorian Hahn; CHECK-NEXT:    br i1 [[COND:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
222e30c2578SFlorian Hahn; CHECK:       bb1:
223e30c2578SFlorian Hahn; CHECK-NEXT:    br label [[BB3:%.*]]
224e30c2578SFlorian Hahn; CHECK:       bb2:
225e30c2578SFlorian Hahn; CHECK-NEXT:    [[R:%.*]] = and i64 [[A:%.*]], 255
226e30c2578SFlorian Hahn; CHECK-NEXT:    br label [[BB3]]
227e30c2578SFlorian Hahn; CHECK:       bb3:
228e30c2578SFlorian Hahn; CHECK-NEXT:    [[P:%.*]] = phi i64 [ undef, [[BB1]] ], [ [[R]], [[BB2]] ]
229b3754375SFlorian Hahn; CHECK-NEXT:    ret i1 true
230e30c2578SFlorian Hahn;
231e30c2578SFlorian Hahnentry:
232e30c2578SFlorian Hahn  br i1 %cond, label %bb1, label %bb2
233e30c2578SFlorian Hahn
234e30c2578SFlorian Hahnbb1:
235e30c2578SFlorian Hahn  br label %bb3
236e30c2578SFlorian Hahn
237e30c2578SFlorian Hahnbb2:
238e30c2578SFlorian Hahn  %r = and i64 %a, 255
239e30c2578SFlorian Hahn  br label %bb3
240e30c2578SFlorian Hahn
241e30c2578SFlorian Hahnbb3:
242e30c2578SFlorian Hahn  %p = phi i64 [ undef, %bb1 ], [ %r, %bb2 ]
243e30c2578SFlorian Hahn  %c = icmp ult i64 %p, 256
244e30c2578SFlorian Hahn  ret i1 %c
245e30c2578SFlorian Hahn}
246e30c2578SFlorian Hahn
247e30c2578SFlorian Hahndefine i1 @constant_range_and_undef_3_switched_incoming(i1 %cond, i64 %a) {
248e30c2578SFlorian Hahn; CHECK-LABEL: @constant_range_and_undef_3_switched_incoming(
249e30c2578SFlorian Hahn; CHECK-NEXT:  entry:
250e30c2578SFlorian Hahn; CHECK-NEXT:    br i1 [[COND:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
251e30c2578SFlorian Hahn; CHECK:       bb1:
252e30c2578SFlorian Hahn; CHECK-NEXT:    [[R:%.*]] = and i64 [[A:%.*]], 255
253e30c2578SFlorian Hahn; CHECK-NEXT:    br label [[BB3:%.*]]
254e30c2578SFlorian Hahn; CHECK:       bb2:
255e30c2578SFlorian Hahn; CHECK-NEXT:    br label [[BB3]]
256e30c2578SFlorian Hahn; CHECK:       bb3:
257e30c2578SFlorian Hahn; CHECK-NEXT:    [[P:%.*]] = phi i64 [ [[R]], [[BB1]] ], [ undef, [[BB2]] ]
258b3754375SFlorian Hahn; CHECK-NEXT:    ret i1 true
259e30c2578SFlorian Hahn;
260e30c2578SFlorian Hahnentry:
261e30c2578SFlorian Hahn  br i1 %cond, label %bb1, label %bb2
262e30c2578SFlorian Hahn
263e30c2578SFlorian Hahnbb1:
264e30c2578SFlorian Hahn  %r = and i64 %a, 255
265e30c2578SFlorian Hahn  br label %bb3
266e30c2578SFlorian Hahn
267e30c2578SFlorian Hahnbb2:
268e30c2578SFlorian Hahn  br label %bb3
269e30c2578SFlorian Hahn
270e30c2578SFlorian Hahnbb3:
271e30c2578SFlorian Hahn  %p = phi i64 [ %r, %bb1 ], [ undef, %bb2 ]
272e30c2578SFlorian Hahn  %c = icmp ult i64 %p, 256
273e30c2578SFlorian Hahn  ret i1 %c
274e30c2578SFlorian Hahn}
275e30c2578SFlorian Hahn
276e30c2578SFlorian Hahn; Same as @constant_range_and_undef, but with 3 incoming
277e30c2578SFlorian Hahn; values: undef, a constant and a constant range.
278e30c2578SFlorian Hahndefine i64 @constant_range_and_undef_3_incoming_v1(i1 %c1, i1 %c2, i64 %a) {
279e30c2578SFlorian Hahn; CHECK-LABEL: @constant_range_and_undef_3_incoming_v1(
280e30c2578SFlorian Hahn; CHECK-NEXT:  entry:
281e30c2578SFlorian Hahn; CHECK-NEXT:    br i1 [[C1:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
282e30c2578SFlorian Hahn; CHECK:       bb1:
283e30c2578SFlorian Hahn; CHECK-NEXT:    [[R:%.*]] = and i64 [[A:%.*]], 255
284e30c2578SFlorian Hahn; CHECK-NEXT:    br label [[BB4:%.*]]
285e30c2578SFlorian Hahn; CHECK:       bb2:
286e30c2578SFlorian Hahn; CHECK-NEXT:    br i1 [[C2:%.*]], label [[BB3:%.*]], label [[BB4]]
287e30c2578SFlorian Hahn; CHECK:       bb3:
288e30c2578SFlorian Hahn; CHECK-NEXT:    br label [[BB4]]
289e30c2578SFlorian Hahn; CHECK:       bb4:
290e30c2578SFlorian Hahn; CHECK-NEXT:    [[P:%.*]] = phi i64 [ [[R]], [[BB1]] ], [ 10, [[BB2]] ], [ undef, [[BB3]] ]
291e30c2578SFlorian Hahn; CHECK-NEXT:    [[RES:%.*]] = and i64 [[P]], 255
292e30c2578SFlorian Hahn; CHECK-NEXT:    ret i64 [[RES]]
293e30c2578SFlorian Hahn;
294e30c2578SFlorian Hahnentry:
295e30c2578SFlorian Hahn  br i1 %c1, label %bb1, label %bb2
296e30c2578SFlorian Hahn
297e30c2578SFlorian Hahnbb1:
298e30c2578SFlorian Hahn  %r = and i64 %a, 255
299e30c2578SFlorian Hahn  br label %bb4
300e30c2578SFlorian Hahn
301e30c2578SFlorian Hahnbb2:
302e30c2578SFlorian Hahn  br i1 %c2, label %bb3, label %bb4
303e30c2578SFlorian Hahn
304e30c2578SFlorian Hahnbb3:
305e30c2578SFlorian Hahn  br label %bb4
306e30c2578SFlorian Hahn
307e30c2578SFlorian Hahnbb4:
308e30c2578SFlorian Hahn  %p = phi i64 [ %r, %bb1 ], [ 10, %bb2], [ undef, %bb3 ]
309e30c2578SFlorian Hahn  %res = and i64 %p, 255
310e30c2578SFlorian Hahn  ret i64 %res
311e30c2578SFlorian Hahn}
312e30c2578SFlorian Hahn
313e30c2578SFlorian Hahn; Same as @constant_range_and_undef_3_incoming_v1, but with different order of
314e30c2578SFlorian Hahn; incoming values.
315e30c2578SFlorian Hahndefine i64 @constant_range_and_undef_3_incoming_v2(i1 %c1, i1 %c2, i64 %a) {
316e30c2578SFlorian Hahn; CHECK-LABEL: @constant_range_and_undef_3_incoming_v2(
317e30c2578SFlorian Hahn; CHECK-NEXT:  entry:
318e30c2578SFlorian Hahn; CHECK-NEXT:    br i1 [[C1:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
319e30c2578SFlorian Hahn; CHECK:       bb1:
320e30c2578SFlorian Hahn; CHECK-NEXT:    br label [[BB4:%.*]]
321e30c2578SFlorian Hahn; CHECK:       bb2:
322e30c2578SFlorian Hahn; CHECK-NEXT:    br i1 [[C2:%.*]], label [[BB3:%.*]], label [[BB4]]
323e30c2578SFlorian Hahn; CHECK:       bb3:
324e30c2578SFlorian Hahn; CHECK-NEXT:    [[R:%.*]] = and i64 [[A:%.*]], 255
325e30c2578SFlorian Hahn; CHECK-NEXT:    br label [[BB4]]
326e30c2578SFlorian Hahn; CHECK:       bb4:
327e30c2578SFlorian Hahn; CHECK-NEXT:    [[P:%.*]] = phi i64 [ undef, [[BB1]] ], [ 10, [[BB2]] ], [ [[R]], [[BB3]] ]
328e30c2578SFlorian Hahn; CHECK-NEXT:    [[RES:%.*]] = and i64 [[P]], 255
329e30c2578SFlorian Hahn; CHECK-NEXT:    ret i64 [[RES]]
330e30c2578SFlorian Hahn;
331e30c2578SFlorian Hahnentry:
332e30c2578SFlorian Hahn  br i1 %c1, label %bb1, label %bb2
333e30c2578SFlorian Hahn
334e30c2578SFlorian Hahnbb1:
335e30c2578SFlorian Hahn  br label %bb4
336e30c2578SFlorian Hahn
337e30c2578SFlorian Hahnbb2:
338e30c2578SFlorian Hahn  br i1 %c2, label %bb3, label %bb4
339e30c2578SFlorian Hahn
340e30c2578SFlorian Hahnbb3:
341e30c2578SFlorian Hahn  %r = and i64 %a, 255
342e30c2578SFlorian Hahn  br label %bb4
343e30c2578SFlorian Hahn
344e30c2578SFlorian Hahnbb4:
345e30c2578SFlorian Hahn  %p = phi i64 [ undef, %bb1 ], [ 10, %bb2], [ %r, %bb3 ]
346e30c2578SFlorian Hahn  %res = and i64 %p, 255
347e30c2578SFlorian Hahn  ret i64 %res
348e30c2578SFlorian Hahn}
349e30c2578SFlorian Hahn
350e30c2578SFlorian Hahn; Same as @constant_range_and_undef_3_incoming_v1, but with different order of
351e30c2578SFlorian Hahn; incoming values.
352e30c2578SFlorian Hahndefine i64 @constant_range_and_undef_3_incoming_v3(i1 %c1, i1 %c2, i64 %a) {
353e30c2578SFlorian Hahn; CHECK-LABEL: @constant_range_and_undef_3_incoming_v3(
354e30c2578SFlorian Hahn; CHECK-NEXT:  entry:
355e30c2578SFlorian Hahn; CHECK-NEXT:    br i1 [[C1:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
356e30c2578SFlorian Hahn; CHECK:       bb1:
357e30c2578SFlorian Hahn; CHECK-NEXT:    [[R:%.*]] = and i64 [[A:%.*]], 255
358e30c2578SFlorian Hahn; CHECK-NEXT:    br label [[BB4:%.*]]
359e30c2578SFlorian Hahn; CHECK:       bb2:
360e30c2578SFlorian Hahn; CHECK-NEXT:    br i1 [[C2:%.*]], label [[BB3:%.*]], label [[BB4]]
361e30c2578SFlorian Hahn; CHECK:       bb3:
362e30c2578SFlorian Hahn; CHECK-NEXT:    br label [[BB4]]
363e30c2578SFlorian Hahn; CHECK:       bb4:
364e30c2578SFlorian Hahn; CHECK-NEXT:    [[P:%.*]] = phi i64 [ [[R]], [[BB1]] ], [ undef, [[BB2]] ], [ 10, [[BB3]] ]
365e30c2578SFlorian Hahn; CHECK-NEXT:    [[RES:%.*]] = and i64 [[P]], 255
366e30c2578SFlorian Hahn; CHECK-NEXT:    ret i64 [[RES]]
367e30c2578SFlorian Hahn;
368e30c2578SFlorian Hahnentry:
369e30c2578SFlorian Hahn  br i1 %c1, label %bb1, label %bb2
370e30c2578SFlorian Hahn
371e30c2578SFlorian Hahnbb1:
372e30c2578SFlorian Hahn  %r = and i64 %a, 255
373e30c2578SFlorian Hahn  br label %bb4
374e30c2578SFlorian Hahn
375e30c2578SFlorian Hahnbb2:
376e30c2578SFlorian Hahn  br i1 %c2, label %bb3, label %bb4
377e30c2578SFlorian Hahn
378e30c2578SFlorian Hahnbb3:
379e30c2578SFlorian Hahn  br label %bb4
380e30c2578SFlorian Hahn
381e30c2578SFlorian Hahnbb4:
382e30c2578SFlorian Hahn  %p = phi i64 [ %r, %bb1 ], [ undef, %bb2], [ 10, %bb3 ]
383e30c2578SFlorian Hahn  %res = and i64 %p, 255
384e30c2578SFlorian Hahn  ret i64 %res
385e30c2578SFlorian Hahn}
386e30c2578SFlorian Hahn
387e30c2578SFlorian Hahn
388e30c2578SFlorian Hahndefine i64 @constant_range_and_phi_constant_undef(i1 %c1, i1 %c2, i64 %a) {
389e30c2578SFlorian Hahn; CHECK-LABEL: @constant_range_and_phi_constant_undef(
390e30c2578SFlorian Hahn; CHECK-NEXT:  entry:
391e30c2578SFlorian Hahn; CHECK-NEXT:    br i1 [[C1:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
392e30c2578SFlorian Hahn; CHECK:       bb1:
393e30c2578SFlorian Hahn; CHECK-NEXT:    [[R:%.*]] = and i64 [[A:%.*]], 255
394e30c2578SFlorian Hahn; CHECK-NEXT:    br label [[BB5:%.*]]
395e30c2578SFlorian Hahn; CHECK:       bb2:
396e30c2578SFlorian Hahn; CHECK-NEXT:    br i1 [[C2:%.*]], label [[BB3:%.*]], label [[BB4:%.*]]
397e30c2578SFlorian Hahn; CHECK:       bb3:
398e30c2578SFlorian Hahn; CHECK-NEXT:    br label [[BB4]]
399e30c2578SFlorian Hahn; CHECK:       bb4:
400e30c2578SFlorian Hahn; CHECK-NEXT:    br label [[BB5]]
401e30c2578SFlorian Hahn; CHECK:       bb5:
402e30c2578SFlorian Hahn; CHECK-NEXT:    [[P:%.*]] = phi i64 [ [[R]], [[BB1]] ], [ 10, [[BB4]] ]
403e30c2578SFlorian Hahn; CHECK-NEXT:    [[RES:%.*]] = and i64 [[P]], 255
404e30c2578SFlorian Hahn; CHECK-NEXT:    ret i64 [[RES]]
405e30c2578SFlorian Hahn;
406e30c2578SFlorian Hahnentry:
407e30c2578SFlorian Hahn  br i1 %c1, label %bb1, label %bb2
408e30c2578SFlorian Hahn
409e30c2578SFlorian Hahnbb1:
410e30c2578SFlorian Hahn  %r = and i64 %a, 255
411e30c2578SFlorian Hahn  br label %bb5
412e30c2578SFlorian Hahn
413e30c2578SFlorian Hahnbb2:
414e30c2578SFlorian Hahn  br i1 %c2, label %bb3, label %bb4
415e30c2578SFlorian Hahn
416e30c2578SFlorian Hahnbb3:
417e30c2578SFlorian Hahn  br label %bb4
418e30c2578SFlorian Hahn
419e30c2578SFlorian Hahnbb4:
420e30c2578SFlorian Hahn  %p.1 = phi i64 [ 10, %bb2 ], [ undef, %bb3]
421e30c2578SFlorian Hahn  br label %bb5
422e30c2578SFlorian Hahn
423e30c2578SFlorian Hahnbb5:
424e30c2578SFlorian Hahn  %p = phi i64 [ %r, %bb1 ], [ %p.1, %bb4]
425e30c2578SFlorian Hahn  %res = and i64 %p, 255
426e30c2578SFlorian Hahn  ret i64 %res
427e30c2578SFlorian Hahn}
428