Skip to content

Commit 8568b77

Browse files
committed
[InstCombine] Add tests for folding (op x, ({z,s}ext (icmp eq x, C))); NFC
1 parent 9eeae44 commit 8568b77

File tree

1 file changed

+198
-0
lines changed

1 file changed

+198
-0
lines changed
Lines changed: 198 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,198 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3+
4+
declare void @use.i8(i8)
5+
define i8 @fold_add_zext_eq_0(i8 %x) {
6+
; CHECK-LABEL: @fold_add_zext_eq_0(
7+
; CHECK-NEXT: [[X_EQ:%.*]] = icmp eq i8 [[X:%.*]], 0
8+
; CHECK-NEXT: [[X_EQ_EXT:%.*]] = zext i1 [[X_EQ]] to i8
9+
; CHECK-NEXT: [[R:%.*]] = add i8 [[X_EQ_EXT]], [[X]]
10+
; CHECK-NEXT: ret i8 [[R]]
11+
;
12+
%x_eq = icmp eq i8 %x, 0
13+
%x_eq_ext = zext i1 %x_eq to i8
14+
%r = add i8 %x, %x_eq_ext
15+
ret i8 %r
16+
}
17+
18+
define i8 @fold_add_sext_eq_0(i8 %x) {
19+
; CHECK-LABEL: @fold_add_sext_eq_0(
20+
; CHECK-NEXT: [[X_EQ:%.*]] = icmp eq i8 [[X:%.*]], 0
21+
; CHECK-NEXT: [[X_EQ_EXT:%.*]] = sext i1 [[X_EQ]] to i8
22+
; CHECK-NEXT: [[R:%.*]] = add i8 [[X_EQ_EXT]], [[X]]
23+
; CHECK-NEXT: ret i8 [[R]]
24+
;
25+
%x_eq = icmp eq i8 %x, 0
26+
%x_eq_ext = sext i1 %x_eq to i8
27+
%r = add i8 %x, %x_eq_ext
28+
ret i8 %r
29+
}
30+
31+
define i8 @fold_add_zext_eq_0_fail_multiuse_exp(i8 %x) {
32+
; CHECK-LABEL: @fold_add_zext_eq_0_fail_multiuse_exp(
33+
; CHECK-NEXT: [[X_EQ:%.*]] = icmp eq i8 [[X:%.*]], 0
34+
; CHECK-NEXT: [[X_EQ_EXT:%.*]] = zext i1 [[X_EQ]] to i8
35+
; CHECK-NEXT: [[R:%.*]] = add i8 [[X_EQ_EXT]], [[X]]
36+
; CHECK-NEXT: call void @use.i8(i8 [[X_EQ_EXT]])
37+
; CHECK-NEXT: ret i8 [[R]]
38+
;
39+
%x_eq = icmp eq i8 %x, 0
40+
%x_eq_ext = zext i1 %x_eq to i8
41+
%r = add i8 %x, %x_eq_ext
42+
call void @use.i8(i8 %x_eq_ext)
43+
ret i8 %r
44+
}
45+
46+
define i8 @fold_mul_sext_eq_12(i8 %x) {
47+
; CHECK-LABEL: @fold_mul_sext_eq_12(
48+
; CHECK-NEXT: [[X_EQ:%.*]] = icmp eq i8 [[X:%.*]], 12
49+
; CHECK-NEXT: [[R:%.*]] = select i1 [[X_EQ]], i8 -12, i8 0
50+
; CHECK-NEXT: ret i8 [[R]]
51+
;
52+
%x_eq = icmp eq i8 %x, 12
53+
%x_eq_ext = sext i1 %x_eq to i8
54+
%r = mul i8 %x, %x_eq_ext
55+
ret i8 %r
56+
}
57+
58+
define i8 @fold_mul_sext_eq_12_fail_multiuse(i8 %x) {
59+
; CHECK-LABEL: @fold_mul_sext_eq_12_fail_multiuse(
60+
; CHECK-NEXT: [[X_EQ:%.*]] = icmp eq i8 [[X:%.*]], 12
61+
; CHECK-NEXT: [[X_EQ_EXT:%.*]] = sext i1 [[X_EQ]] to i8
62+
; CHECK-NEXT: [[R:%.*]] = mul i8 [[X_EQ_EXT]], [[X]]
63+
; CHECK-NEXT: call void @use.i8(i8 [[X_EQ_EXT]])
64+
; CHECK-NEXT: ret i8 [[R]]
65+
;
66+
%x_eq = icmp eq i8 %x, 12
67+
%x_eq_ext = sext i1 %x_eq to i8
68+
%r = mul i8 %x, %x_eq_ext
69+
call void @use.i8(i8 %x_eq_ext)
70+
ret i8 %r
71+
}
72+
73+
define i8 @fold_shl_zext_eq_3_rhs(i8 %x) {
74+
; CHECK-LABEL: @fold_shl_zext_eq_3_rhs(
75+
; CHECK-NEXT: [[X_EQ:%.*]] = icmp eq i8 [[X:%.*]], 3
76+
; CHECK-NEXT: [[X_EQ_EXT:%.*]] = zext i1 [[X_EQ]] to i8
77+
; CHECK-NEXT: [[R:%.*]] = shl i8 [[X]], [[X_EQ_EXT]]
78+
; CHECK-NEXT: ret i8 [[R]]
79+
;
80+
%x_eq = icmp eq i8 %x, 3
81+
%x_eq_ext = zext i1 %x_eq to i8
82+
%r = shl i8 %x, %x_eq_ext
83+
ret i8 %r
84+
}
85+
86+
define i8 @fold_shl_zext_eq_3_lhs(i8 %x) {
87+
; CHECK-LABEL: @fold_shl_zext_eq_3_lhs(
88+
; CHECK-NEXT: [[X_EQ:%.*]] = icmp eq i8 [[X:%.*]], 3
89+
; CHECK-NEXT: [[X_EQ_EXT:%.*]] = zext i1 [[X_EQ]] to i8
90+
; CHECK-NEXT: [[R:%.*]] = shl nuw i8 [[X_EQ_EXT]], [[X]]
91+
; CHECK-NEXT: ret i8 [[R]]
92+
;
93+
%x_eq = icmp eq i8 %x, 3
94+
%x_eq_ext = zext i1 %x_eq to i8
95+
%r = shl i8 %x_eq_ext, %x
96+
ret i8 %r
97+
}
98+
99+
define <2 x i8> @fold_lshr_sext_eq_15_5_lhs(<2 x i8> %x) {
100+
; CHECK-LABEL: @fold_lshr_sext_eq_15_5_lhs(
101+
; CHECK-NEXT: [[X_EQ:%.*]] = icmp eq <2 x i8> [[X:%.*]], <i8 15, i8 5>
102+
; CHECK-NEXT: [[X_EQ_EXT:%.*]] = sext <2 x i1> [[X_EQ]] to <2 x i8>
103+
; CHECK-NEXT: [[R:%.*]] = lshr <2 x i8> [[X_EQ_EXT]], [[X]]
104+
; CHECK-NEXT: ret <2 x i8> [[R]]
105+
;
106+
%x_eq = icmp eq <2 x i8> %x, <i8 15, i8 5>
107+
%x_eq_ext = sext <2 x i1> %x_eq to <2 x i8>
108+
%r = lshr <2 x i8> %x_eq_ext, %x
109+
ret <2 x i8> %r
110+
}
111+
112+
define <2 x i8> @fold_lshr_sext_eq_15_poison_rhs(<2 x i8> %x) {
113+
; CHECK-LABEL: @fold_lshr_sext_eq_15_poison_rhs(
114+
; CHECK-NEXT: ret <2 x i8> [[X:%.*]]
115+
;
116+
%x_eq = icmp eq <2 x i8> %x, <i8 15, i8 poison>
117+
%x_eq_ext = sext <2 x i1> %x_eq to <2 x i8>
118+
%r = lshr <2 x i8> %x, %x_eq_ext
119+
ret <2 x i8> %r
120+
}
121+
122+
define i8 @fold_umax_zext_eq_9(i8 %x) {
123+
; CHECK-LABEL: @fold_umax_zext_eq_9(
124+
; CHECK-NEXT: [[X_EQ:%.*]] = icmp eq i8 [[X:%.*]], 9
125+
; CHECK-NEXT: [[X_EQ_EXT:%.*]] = sext i1 [[X_EQ]] to i8
126+
; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[X_EQ_EXT]])
127+
; CHECK-NEXT: ret i8 [[R]]
128+
;
129+
%x_eq = icmp eq i8 %x, 9
130+
%x_eq_ext = sext i1 %x_eq to i8
131+
%r = call i8 @llvm.umax.i8(i8 %x, i8 %x_eq_ext)
132+
ret i8 %r
133+
}
134+
135+
define i8 @fold_sshl_sat_sext_eq_3_rhs(i8 %x) {
136+
; CHECK-LABEL: @fold_sshl_sat_sext_eq_3_rhs(
137+
; CHECK-NEXT: [[X_EQ:%.*]] = icmp eq i8 [[X:%.*]], 3
138+
; CHECK-NEXT: [[X_EQ_EXT:%.*]] = sext i1 [[X_EQ]] to i8
139+
; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.sshl.sat.i8(i8 [[X]], i8 [[X_EQ_EXT]])
140+
; CHECK-NEXT: ret i8 [[R]]
141+
;
142+
%x_eq = icmp eq i8 %x, 3
143+
%x_eq_ext = sext i1 %x_eq to i8
144+
%r = call i8 @llvm.sshl.sat.i8(i8 %x, i8 %x_eq_ext)
145+
ret i8 %r
146+
}
147+
148+
define i8 @fold_ushl_sat_zext_eq_3_lhs(i8 %x) {
149+
; CHECK-LABEL: @fold_ushl_sat_zext_eq_3_lhs(
150+
; CHECK-NEXT: [[X_EQ:%.*]] = icmp eq i8 [[X:%.*]], 3
151+
; CHECK-NEXT: [[X_EQ_EXT:%.*]] = zext i1 [[X_EQ]] to i8
152+
; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.ushl.sat.i8(i8 [[X_EQ_EXT]], i8 [[X]])
153+
; CHECK-NEXT: ret i8 [[R]]
154+
;
155+
%x_eq = icmp eq i8 %x, 3
156+
%x_eq_ext = zext i1 %x_eq to i8
157+
%r = call i8 @llvm.ushl.sat.i8(i8 %x_eq_ext, i8 %x)
158+
ret i8 %r
159+
}
160+
161+
define i8 @fold_uadd_sat_zext_eq_3_rhs(i8 %x) {
162+
; CHECK-LABEL: @fold_uadd_sat_zext_eq_3_rhs(
163+
; CHECK-NEXT: [[X_EQ:%.*]] = icmp eq i8 [[X:%.*]], 3
164+
; CHECK-NEXT: [[X_EQ_EXT:%.*]] = zext i1 [[X_EQ]] to i8
165+
; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.uadd.sat.i8(i8 [[X]], i8 [[X_EQ_EXT]])
166+
; CHECK-NEXT: ret i8 [[R]]
167+
;
168+
%x_eq = icmp eq i8 %x, 3
169+
%x_eq_ext = zext i1 %x_eq to i8
170+
%r = call i8 @llvm.uadd.sat.i8(i8 %x, i8 %x_eq_ext)
171+
ret i8 %r
172+
}
173+
174+
define i8 @fold_ssub_sat_sext_eq_99_lhs_fail(i8 %x) {
175+
; CHECK-LABEL: @fold_ssub_sat_sext_eq_99_lhs_fail(
176+
; CHECK-NEXT: [[X_EQ:%.*]] = icmp eq i8 [[X:%.*]], 99
177+
; CHECK-NEXT: [[X_EQ_EXT:%.*]] = sext i1 [[X_EQ]] to i8
178+
; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[X_EQ_EXT]], i8 [[X]])
179+
; CHECK-NEXT: ret i8 [[R]]
180+
;
181+
%x_eq = icmp eq i8 %x, 99
182+
%x_eq_ext = sext i1 %x_eq to i8
183+
%r = call i8 @llvm.ssub.sat.i8(i8 %x_eq_ext, i8 %x)
184+
ret i8 %r
185+
}
186+
187+
define i8 @fold_ssub_sat_zext_eq_99_rhs(i8 %x) {
188+
; CHECK-LABEL: @fold_ssub_sat_zext_eq_99_rhs(
189+
; CHECK-NEXT: [[X_EQ:%.*]] = icmp eq i8 [[X:%.*]], 99
190+
; CHECK-NEXT: [[X_EQ_EXT:%.*]] = zext i1 [[X_EQ]] to i8
191+
; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[X]], i8 [[X_EQ_EXT]])
192+
; CHECK-NEXT: ret i8 [[R]]
193+
;
194+
%x_eq = icmp eq i8 %x, 99
195+
%x_eq_ext = zext i1 %x_eq to i8
196+
%r = call i8 @llvm.ssub.sat.i8(i8 %x, i8 %x_eq_ext)
197+
ret i8 %r
198+
}

0 commit comments

Comments
 (0)