Skip to content

Commit 84a8a57

Browse files
committed
InstCombine: Add baseline tests for copysign with fneg/fabs
1 parent 8ae1830 commit 84a8a57

File tree

1 file changed

+292
-0
lines changed

1 file changed

+292
-0
lines changed
Lines changed: 292 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,292 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt -S -passes=instcombine < %s | FileCheck %s
3+
4+
define half @copysign_fneg_x(half %x, half %y) {
5+
; CHECK-LABEL: @copysign_fneg_x(
6+
; CHECK-NEXT: [[COPYSIGN:%.*]] = call half @llvm.copysign.f16(half [[X:%.*]], half [[Y:%.*]])
7+
; CHECK-NEXT: ret half [[COPYSIGN]]
8+
;
9+
%fneg.x = fneg half %x
10+
%copysign = call half @llvm.copysign.f16(half %fneg.x, half %y)
11+
ret half %copysign
12+
}
13+
14+
define half @copysign_fabs_x(half %x, half %y) {
15+
; CHECK-LABEL: @copysign_fabs_x(
16+
; CHECK-NEXT: [[COPYSIGN:%.*]] = call half @llvm.copysign.f16(half [[X:%.*]], half [[Y:%.*]])
17+
; CHECK-NEXT: ret half [[COPYSIGN]]
18+
;
19+
%fabs.x = call half @llvm.fabs.f16(half %x)
20+
%copysign = call half @llvm.copysign.f16(half %fabs.x, half %y)
21+
ret half %copysign
22+
}
23+
24+
define half @copysign_fneg_fabs_x(half %x, half %y) {
25+
; CHECK-LABEL: @copysign_fneg_fabs_x(
26+
; CHECK-NEXT: [[COPYSIGN:%.*]] = call half @llvm.copysign.f16(half [[X:%.*]], half [[Y:%.*]])
27+
; CHECK-NEXT: ret half [[COPYSIGN]]
28+
;
29+
%fabs.x = call half @llvm.fabs.f16(half %x)
30+
%fneg.fabs.x = fneg half %fabs.x
31+
%copysign = call half @llvm.copysign.f16(half %fneg.fabs.x, half %y)
32+
ret half %copysign
33+
}
34+
35+
define half @copysign_fneg_y(half %x, half %y) {
36+
; CHECK-LABEL: @copysign_fneg_y(
37+
; CHECK-NEXT: [[FNEG_Y:%.*]] = fneg half [[Y:%.*]]
38+
; CHECK-NEXT: [[COPYSIGN:%.*]] = call half @llvm.copysign.f16(half [[X:%.*]], half [[FNEG_Y]])
39+
; CHECK-NEXT: ret half [[COPYSIGN]]
40+
;
41+
%fneg.y = fneg half %y
42+
%copysign = call half @llvm.copysign.f16(half %x, half %fneg.y)
43+
ret half %copysign
44+
}
45+
46+
define half @copysign_fabs_y(half %x, half %y) {
47+
; CHECK-LABEL: @copysign_fabs_y(
48+
; CHECK-NEXT: [[TMP1:%.*]] = call half @llvm.fabs.f16(half [[X:%.*]])
49+
; CHECK-NEXT: ret half [[TMP1]]
50+
;
51+
%fabs.y = call half @llvm.fabs.f16(half %y)
52+
%copysign = call half @llvm.copysign.f16(half %x, half %fabs.y)
53+
ret half %copysign
54+
}
55+
56+
define half @copysign_fneg_fabs_y(half %x, half %y) {
57+
; CHECK-LABEL: @copysign_fneg_fabs_y(
58+
; CHECK-NEXT: [[FABS_Y:%.*]] = call half @llvm.fabs.f16(half [[Y:%.*]])
59+
; CHECK-NEXT: [[FNEG_FABS_Y:%.*]] = fneg half [[FABS_Y]]
60+
; CHECK-NEXT: [[COPYSIGN:%.*]] = call half @llvm.copysign.f16(half [[X:%.*]], half [[FNEG_FABS_Y]])
61+
; CHECK-NEXT: ret half [[COPYSIGN]]
62+
;
63+
%fabs.y = call half @llvm.fabs.f16(half %y)
64+
%fneg.fabs.y = fneg half %fabs.y
65+
%copysign = call half @llvm.copysign.f16(half %x, half %fneg.fabs.y)
66+
ret half %copysign
67+
}
68+
69+
define half @fneg_copysign(half %x, half %y) {
70+
; CHECK-LABEL: @fneg_copysign(
71+
; CHECK-NEXT: [[COPYSIGN:%.*]] = call half @llvm.copysign.f16(half [[X:%.*]], half [[Y:%.*]])
72+
; CHECK-NEXT: [[FNEG_COPYSIGN:%.*]] = fneg half [[COPYSIGN]]
73+
; CHECK-NEXT: ret half [[FNEG_COPYSIGN]]
74+
;
75+
%copysign = call half @llvm.copysign.f16(half %x, half %y)
76+
%fneg.copysign = fneg half %copysign
77+
ret half %fneg.copysign
78+
}
79+
80+
define half @fneg_fabs_copysign(half %x, half %y) {
81+
; CHECK-LABEL: @fneg_fabs_copysign(
82+
; CHECK-NEXT: [[COPYSIGN:%.*]] = call half @llvm.copysign.f16(half [[X:%.*]], half [[Y:%.*]])
83+
; CHECK-NEXT: [[FABS_COPYSIGN:%.*]] = call half @llvm.fabs.f16(half [[COPYSIGN]])
84+
; CHECK-NEXT: [[FNEG_FABS_COPYSIGN:%.*]] = fneg half [[FABS_COPYSIGN]]
85+
; CHECK-NEXT: ret half [[FNEG_FABS_COPYSIGN]]
86+
;
87+
%copysign = call half @llvm.copysign.f16(half %x, half %y)
88+
%fabs.copysign = call half @llvm.fabs.f16(half %copysign)
89+
%fneg.fabs.copysign = fneg half %fabs.copysign
90+
ret half %fneg.fabs.copysign
91+
}
92+
93+
; https://alive2.llvm.org/ce/z/Ft-7ea
94+
define half @fabs_copysign(half %x, half %y) {
95+
; CHECK-LABEL: @fabs_copysign(
96+
; CHECK-NEXT: [[COPYSIGN:%.*]] = call half @llvm.copysign.f16(half [[X:%.*]], half [[Y:%.*]])
97+
; CHECK-NEXT: [[FABS_COPYSIGN:%.*]] = call half @llvm.fabs.f16(half [[COPYSIGN]])
98+
; CHECK-NEXT: ret half [[FABS_COPYSIGN]]
99+
;
100+
%copysign = call half @llvm.copysign.f16(half %x, half %y)
101+
%fabs.copysign = call half @llvm.fabs.f16(half %copysign)
102+
ret half %fabs.copysign
103+
}
104+
105+
define <2 x half> @fneg_copysign_vector(<2 x half> %x, <2 x half> %y) {
106+
; CHECK-LABEL: @fneg_copysign_vector(
107+
; CHECK-NEXT: [[COPYSIGN:%.*]] = call <2 x half> @llvm.copysign.v2f16(<2 x half> [[X:%.*]], <2 x half> [[Y:%.*]])
108+
; CHECK-NEXT: [[FNEG_COPYSIGN:%.*]] = fneg <2 x half> [[COPYSIGN]]
109+
; CHECK-NEXT: ret <2 x half> [[FNEG_COPYSIGN]]
110+
;
111+
%copysign = call <2 x half> @llvm.copysign.v2f16(<2 x half> %x, <2 x half> %y)
112+
%fneg.copysign = fneg <2 x half> %copysign
113+
ret <2 x half> %fneg.copysign
114+
}
115+
116+
define <2 x half> @fneg_fabs_copysign_vector(<2 x half> %x, <2 x half> %y) {
117+
; CHECK-LABEL: @fneg_fabs_copysign_vector(
118+
; CHECK-NEXT: [[COPYSIGN:%.*]] = call <2 x half> @llvm.copysign.v2f16(<2 x half> [[X:%.*]], <2 x half> [[Y:%.*]])
119+
; CHECK-NEXT: [[FABS_COPYSIGN:%.*]] = call <2 x half> @llvm.fabs.v2f16(<2 x half> [[COPYSIGN]])
120+
; CHECK-NEXT: [[FNEG_FABS_COPYSIGN:%.*]] = fneg <2 x half> [[FABS_COPYSIGN]]
121+
; CHECK-NEXT: ret <2 x half> [[FNEG_FABS_COPYSIGN]]
122+
;
123+
%copysign = call <2 x half> @llvm.copysign.v2f16(<2 x half> %x, <2 x half> %y)
124+
%fabs.copysign = call <2 x half> @llvm.fabs.v2f16(<2 x half> %copysign)
125+
%fneg.fabs.copysign = fneg <2 x half> %fabs.copysign
126+
ret <2 x half> %fneg.fabs.copysign
127+
}
128+
129+
define <2 x half> @fabs_copysign_vector(<2 x half> %x, <2 x half> %y) {
130+
; CHECK-LABEL: @fabs_copysign_vector(
131+
; CHECK-NEXT: [[COPYSIGN:%.*]] = call <2 x half> @llvm.copysign.v2f16(<2 x half> [[X:%.*]], <2 x half> [[Y:%.*]])
132+
; CHECK-NEXT: [[FABS_COPYSIGN:%.*]] = call <2 x half> @llvm.fabs.v2f16(<2 x half> [[COPYSIGN]])
133+
; CHECK-NEXT: ret <2 x half> [[FABS_COPYSIGN]]
134+
;
135+
%copysign = call <2 x half> @llvm.copysign.v2f16(<2 x half> %x, <2 x half> %y)
136+
%fabs.copysign = call <2 x half> @llvm.fabs.v2f16(<2 x half> %copysign)
137+
ret <2 x half> %fabs.copysign
138+
}
139+
140+
define half @fneg_copysign_flags(half %x, half %y) {
141+
; CHECK-LABEL: @fneg_copysign_flags(
142+
; CHECK-NEXT: [[COPYSIGN:%.*]] = call nnan nsz half @llvm.copysign.f16(half [[X:%.*]], half [[Y:%.*]])
143+
; CHECK-NEXT: [[FNEG_COPYSIGN:%.*]] = fneg ninf nsz half [[COPYSIGN]]
144+
; CHECK-NEXT: ret half [[FNEG_COPYSIGN]]
145+
;
146+
%copysign = call nnan nsz half @llvm.copysign.f16(half %x, half %y)
147+
%fneg.copysign = fneg ninf nsz half %copysign
148+
ret half %fneg.copysign
149+
}
150+
151+
define half @fneg_fabs_copysign_flags(half %x, half %y) {
152+
; CHECK-LABEL: @fneg_fabs_copysign_flags(
153+
; CHECK-NEXT: [[COPYSIGN:%.*]] = call nnan ninf nsz half @llvm.copysign.f16(half [[X:%.*]], half [[Y:%.*]])
154+
; CHECK-NEXT: [[FABS_COPYSIGN:%.*]] = call nnan ninf afn half @llvm.fabs.f16(half [[COPYSIGN]])
155+
; CHECK-NEXT: [[FNEG_FABS_COPYSIGN:%.*]] = fneg reassoc ninf half [[FABS_COPYSIGN]]
156+
; CHECK-NEXT: ret half [[FNEG_FABS_COPYSIGN]]
157+
;
158+
%copysign = call nnan nsz ninf half @llvm.copysign.f16(half %x, half %y)
159+
%fabs.copysign = call nnan afn ninf half @llvm.fabs.f16(half %copysign)
160+
%fneg.fabs.copysign = fneg reassoc ninf half %fabs.copysign
161+
ret half %fneg.fabs.copysign
162+
}
163+
164+
; Make sure we don't break things by polluting copysign with nsz
165+
define half @fneg_nsz_copysign(half %x, half %y) {
166+
; CHECK-LABEL: @fneg_nsz_copysign(
167+
; CHECK-NEXT: [[COPYSIGN:%.*]] = call half @llvm.copysign.f16(half [[X:%.*]], half [[Y:%.*]])
168+
; CHECK-NEXT: [[FNEG_COPYSIGN:%.*]] = fneg nsz half [[COPYSIGN]]
169+
; CHECK-NEXT: ret half [[FNEG_COPYSIGN]]
170+
;
171+
%copysign = call half @llvm.copysign.f16(half %x, half %y)
172+
%fneg.copysign = fneg nsz half %copysign
173+
ret half %fneg.copysign
174+
}
175+
176+
define half @fneg_fabs_copysign_flags_none_fabs(half %x, half %y) {
177+
; CHECK-LABEL: @fneg_fabs_copysign_flags_none_fabs(
178+
; CHECK-NEXT: [[COPYSIGN:%.*]] = call nnan ninf nsz half @llvm.copysign.f16(half [[X:%.*]], half [[Y:%.*]])
179+
; CHECK-NEXT: [[FABS_COPYSIGN:%.*]] = call half @llvm.fabs.f16(half [[COPYSIGN]])
180+
; CHECK-NEXT: [[FNEG_FABS_COPYSIGN:%.*]] = fneg fast half [[FABS_COPYSIGN]]
181+
; CHECK-NEXT: ret half [[FNEG_FABS_COPYSIGN]]
182+
;
183+
%copysign = call nnan nsz ninf half @llvm.copysign.f16(half %x, half %y)
184+
%fabs.copysign = call half @llvm.fabs.f16(half %copysign)
185+
%fneg.fabs.copysign = fneg fast half %fabs.copysign
186+
ret half %fneg.fabs.copysign
187+
}
188+
189+
define half @fabs_copysign_flags(half %x, half %y) {
190+
; CHECK-LABEL: @fabs_copysign_flags(
191+
; CHECK-NEXT: [[COPYSIGN:%.*]] = call nnan half @llvm.copysign.f16(half [[X:%.*]], half [[Y:%.*]])
192+
; CHECK-NEXT: [[FABS_COPYSIGN:%.*]] = call nnan nsz half @llvm.fabs.f16(half [[COPYSIGN]])
193+
; CHECK-NEXT: ret half [[FABS_COPYSIGN]]
194+
;
195+
%copysign = call nnan half @llvm.copysign.f16(half %x, half %y)
196+
%fabs.copysign = call nsz nnan half @llvm.fabs.f16(half %copysign)
197+
ret half %fabs.copysign
198+
}
199+
200+
define half @fabs_copysign_all_flags(half %x, half %y) {
201+
; CHECK-LABEL: @fabs_copysign_all_flags(
202+
; CHECK-NEXT: [[COPYSIGN:%.*]] = call fast half @llvm.copysign.f16(half [[X:%.*]], half [[Y:%.*]])
203+
; CHECK-NEXT: [[FABS_COPYSIGN:%.*]] = call fast half @llvm.fabs.f16(half [[COPYSIGN]])
204+
; CHECK-NEXT: ret half [[FABS_COPYSIGN]]
205+
;
206+
%copysign = call fast half @llvm.copysign.f16(half %x, half %y)
207+
%fabs.copysign = call fast half @llvm.fabs.f16(half %copysign)
208+
ret half %fabs.copysign
209+
}
210+
211+
define half @fabs_copysign_no_flags_copysign_user(half %x, half %y, ptr %ptr) {
212+
; CHECK-LABEL: @fabs_copysign_no_flags_copysign_user(
213+
; CHECK-NEXT: [[COPYSIGN:%.*]] = call half @llvm.copysign.f16(half [[X:%.*]], half [[Y:%.*]])
214+
; CHECK-NEXT: store half [[COPYSIGN]], ptr [[PTR:%.*]], align 2
215+
; CHECK-NEXT: [[FABS_COPYSIGN:%.*]] = call fast half @llvm.fabs.f16(half [[COPYSIGN]])
216+
; CHECK-NEXT: ret half [[FABS_COPYSIGN]]
217+
;
218+
%copysign = call half @llvm.copysign.f16(half %x, half %y)
219+
store half %copysign, ptr %ptr
220+
%fabs.copysign = call fast half @llvm.fabs.f16(half %copysign)
221+
ret half %fabs.copysign
222+
}
223+
224+
define half @fneg_fabs_copysign_drop_flags(half %x, half %y) {
225+
; CHECK-LABEL: @fneg_fabs_copysign_drop_flags(
226+
; CHECK-NEXT: [[COPYSIGN:%.*]] = call nnan half @llvm.copysign.f16(half [[X:%.*]], half [[Y:%.*]])
227+
; CHECK-NEXT: [[FABS_COPYSIGN:%.*]] = call ninf half @llvm.fabs.f16(half [[COPYSIGN]])
228+
; CHECK-NEXT: [[FNEG_FABS_COPYSIGN:%.*]] = fneg nsz half [[FABS_COPYSIGN]]
229+
; CHECK-NEXT: ret half [[FNEG_FABS_COPYSIGN]]
230+
;
231+
%copysign = call nnan half @llvm.copysign.f16(half %x, half %y)
232+
%fabs.copysign = call ninf half @llvm.fabs.f16(half %copysign)
233+
%fneg.fabs.copysign = fneg nsz half %fabs.copysign
234+
ret half %fneg.fabs.copysign
235+
}
236+
237+
define half @fneg_copysign_multi_use(half %x, half %y, ptr %ptr) {
238+
; CHECK-LABEL: @fneg_copysign_multi_use(
239+
; CHECK-NEXT: [[COPYSIGN:%.*]] = call half @llvm.copysign.f16(half [[X:%.*]], half [[Y:%.*]])
240+
; CHECK-NEXT: store half [[COPYSIGN]], ptr [[PTR:%.*]], align 2
241+
; CHECK-NEXT: [[FNEG_COPYSIGN:%.*]] = fneg half [[COPYSIGN]]
242+
; CHECK-NEXT: ret half [[FNEG_COPYSIGN]]
243+
;
244+
%copysign = call half @llvm.copysign.f16(half %x, half %y)
245+
store half %copysign, ptr %ptr
246+
%fneg.copysign = fneg half %copysign
247+
ret half %fneg.copysign
248+
}
249+
250+
define half @fabs_copysign_multi_use(half %x, half %y, ptr %ptr) {
251+
; CHECK-LABEL: @fabs_copysign_multi_use(
252+
; CHECK-NEXT: [[COPYSIGN:%.*]] = call half @llvm.copysign.f16(half [[X:%.*]], half [[Y:%.*]])
253+
; CHECK-NEXT: store half [[COPYSIGN]], ptr [[PTR:%.*]], align 2
254+
; CHECK-NEXT: [[FABS_COPYSIGN:%.*]] = call half @llvm.fabs.f16(half [[COPYSIGN]])
255+
; CHECK-NEXT: ret half [[FABS_COPYSIGN]]
256+
;
257+
%copysign = call half @llvm.copysign.f16(half %x, half %y)
258+
store half %copysign, ptr %ptr
259+
%fabs.copysign = call half @llvm.fabs.f16(half %copysign)
260+
ret half %fabs.copysign
261+
}
262+
263+
define half @fabs_flags_copysign_multi_use(half %x, half %y, ptr %ptr) {
264+
; CHECK-LABEL: @fabs_flags_copysign_multi_use(
265+
; CHECK-NEXT: [[COPYSIGN:%.*]] = call half @llvm.copysign.f16(half [[X:%.*]], half [[Y:%.*]])
266+
; CHECK-NEXT: store half [[COPYSIGN]], ptr [[PTR:%.*]], align 2
267+
; CHECK-NEXT: [[FABS_COPYSIGN:%.*]] = call nnan ninf half @llvm.fabs.f16(half [[COPYSIGN]])
268+
; CHECK-NEXT: ret half [[FABS_COPYSIGN]]
269+
;
270+
%copysign = call half @llvm.copysign.f16(half %x, half %y)
271+
store half %copysign, ptr %ptr
272+
%fabs.copysign = call ninf nnan half @llvm.fabs.f16(half %copysign)
273+
ret half %fabs.copysign
274+
}
275+
276+
define half @fneg_fabs_copysign_multi_use_fabs(half %x, half %y, ptr %ptr) {
277+
; CHECK-LABEL: @fneg_fabs_copysign_multi_use_fabs(
278+
; CHECK-NEXT: [[COPYSIGN:%.*]] = call half @llvm.copysign.f16(half [[X:%.*]], half [[Y:%.*]])
279+
; CHECK-NEXT: [[FABS_COPYSIGN:%.*]] = call half @llvm.fabs.f16(half [[COPYSIGN]])
280+
; CHECK-NEXT: store half [[FABS_COPYSIGN]], ptr [[PTR:%.*]], align 2
281+
; CHECK-NEXT: ret half [[FABS_COPYSIGN]]
282+
;
283+
%copysign = call half @llvm.copysign.f16(half %x, half %y)
284+
%fabs.copysign = call half @llvm.fabs.f16(half %copysign)
285+
store half %fabs.copysign, ptr %ptr
286+
ret half %fabs.copysign
287+
}
288+
289+
declare half @llvm.fabs.f16(half)
290+
declare <2 x half> @llvm.fabs.v2f16(<2 x half>)
291+
declare half @llvm.copysign.f16(half, half)
292+
declare <2 x half> @llvm.copysign.v2f16(<2 x half>, <2 x half>)

0 commit comments

Comments
 (0)