Skip to content

Commit c9fd7ac

Browse files
[InstCombine] Introduce tests for D153963
Introduce test cases for folding binops of `select` and cast of the `select` condition. Differential Revision: https://reviews.llvm.org/D155510
1 parent 057fc8e commit c9fd7ac

File tree

1 file changed

+240
-0
lines changed

1 file changed

+240
-0
lines changed
Lines changed: 240 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,240 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
2+
; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3+
4+
define i64 @add_select_zext(i1 %c) {
5+
; CHECK-LABEL: define i64 @add_select_zext
6+
; CHECK-SAME: (i1 [[C:%.*]]) {
7+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 64, i64 1
8+
; CHECK-NEXT: [[EXT:%.*]] = zext i1 [[C]] to i64
9+
; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i64 [[SEL]], [[EXT]]
10+
; CHECK-NEXT: ret i64 [[ADD]]
11+
;
12+
%sel = select i1 %c, i64 64, i64 1
13+
%ext = zext i1 %c to i64
14+
%add = add i64 %sel, %ext
15+
ret i64 %add
16+
}
17+
18+
define i64 @add_select_sext(i1 %c) {
19+
; CHECK-LABEL: define i64 @add_select_sext
20+
; CHECK-SAME: (i1 [[C:%.*]]) {
21+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 64, i64 1
22+
; CHECK-NEXT: [[EXT:%.*]] = sext i1 [[C]] to i64
23+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SEL]], [[EXT]]
24+
; CHECK-NEXT: ret i64 [[ADD]]
25+
;
26+
%sel = select i1 %c, i64 64, i64 1
27+
%ext = sext i1 %c to i64
28+
%add = add i64 %sel, %ext
29+
ret i64 %add
30+
}
31+
32+
define i64 @add_select_not_zext(i1 %c) {
33+
; CHECK-LABEL: define i64 @add_select_not_zext
34+
; CHECK-SAME: (i1 [[C:%.*]]) {
35+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 64, i64 1
36+
; CHECK-NEXT: [[NOT_C:%.*]] = xor i1 [[C]], true
37+
; CHECK-NEXT: [[EXT:%.*]] = zext i1 [[NOT_C]] to i64
38+
; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i64 [[SEL]], [[EXT]]
39+
; CHECK-NEXT: ret i64 [[ADD]]
40+
;
41+
%sel = select i1 %c, i64 64, i64 1
42+
%not.c = xor i1 %c, true
43+
%ext = zext i1 %not.c to i64
44+
%add = add i64 %sel, %ext
45+
ret i64 %add
46+
}
47+
48+
define i64 @add_select_not_sext(i1 %c) {
49+
; CHECK-LABEL: define i64 @add_select_not_sext
50+
; CHECK-SAME: (i1 [[C:%.*]]) {
51+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 64, i64 1
52+
; CHECK-NEXT: [[NOT_C:%.*]] = xor i1 [[C]], true
53+
; CHECK-NEXT: [[EXT:%.*]] = sext i1 [[NOT_C]] to i64
54+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SEL]], [[EXT]]
55+
; CHECK-NEXT: ret i64 [[ADD]]
56+
;
57+
%sel = select i1 %c, i64 64, i64 1
58+
%not.c = xor i1 %c, true
59+
%ext = sext i1 %not.c to i64
60+
%add = add i64 %sel, %ext
61+
ret i64 %add
62+
}
63+
64+
define i64 @sub_select_sext(i1 %c, i64 %arg) {
65+
; CHECK-LABEL: define i64 @sub_select_sext
66+
; CHECK-SAME: (i1 [[C:%.*]], i64 [[ARG:%.*]]) {
67+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 64, i64 [[ARG]]
68+
; CHECK-NEXT: [[EXT_NEG:%.*]] = zext i1 [[C]] to i64
69+
; CHECK-NEXT: [[SUB:%.*]] = add i64 [[SEL]], [[EXT_NEG]]
70+
; CHECK-NEXT: ret i64 [[SUB]]
71+
;
72+
%sel = select i1 %c, i64 64, i64 %arg
73+
%ext = sext i1 %c to i64
74+
%sub = sub i64 %sel, %ext
75+
ret i64 %sub
76+
}
77+
78+
define i64 @sub_select_not_zext(i1 %c, i64 %arg) {
79+
; CHECK-LABEL: define i64 @sub_select_not_zext
80+
; CHECK-SAME: (i1 [[C:%.*]], i64 [[ARG:%.*]]) {
81+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 [[ARG]], i64 64
82+
; CHECK-NEXT: [[NOT_C:%.*]] = xor i1 [[C]], true
83+
; CHECK-NEXT: [[EXT_NEG:%.*]] = sext i1 [[NOT_C]] to i64
84+
; CHECK-NEXT: [[SUB:%.*]] = add i64 [[SEL]], [[EXT_NEG]]
85+
; CHECK-NEXT: ret i64 [[SUB]]
86+
;
87+
%sel = select i1 %c, i64 %arg, i64 64
88+
%not.c = xor i1 %c, true
89+
%ext = zext i1 %not.c to i64
90+
%sub = sub i64 %sel, %ext
91+
ret i64 %sub
92+
}
93+
94+
define i64 @sub_select_not_sext(i1 %c, i64 %arg) {
95+
; CHECK-LABEL: define i64 @sub_select_not_sext
96+
; CHECK-SAME: (i1 [[C:%.*]], i64 [[ARG:%.*]]) {
97+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 [[ARG]], i64 64
98+
; CHECK-NEXT: [[NOT_C:%.*]] = xor i1 [[C]], true
99+
; CHECK-NEXT: [[EXT_NEG:%.*]] = zext i1 [[NOT_C]] to i64
100+
; CHECK-NEXT: [[SUB:%.*]] = add i64 [[SEL]], [[EXT_NEG]]
101+
; CHECK-NEXT: ret i64 [[SUB]]
102+
;
103+
%sel = select i1 %c, i64 %arg, i64 64
104+
%not.c = xor i1 %c, true
105+
%ext = sext i1 %not.c to i64
106+
%sub = sub i64 %sel, %ext
107+
ret i64 %sub
108+
}
109+
110+
define i64 @mul_select_zext(i1 %c, i64 %arg) {
111+
; CHECK-LABEL: define i64 @mul_select_zext
112+
; CHECK-SAME: (i1 [[C:%.*]], i64 [[ARG:%.*]]) {
113+
; CHECK-NEXT: [[MUL:%.*]] = select i1 [[C]], i64 [[ARG]], i64 0
114+
; CHECK-NEXT: ret i64 [[MUL]]
115+
;
116+
%sel = select i1 %c, i64 %arg, i64 1
117+
%ext = zext i1 %c to i64
118+
%mul = mul i64 %sel, %ext
119+
ret i64 %mul
120+
}
121+
122+
define i64 @mul_select_sext(i1 %c) {
123+
; CHECK-LABEL: define i64 @mul_select_sext
124+
; CHECK-SAME: (i1 [[C:%.*]]) {
125+
; CHECK-NEXT: [[EXT:%.*]] = sext i1 [[C]] to i64
126+
; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[C]], i64 6, i64 0
127+
; CHECK-NEXT: [[MUL:%.*]] = shl i64 [[EXT]], [[TMP1]]
128+
; CHECK-NEXT: ret i64 [[MUL]]
129+
;
130+
%sel = select i1 %c, i64 64, i64 1
131+
%ext = sext i1 %c to i64
132+
%mul = mul i64 %sel, %ext
133+
ret i64 %mul
134+
}
135+
136+
define i64 @select_zext_different_condition(i1 %c, i1 %d) {
137+
; CHECK-LABEL: define i64 @select_zext_different_condition
138+
; CHECK-SAME: (i1 [[C:%.*]], i1 [[D:%.*]]) {
139+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 64, i64 1
140+
; CHECK-NEXT: [[EXT:%.*]] = zext i1 [[D]] to i64
141+
; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i64 [[SEL]], [[EXT]]
142+
; CHECK-NEXT: ret i64 [[ADD]]
143+
;
144+
%sel = select i1 %c, i64 64, i64 1
145+
%ext = zext i1 %d to i64
146+
%add = add i64 %sel, %ext
147+
ret i64 %add
148+
}
149+
150+
define <2 x i64> @vector_test(i1 %c) {
151+
; CHECK-LABEL: define <2 x i64> @vector_test
152+
; CHECK-SAME: (i1 [[C:%.*]]) {
153+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], <2 x i64> <i64 64, i64 64>, <2 x i64> <i64 1, i64 1>
154+
; CHECK-NEXT: [[EXT:%.*]] = zext i1 [[C]] to i64
155+
; CHECK-NEXT: [[VEC0:%.*]] = insertelement <2 x i64> undef, i64 [[EXT]], i64 0
156+
; CHECK-NEXT: [[VEC1:%.*]] = shufflevector <2 x i64> [[VEC0]], <2 x i64> poison, <2 x i32> zeroinitializer
157+
; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw <2 x i64> [[SEL]], [[VEC1]]
158+
; CHECK-NEXT: ret <2 x i64> [[ADD]]
159+
;
160+
%sel = select i1 %c, <2 x i64> <i64 64, i64 64>, <2 x i64> <i64 1, i64 1>
161+
%ext = zext i1 %c to i64
162+
%vec0 = insertelement <2 x i64> undef, i64 %ext, i32 0
163+
%vec1 = insertelement <2 x i64> %vec0, i64 %ext, i32 1
164+
%add = add <2 x i64> %sel, %vec1
165+
ret <2 x i64> %add
166+
}
167+
168+
define i64 @multiuse_add(i1 %c) {
169+
; CHECK-LABEL: define i64 @multiuse_add
170+
; CHECK-SAME: (i1 [[C:%.*]]) {
171+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 64, i64 1
172+
; CHECK-NEXT: [[EXT:%.*]] = zext i1 [[C]] to i64
173+
; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i64 [[SEL]], [[EXT]]
174+
; CHECK-NEXT: [[ADD2:%.*]] = add nuw nsw i64 [[ADD]], 1
175+
; CHECK-NEXT: ret i64 [[ADD2]]
176+
;
177+
%sel = select i1 %c, i64 64, i64 1
178+
%ext = zext i1 %c to i64
179+
%add = add i64 %sel, %ext
180+
%add2 = add i64 %add, 1
181+
ret i64 %add2
182+
}
183+
184+
define i64 @multiuse_select(i1 %c) {
185+
; CHECK-LABEL: define i64 @multiuse_select
186+
; CHECK-SAME: (i1 [[C:%.*]]) {
187+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 64, i64 0
188+
; CHECK-NEXT: [[EXT_NEG:%.*]] = sext i1 [[C]] to i64
189+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SEL]], [[EXT_NEG]]
190+
; CHECK-NEXT: [[MUL:%.*]] = mul nsw i64 [[SEL]], [[ADD]]
191+
; CHECK-NEXT: ret i64 [[MUL]]
192+
;
193+
%sel = select i1 %c, i64 64, i64 0
194+
%ext = zext i1 %c to i64
195+
%add = sub i64 %sel, %ext
196+
%mul = mul i64 %sel, %add
197+
ret i64 %mul
198+
}
199+
200+
define i64 @select_non_const_sides(i1 %c, i64 %arg1, i64 %arg2) {
201+
; CHECK-LABEL: define i64 @select_non_const_sides
202+
; CHECK-SAME: (i1 [[C:%.*]], i64 [[ARG1:%.*]], i64 [[ARG2:%.*]]) {
203+
; CHECK-NEXT: [[EXT_NEG:%.*]] = sext i1 [[C]] to i64
204+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 [[ARG1]], i64 [[ARG2]]
205+
; CHECK-NEXT: [[SUB:%.*]] = add i64 [[SEL]], [[EXT_NEG]]
206+
; CHECK-NEXT: ret i64 [[SUB]]
207+
;
208+
%ext = zext i1 %c to i64
209+
%sel = select i1 %c, i64 %arg1, i64 %arg2
210+
%sub = sub i64 %sel, %ext
211+
ret i64 %sub
212+
}
213+
214+
define i6 @sub_select_sext_op_swapped_non_const_args(i1 %c, i6 %argT, i6 %argF) {
215+
; CHECK-LABEL: define i6 @sub_select_sext_op_swapped_non_const_args
216+
; CHECK-SAME: (i1 [[C:%.*]], i6 [[ARGT:%.*]], i6 [[ARGF:%.*]]) {
217+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i6 [[ARGT]], i6 [[ARGF]]
218+
; CHECK-NEXT: [[EXT:%.*]] = sext i1 [[C]] to i6
219+
; CHECK-NEXT: [[SUB:%.*]] = sub i6 [[EXT]], [[SEL]]
220+
; CHECK-NEXT: ret i6 [[SUB]]
221+
;
222+
%sel = select i1 %c, i6 %argT, i6 %argF
223+
%ext = sext i1 %c to i6
224+
%sub = sub i6 %ext, %sel
225+
ret i6 %sub
226+
}
227+
228+
define i6 @sub_select_zext_op_swapped_non_const_args(i1 %c, i6 %argT, i6 %argF) {
229+
; CHECK-LABEL: define i6 @sub_select_zext_op_swapped_non_const_args
230+
; CHECK-SAME: (i1 [[C:%.*]], i6 [[ARGT:%.*]], i6 [[ARGF:%.*]]) {
231+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i6 [[ARGT]], i6 [[ARGF]]
232+
; CHECK-NEXT: [[EXT:%.*]] = zext i1 [[C]] to i6
233+
; CHECK-NEXT: [[SUB:%.*]] = sub i6 [[EXT]], [[SEL]]
234+
; CHECK-NEXT: ret i6 [[SUB]]
235+
;
236+
%sel = select i1 %c, i6 %argT, i6 %argF
237+
%ext = zext i1 %c to i6
238+
%sub = sub i6 %ext, %sel
239+
ret i6 %sub
240+
}

0 commit comments

Comments
 (0)