Skip to content

Commit 7127450

Browse files
Ryan Buchnerbababuck
authored andcommitted
Add tests for cases with (select %x, op(%x), 0) for operations where op(0) == 0
These cases can be optimized to just op(%x).
1 parent 42d2ae1 commit 7127450

File tree

1 file changed

+207
-0
lines changed

1 file changed

+207
-0
lines changed
Lines changed: 207 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,207 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt -S -passes=instcombine < %s | FileCheck %s
3+
4+
; (select (icmp x, 0, eq), 0, (umin x, y)) -> (umin x, y)
5+
define i64 @umin_select(i64 %a, i64 %b) {
6+
; CHECK-LABEL: @umin_select(
7+
; CHECK-NEXT: [[COND:%.*]] = icmp eq i64 [[A:%.*]], 0
8+
; CHECK-NEXT: [[UMIN:%.*]] = call i64 @llvm.umin.i64(i64 [[A]], i64 [[B_FR:%.*]])
9+
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], i64 0, i64 [[UMIN]]
10+
; CHECK-NEXT: ret i64 [[SELECT]]
11+
;
12+
%cond = icmp eq i64 %a, 0
13+
%umin = call i64 @llvm.umin.i64(i64 %a, i64 %b)
14+
%select = select i1 %cond, i64 0, i64 %umin
15+
ret i64 %select
16+
}
17+
18+
; (select (icmp x, 0, eq), 0, (mul x, y)) -> (mul x, y)
19+
define i64 @mul_select(i64 %a, i64 %b) {
20+
; CHECK-LABEL: @mul_select(
21+
; CHECK-NEXT: [[B_FR:%.*]] = freeze i64 [[B:%.*]]
22+
; CHECK-NEXT: [[MUL:%.*]] = mul i64 [[A:%.*]], [[B_FR]]
23+
; CHECK-NEXT: ret i64 [[MUL]]
24+
;
25+
%cond = icmp eq i64 %a, 0
26+
%mul = mul i64 %a, %b
27+
%select = select i1 %cond, i64 0, i64 %mul
28+
ret i64 %select
29+
}
30+
31+
; (select (icmp x, 0, eq), 0, (shl x, y)) -> (shl x, y)
32+
define i64 @shl_select(i64 %a, i64 %b) {
33+
; CHECK-LABEL: @shl_select(
34+
; CHECK-NEXT: [[COND:%.*]] = icmp eq i64 [[A:%.*]], 0
35+
; CHECK-NEXT: [[SHL:%.*]] = shl i64 [[A]], [[B_FR:%.*]]
36+
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], i64 0, i64 [[SHL]]
37+
; CHECK-NEXT: ret i64 [[SELECT]]
38+
;
39+
%cond = icmp eq i64 %a, 0
40+
%shl = shl i64 %a, %b
41+
%select = select i1 %cond, i64 0, i64 %shl
42+
ret i64 %select
43+
}
44+
45+
; (select (icmp x, 0, eq), 0, (and x, y)) -> (and x, y)
46+
define i64 @and_select(i64 %a, i64 %b) {
47+
; CHECK-LABEL: @and_select(
48+
; CHECK-NEXT: [[COND:%.*]] = icmp eq i64 [[A:%.*]], 0
49+
; CHECK-NEXT: [[AND:%.*]] = and i64 [[A]], [[B_FR:%.*]]
50+
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], i64 0, i64 [[AND]]
51+
; CHECK-NEXT: ret i64 [[SELECT]]
52+
;
53+
%cond = icmp eq i64 %a, 0
54+
%and = and i64 %a, %b
55+
%select = select i1 %cond, i64 0, i64 %and
56+
ret i64 %select
57+
}
58+
59+
; (select (icmp x, 0, ne), (ashr x, y), 0) -> (ashr x, y)
60+
define i64 @ashr_select(i64 %a, i64 %b) {
61+
; CHECK-LABEL: @ashr_select(
62+
; CHECK-NEXT: [[COND_NOT:%.*]] = icmp eq i64 [[A:%.*]], 0
63+
; CHECK-NEXT: [[ASHR:%.*]] = ashr i64 [[A]], [[B_FR:%.*]]
64+
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND_NOT]], i64 0, i64 [[ASHR]]
65+
; CHECK-NEXT: ret i64 [[SELECT]]
66+
;
67+
%cond = icmp ne i64 0, %a
68+
%ashr = ashr i64 %a, %b
69+
%select = select i1 %cond, i64 %ashr, i64 0
70+
ret i64 %select
71+
}
72+
73+
; (select (icmp x, 0, ne), (lshr x, y), 0) -> (lshr x, y)
74+
define i64 @lshr_select(i64 %a, i64 %b) {
75+
; CHECK-LABEL: @lshr_select(
76+
; CHECK-NEXT: [[COND_NOT:%.*]] = icmp eq i64 [[A:%.*]], 0
77+
; CHECK-NEXT: [[LSHR:%.*]] = lshr i64 [[A]], [[B_FR:%.*]]
78+
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND_NOT]], i64 0, i64 [[LSHR]]
79+
; CHECK-NEXT: ret i64 [[SELECT]]
80+
;
81+
%cond = icmp ne i64 0, %a
82+
%lshr = lshr i64 %a, %b
83+
%select = select i1 %cond, i64 %lshr, i64 0
84+
ret i64 %select
85+
}
86+
87+
; (select (icmp x, 0, eq), 0, fshr(x, x, y)) -> fshr(x, x, y)
88+
define i64 @fshr_select(i64 %a, i64 %b) {
89+
; CHECK-LABEL: @fshr_select(
90+
; CHECK-NEXT: [[COND:%.*]] = icmp eq i64 [[A:%.*]], 0
91+
; CHECK-NEXT: [[FSHR:%.*]] = call i64 @llvm.fshr.i64(i64 [[A]], i64 [[A]], i64 [[B_FR:%.*]])
92+
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], i64 0, i64 [[FSHR]]
93+
; CHECK-NEXT: ret i64 [[SELECT]]
94+
;
95+
%cond = icmp eq i64 %a, 0
96+
%fshr = call i64 @llvm.fshr.i64(i64 %a, i64 %a, i64 %b)
97+
%select = select i1 %cond, i64 0, i64 %fshr
98+
ret i64 %select
99+
}
100+
101+
; (select (icmp x, 0, eq), 0, (fshl x, x, y)) -> (fshl x, x, y)
102+
define i64 @fshl_select(i64 %a, i64 %b) {
103+
; CHECK-LABEL: @fshl_select(
104+
; CHECK-NEXT: [[COND:%.*]] = icmp eq i64 [[A:%.*]], 0
105+
; CHECK-NEXT: [[FSHL:%.*]] = call i64 @llvm.fshl.i64(i64 [[A]], i64 [[A]], i64 [[B_FR:%.*]])
106+
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], i64 0, i64 [[FSHL]]
107+
; CHECK-NEXT: ret i64 [[SELECT]]
108+
;
109+
%cond = icmp eq i64 %a, 0
110+
%fshl = call i64 @llvm.fshl.i64(i64 %a, i64 %a, i64 %b)
111+
%select = select i1 %cond, i64 0, i64 %fshl
112+
ret i64 %select
113+
}
114+
115+
; (select (icmp x, 0, eq), 0, (fshr x, z, y)) -> leave as is
116+
define i64 @fshr_select_no_combine(i64 %a, i64 %b, i64 %c) {
117+
; CHECK-LABEL: @fshr_select_no_combine(
118+
; CHECK-NEXT: [[COND:%.*]] = icmp eq i64 [[A:%.*]], 0
119+
; CHECK-NEXT: [[FSHR:%.*]] = call i64 @llvm.fshr.i64(i64 [[A]], i64 [[B:%.*]], i64 [[C:%.*]])
120+
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], i64 0, i64 [[FSHR]]
121+
; CHECK-NEXT: ret i64 [[SELECT]]
122+
;
123+
%cond = icmp eq i64 %a, 0
124+
%fshr = call i64 @llvm.fshr.i64(i64 %a, i64 %b, i64 %c)
125+
%select = select i1 %cond, i64 0, i64 %fshr
126+
ret i64 %select
127+
}
128+
129+
; (select (icmp x, 0, eq), 0, (sdiv x, y)) -> (sdiv x, y)
130+
define i64 @sdiv_select(i64 %a, i64 %b) {
131+
; CHECK-LABEL: @sdiv_select(
132+
; CHECK-NEXT: [[COND:%.*]] = icmp eq i64 [[A:%.*]], 0
133+
; CHECK-NEXT: [[DIV:%.*]] = sdiv i64 [[A]], [[B_FR:%.*]]
134+
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], i64 0, i64 [[DIV]]
135+
; CHECK-NEXT: ret i64 [[SELECT]]
136+
;
137+
%cond = icmp eq i64 %a, 0
138+
%div = sdiv i64 %a, %b
139+
%select = select i1 %cond, i64 0, i64 %div
140+
ret i64 %select
141+
}
142+
143+
; (select (icmp x, 0, eq), 0, (udiv x, y)) -> (udiv x, y)
144+
define i64 @udiv_select(i64 %a, i64 %b) {
145+
; CHECK-LABEL: @udiv_select(
146+
; CHECK-NEXT: [[COND:%.*]] = icmp eq i64 [[A:%.*]], 0
147+
; CHECK-NEXT: [[DIV:%.*]] = udiv i64 [[A]], [[B_FR:%.*]]
148+
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], i64 0, i64 [[DIV]]
149+
; CHECK-NEXT: ret i64 [[SELECT]]
150+
;
151+
%cond = icmp eq i64 %a, 0
152+
%div = udiv i64 %a, %b
153+
%select = select i1 %cond, i64 0, i64 %div
154+
ret i64 %select
155+
}
156+
157+
; (select (icmp x, 0, eq), 0, (srem x, y)) -> (srem x, y)
158+
define i64 @srem_select(i64 %a, i64 %b) {
159+
; CHECK-LABEL: @srem_select(
160+
; CHECK-NEXT: [[COND:%.*]] = icmp eq i64 [[A:%.*]], 0
161+
; CHECK-NEXT: [[REM:%.*]] = srem i64 [[A]], [[B:%.*]]
162+
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], i64 0, i64 [[REM]]
163+
; CHECK-NEXT: ret i64 [[SELECT]]
164+
;
165+
%cond = icmp eq i64 %a, 0
166+
%rem = srem i64 %a, %b
167+
%select = select i1 %cond, i64 0, i64 %rem
168+
ret i64 %select
169+
}
170+
171+
; (select (icmp x, 0, eq), 0, (urem x, y)) -> (urem x, y)
172+
define i64 @urem_select(i64 %a, i64 %b) {
173+
; CHECK-LABEL: @urem_select(
174+
; CHECK-NEXT: [[COND:%.*]] = icmp eq i64 [[A:%.*]], 0
175+
; CHECK-NEXT: [[REM:%.*]] = urem i64 [[A]], [[B:%.*]]
176+
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], i64 0, i64 [[REM]]
177+
; CHECK-NEXT: ret i64 [[SELECT]]
178+
;
179+
%cond = icmp eq i64 %a, 0
180+
%rem = urem i64 %a, %b
181+
%select = select i1 %cond, i64 0, i64 %rem
182+
ret i64 %select
183+
}
184+
185+
; (select (icmp x, 0, eq), 0, (icmp x, 0, slt)) -> (icmp x, 0, slt)
186+
define i1 @icmp_slt_select(i64 %a) {
187+
; CHECK-LABEL: @icmp_slt_select(
188+
; CHECK-NEXT: [[ICMP:%.*]] = icmp slt i64 [[A:%.*]], 0
189+
; CHECK-NEXT: ret i1 [[ICMP]]
190+
;
191+
%cond = icmp eq i64 %a, 0
192+
%icmp = icmp slt i64 %a, 0
193+
%select = select i1 %cond, i1 0, i1 %icmp
194+
ret i1 %select
195+
}
196+
197+
; (select (icmp x, 0, eq), 0, (sub 0, x)) -> (sub 0, x)
198+
define i64 @sub_select(i64 %a) {
199+
; CHECK-LABEL: @sub_select(
200+
; CHECK-NEXT: [[SUB:%.*]] = sub i64 0, [[A:%.*]]
201+
; CHECK-NEXT: ret i64 [[SUB]]
202+
;
203+
%cond = icmp eq i64 %a, 0
204+
%sub = sub i64 0, %a
205+
%select = select i1 %cond, i64 0, i64 %sub
206+
ret i64 %select
207+
}

0 commit comments

Comments
 (0)