Skip to content

Commit 9b090d5

Browse files
committed
[InstCombine] Add pre-commit test for select of symmetric selects fold
1 parent 434c238 commit 9b090d5

File tree

1 file changed

+96
-0
lines changed

1 file changed

+96
-0
lines changed
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3+
4+
define i32 @select_of_symmetric_selects(i32 %a, i32 %b, i1 %c1, i1 %c2) {
5+
; CHECK-LABEL: @select_of_symmetric_selects(
6+
; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[C1:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]
7+
; CHECK-NEXT: [[SEL2:%.*]] = select i1 [[C1]], i32 [[B]], i32 [[A]]
8+
; CHECK-NEXT: [[RET:%.*]] = select i1 [[C2:%.*]], i32 [[SEL1]], i32 [[SEL2]]
9+
; CHECK-NEXT: ret i32 [[RET]]
10+
;
11+
%sel1 = select i1 %c1, i32 %a, i32 %b
12+
%sel2 = select i1 %c1, i32 %b, i32 %a
13+
%ret = select i1 %c2, i32 %sel1, i32 %sel2
14+
ret i32 %ret
15+
}
16+
17+
define i32 @select_of_symmetric_selects_negative1(i32 %a, i32 %b, i1 %c1, i1 %c2) {
18+
; CHECK-LABEL: @select_of_symmetric_selects_negative1(
19+
; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[C1:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]
20+
; CHECK-NEXT: [[RET:%.*]] = select i1 [[C2:%.*]], i32 [[SEL1]], i32 [[A]]
21+
; CHECK-NEXT: ret i32 [[RET]]
22+
;
23+
%sel1 = select i1 %c1, i32 %a, i32 %b
24+
%sel2 = select i1 %c2, i32 %b, i32 %a
25+
%ret = select i1 %c2, i32 %sel1, i32 %sel2
26+
ret i32 %ret
27+
}
28+
29+
define i32 @select_of_symmetric_selects_negative2(i32 %a, i32 %b, i32 %c, i1 %c1, i1 %c2) {
30+
; CHECK-LABEL: @select_of_symmetric_selects_negative2(
31+
; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[C1:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]
32+
; CHECK-NEXT: [[SEL2:%.*]] = select i1 [[C1]], i32 [[B]], i32 [[C:%.*]]
33+
; CHECK-NEXT: [[RET:%.*]] = select i1 [[C2:%.*]], i32 [[SEL1]], i32 [[SEL2]]
34+
; CHECK-NEXT: ret i32 [[RET]]
35+
;
36+
%sel1 = select i1 %c1, i32 %a, i32 %b
37+
%sel2 = select i1 %c1, i32 %b, i32 %c
38+
%ret = select i1 %c2, i32 %sel1, i32 %sel2
39+
ret i32 %ret
40+
}
41+
42+
declare void @use(i32)
43+
44+
define i32 @select_of_symmetric_selects_multi_use(i32 %a, i32 %b, i1 %c1, i1 %c2) {
45+
; CHECK-LABEL: @select_of_symmetric_selects_multi_use(
46+
; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[C1:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]
47+
; CHECK-NEXT: [[SEL2:%.*]] = select i1 [[C1]], i32 [[B]], i32 [[A]]
48+
; CHECK-NEXT: call void @use(i32 [[SEL2]])
49+
; CHECK-NEXT: [[RET:%.*]] = select i1 [[C2:%.*]], i32 [[SEL1]], i32 [[SEL2]]
50+
; CHECK-NEXT: ret i32 [[RET]]
51+
;
52+
%sel1 = select i1 %c1, i32 %a, i32 %b
53+
%sel2 = select i1 %c1, i32 %b, i32 %a
54+
call void @use(i32 %sel2)
55+
%ret = select i1 %c2, i32 %sel1, i32 %sel2
56+
ret i32 %ret
57+
}
58+
59+
define i32 @select_of_symmetric_selects_commuted(i32 %a, i32 %b, i1 %c1, i1 %c2) {
60+
; CHECK-LABEL: @select_of_symmetric_selects_commuted(
61+
; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[C1:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]
62+
; CHECK-NEXT: [[SEL2:%.*]] = select i1 [[C1]], i32 [[B]], i32 [[A]]
63+
; CHECK-NEXT: [[RET:%.*]] = select i1 [[C2:%.*]], i32 [[SEL2]], i32 [[SEL1]]
64+
; CHECK-NEXT: ret i32 [[RET]]
65+
;
66+
%sel1 = select i1 %c1, i32 %a, i32 %b
67+
%sel2 = select i1 %c1, i32 %b, i32 %a
68+
%ret = select i1 %c2, i32 %sel2, i32 %sel1
69+
ret i32 %ret
70+
}
71+
72+
define <4 x i32> @select_of_symmetric_selects_vector1(<4 x i32> %a, <4 x i32> %b, i1 %c1, i1 %c2) {
73+
; CHECK-LABEL: @select_of_symmetric_selects_vector1(
74+
; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[C1:%.*]], <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]]
75+
; CHECK-NEXT: [[SEL2:%.*]] = select i1 [[C1]], <4 x i32> [[B]], <4 x i32> [[A]]
76+
; CHECK-NEXT: [[RET:%.*]] = select i1 [[C2:%.*]], <4 x i32> [[SEL2]], <4 x i32> [[SEL1]]
77+
; CHECK-NEXT: ret <4 x i32> [[RET]]
78+
;
79+
%sel1 = select i1 %c1, <4 x i32> %a, <4 x i32> %b
80+
%sel2 = select i1 %c1, <4 x i32> %b, <4 x i32> %a
81+
%ret = select i1 %c2, <4 x i32> %sel2, <4 x i32> %sel1
82+
ret <4 x i32> %ret
83+
}
84+
85+
define <4 x i32> @select_of_symmetric_selects_vector2(<4 x i32> %a, <4 x i32> %b, <4 x i1> %c1, <4 x i1> %c2) {
86+
; CHECK-LABEL: @select_of_symmetric_selects_vector2(
87+
; CHECK-NEXT: [[SEL1:%.*]] = select <4 x i1> [[C1:%.*]], <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]]
88+
; CHECK-NEXT: [[SEL2:%.*]] = select <4 x i1> [[C1]], <4 x i32> [[B]], <4 x i32> [[A]]
89+
; CHECK-NEXT: [[RET:%.*]] = select <4 x i1> [[C2:%.*]], <4 x i32> [[SEL2]], <4 x i32> [[SEL1]]
90+
; CHECK-NEXT: ret <4 x i32> [[RET]]
91+
;
92+
%sel1 = select <4 x i1> %c1, <4 x i32> %a, <4 x i32> %b
93+
%sel2 = select <4 x i1> %c1, <4 x i32> %b, <4 x i32> %a
94+
%ret = select <4 x i1> %c2, <4 x i32> %sel2, <4 x i32> %sel1
95+
ret <4 x i32> %ret
96+
}

0 commit comments

Comments
 (0)