Skip to content

Commit e1cebe9

Browse files
committed
[InstCombine] add tests for icmp-of-and-of-select-of-constants; NFC
This overlaps with the tests proposed in D134064 and providing coverage for D133919, but it is both limited in scope and more comprehensive because there are many potential ways to transform these kinds of patterns.
1 parent c9986f8 commit e1cebe9

File tree

1 file changed

+149
-2
lines changed

1 file changed

+149
-2
lines changed

llvm/test/Transforms/InstCombine/icmp-select.ll

+149-2
Original file line numberDiff line numberDiff line change
@@ -192,8 +192,8 @@ define i1 @icmp_select_implied_cond_ne(i8 %x, i8 %y) {
192192
define i1 @icmp_select_implied_cond_swapped_select(i8 %x, i8 %y) {
193193
; CHECK-LABEL: @icmp_select_implied_cond_swapped_select(
194194
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X:%.*]], 0
195-
; CHECK-NEXT: [[CMP21:%.*]] = icmp eq i8 [[Y:%.*]], 0
196-
; CHECK-NEXT: [[CMP2:%.*]] = select i1 [[CMP1]], i1 [[CMP21]], i1 false
195+
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i8 [[Y:%.*]], 0
196+
; CHECK-NEXT: [[CMP2:%.*]] = select i1 [[CMP1]], i1 [[TMP1]], i1 false
197197
; CHECK-NEXT: ret i1 [[CMP2]]
198198
;
199199
%cmp1 = icmp eq i8 %x, 0
@@ -259,3 +259,150 @@ define i1 @umin_seq_comparison(i8 %x, i8 %y) {
259259
%cmp2 = icmp eq i8 %sel, %x
260260
ret i1 %cmp2
261261
}
262+
263+
define i1 @select_constants_and_icmp_eq0(i1 %x, i1 %y) {
264+
; CHECK-LABEL: @select_constants_and_icmp_eq0(
265+
; CHECK-NEXT: [[S1:%.*]] = select i1 [[X:%.*]], i8 2, i8 1
266+
; CHECK-NEXT: [[S2:%.*]] = select i1 [[Y:%.*]], i8 2, i8 1
267+
; CHECK-NEXT: [[AND:%.*]] = and i8 [[S1]], [[S2]]
268+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[AND]], 0
269+
; CHECK-NEXT: ret i1 [[CMP]]
270+
;
271+
%s1 = select i1 %x, i8 2, i8 1
272+
%s2 = select i1 %y, i8 2, i8 1
273+
%and = and i8 %s1, %s2
274+
%cmp = icmp eq i8 %and, 0
275+
ret i1 %cmp
276+
}
277+
278+
define i1 @select_constants_and_icmp_eq0_uses(i1 %x, i1 %y) {
279+
; CHECK-LABEL: @select_constants_and_icmp_eq0_uses(
280+
; CHECK-NEXT: [[S1:%.*]] = select i1 [[X:%.*]], i8 2, i8 1
281+
; CHECK-NEXT: call void @use(i8 [[S1]])
282+
; CHECK-NEXT: [[S2:%.*]] = select i1 [[Y:%.*]], i8 2, i8 1
283+
; CHECK-NEXT: call void @use(i8 [[S2]])
284+
; CHECK-NEXT: [[AND:%.*]] = and i8 [[S1]], [[S2]]
285+
; CHECK-NEXT: call void @use(i8 [[AND]])
286+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[AND]], 0
287+
; CHECK-NEXT: ret i1 [[CMP]]
288+
;
289+
%s1 = select i1 %x, i8 2, i8 1
290+
call void @use(i8 %s1)
291+
%s2 = select i1 %y, i8 2, i8 1
292+
call void @use(i8 %s2)
293+
%and = and i8 %s1, %s2
294+
call void @use(i8 %and)
295+
%cmp = icmp eq i8 %and, 0
296+
ret i1 %cmp
297+
}
298+
299+
define <2 x i1> @select_constants_and_icmp_eq0_vec_splat(<2 x i1> %x, <2 x i1> %y) {
300+
; CHECK-LABEL: @select_constants_and_icmp_eq0_vec_splat(
301+
; CHECK-NEXT: [[S1:%.*]] = select <2 x i1> [[X:%.*]], <2 x i9> <i9 3, i9 3>, <2 x i9> <i9 48, i9 48>
302+
; CHECK-NEXT: [[S2:%.*]] = select <2 x i1> [[Y:%.*]], <2 x i9> <i9 3, i9 3>, <2 x i9> <i9 48, i9 48>
303+
; CHECK-NEXT: [[AND:%.*]] = and <2 x i9> [[S1]], [[S2]]
304+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i9> [[AND]], zeroinitializer
305+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
306+
;
307+
%s1 = select <2 x i1> %x, <2 x i9> <i9 3, i9 3>, <2 x i9> <i9 48, i9 48>
308+
%s2 = select <2 x i1> %y, <2 x i9> <i9 3, i9 3>, <2 x i9> <i9 48, i9 48>
309+
%and = and <2 x i9> %s1, %s2
310+
%cmp = icmp eq <2 x i9> %and, zeroinitializer
311+
ret <2 x i1> %cmp
312+
}
313+
314+
define i1 @select_constants_and_icmp_eq0_common_bit(i1 %x, i1 %y) {
315+
; CHECK-LABEL: @select_constants_and_icmp_eq0_common_bit(
316+
; CHECK-NEXT: ret i1 false
317+
;
318+
%s1 = select i1 %x, i8 2, i8 3
319+
%s2 = select i1 %y, i8 2, i8 3
320+
%and = and i8 %s1, %s2
321+
%cmp = icmp eq i8 %and, 0
322+
ret i1 %cmp
323+
}
324+
325+
define i1 @select_constants_and_icmp_eq0_no_common_op1(i1 %x, i1 %y) {
326+
; CHECK-LABEL: @select_constants_and_icmp_eq0_no_common_op1(
327+
; CHECK-NEXT: [[S1:%.*]] = select i1 [[X:%.*]], i8 16, i8 3
328+
; CHECK-NEXT: [[S2:%.*]] = select i1 [[Y:%.*]], i8 24, i8 3
329+
; CHECK-NEXT: [[AND:%.*]] = and i8 [[S1]], [[S2]]
330+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[AND]], 0
331+
; CHECK-NEXT: ret i1 [[CMP]]
332+
;
333+
%s1 = select i1 %x, i8 16, i8 3
334+
%s2 = select i1 %y, i8 24, i8 3
335+
%and = and i8 %s1, %s2
336+
%cmp = icmp eq i8 %and, 0
337+
ret i1 %cmp
338+
}
339+
340+
define i1 @select_constants_and_icmp_eq0_no_common_op2(i1 %x, i1 %y) {
341+
; CHECK-LABEL: @select_constants_and_icmp_eq0_no_common_op2(
342+
; CHECK-NEXT: [[S1:%.*]] = select i1 [[X:%.*]], i8 16, i8 3
343+
; CHECK-NEXT: [[S2:%.*]] = select i1 [[Y:%.*]], i8 16, i8 7
344+
; CHECK-NEXT: [[AND:%.*]] = and i8 [[S1]], [[S2]]
345+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[AND]], 0
346+
; CHECK-NEXT: ret i1 [[CMP]]
347+
;
348+
%s1 = select i1 %x, i8 16, i8 3
349+
%s2 = select i1 %y, i8 16, i8 7
350+
%and = and i8 %s1, %s2
351+
%cmp = icmp eq i8 %and, 0
352+
ret i1 %cmp
353+
}
354+
355+
define i1 @select_constants_and_icmp_eq0_zero_tval(i1 %x, i1 %y) {
356+
; CHECK-LABEL: @select_constants_and_icmp_eq0_zero_tval(
357+
; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[X:%.*]], i1 true, i1 [[Y:%.*]]
358+
; CHECK-NEXT: ret i1 [[TMP1]]
359+
;
360+
%s1 = select i1 %x, i8 0, i8 12
361+
%s2 = select i1 %y, i8 0, i8 12
362+
%and = and i8 %s1, %s2
363+
%cmp = icmp eq i8 %and, 0
364+
ret i1 %cmp
365+
}
366+
367+
define i1 @select_constants_and_icmp_eq0_zero_fval(i1 %x, i1 %y) {
368+
; CHECK-LABEL: @select_constants_and_icmp_eq0_zero_fval(
369+
; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[X:%.*]], i1 [[Y:%.*]], i1 false
370+
; CHECK-NEXT: [[NOT_:%.*]] = xor i1 [[TMP1]], true
371+
; CHECK-NEXT: ret i1 [[NOT_]]
372+
;
373+
%s1 = select i1 %x, i8 12, i8 0
374+
%s2 = select i1 %y, i8 12, i8 0
375+
%and = and i8 %s1, %s2
376+
%cmp = icmp eq i8 %and, 0
377+
ret i1 %cmp
378+
}
379+
380+
define i1 @select_constants_and_icmp_eq_tval(i1 %x, i1 %y) {
381+
; CHECK-LABEL: @select_constants_and_icmp_eq_tval(
382+
; CHECK-NEXT: [[S1:%.*]] = select i1 [[X:%.*]], i8 6, i8 1
383+
; CHECK-NEXT: [[S2:%.*]] = select i1 [[Y:%.*]], i8 6, i8 1
384+
; CHECK-NEXT: [[AND:%.*]] = and i8 [[S1]], [[S2]]
385+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[AND]], 6
386+
; CHECK-NEXT: ret i1 [[CMP]]
387+
;
388+
%s1 = select i1 %x, i8 6, i8 1
389+
%s2 = select i1 %y, i8 6, i8 1
390+
%and = and i8 %s1, %s2
391+
%cmp = icmp eq i8 %and, 6
392+
ret i1 %cmp
393+
}
394+
395+
define i1 @select_constants_and_icmp_eq_fval(i1 %x, i1 %y) {
396+
; CHECK-LABEL: @select_constants_and_icmp_eq_fval(
397+
; CHECK-NEXT: [[S1:%.*]] = select i1 [[X:%.*]], i8 12, i8 3
398+
; CHECK-NEXT: [[S2:%.*]] = select i1 [[Y:%.*]], i8 12, i8 3
399+
; CHECK-NEXT: [[AND:%.*]] = and i8 [[S1]], [[S2]]
400+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[AND]], 3
401+
; CHECK-NEXT: ret i1 [[CMP]]
402+
;
403+
%s1 = select i1 %x, i8 12, i8 3
404+
%s2 = select i1 %y, i8 12, i8 3
405+
%and = and i8 %s1, %s2
406+
%cmp = icmp eq i8 %and, 3
407+
ret i1 %cmp
408+
}

0 commit comments

Comments
 (0)