blob: 4c5b5f08d2e1a8ff15f8ceba6b877c3e5f5f33b1 [file] [log] [blame]
Sanjay Patel2580c952016-12-08 20:23:56 +00001; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
Michael Ilsemanbb6f6912012-12-12 00:27:46 +00002; RUN: opt < %s -instsimplify -S | FileCheck %s
3
Sanjay Patel49b7dc22018-03-12 15:47:32 +00004define <2 x float> @fsub_negzero_vec_undef_elts(<2 x float> %x) {
5; CHECK-LABEL: @fsub_negzero_vec_undef_elts(
Sanjay Patela0d8d122018-03-12 18:17:01 +00006; CHECK-NEXT: ret <2 x float> [[X:%.*]]
Sanjay Patel49b7dc22018-03-12 15:47:32 +00007;
8 %r = fsub nsz <2 x float> %x, <float undef, float -0.0>
9 ret <2 x float> %r
10}
11
Benjamin Kramerf5b2a472016-02-29 11:12:23 +000012; fsub -0.0, (fsub -0.0, X) ==> X
Benjamin Kramerf5b2a472016-02-29 11:12:23 +000013define float @fsub_-0_-0_x(float %a) {
Sanjay Patel69632442016-03-25 20:12:25 +000014; CHECK-LABEL: @fsub_-0_-0_x(
Sanjay Patelb13fcd52018-02-13 18:22:53 +000015; CHECK-NEXT: ret float [[A:%.*]]
Sanjay Patel69632442016-03-25 20:12:25 +000016;
Michael Ilsemanbb6f6912012-12-12 00:27:46 +000017 %t1 = fsub float -0.0, %a
18 %ret = fsub float -0.0, %t1
Michael Ilsemanbb6f6912012-12-12 00:27:46 +000019 ret float %ret
20}
21
Sanjay Patel66911b12018-02-26 23:23:02 +000022define <2 x float> @fsub_-0_-0_x_vec(<2 x float> %a) {
23; CHECK-LABEL: @fsub_-0_-0_x_vec(
24; CHECK-NEXT: ret <2 x float> [[A:%.*]]
25;
26 %t1 = fsub <2 x float> <float -0.0, float -0.0>, %a
27 %ret = fsub <2 x float> <float -0.0, float -0.0>, %t1
28 ret <2 x float> %ret
29}
30
31define <2 x float> @fsub_-0_-0_x_vec_undef_elts(<2 x float> %a) {
32; CHECK-LABEL: @fsub_-0_-0_x_vec_undef_elts(
Sanjay Patela0d8d122018-03-12 18:17:01 +000033; CHECK-NEXT: ret <2 x float> [[A:%.*]]
Sanjay Patel66911b12018-02-26 23:23:02 +000034;
35 %t1 = fsub <2 x float> <float undef, float -0.0>, %a
36 %ret = fsub <2 x float> <float -0.0, float undef>, %t1
37 ret <2 x float> %ret
38}
39
Benjamin Kramerf5b2a472016-02-29 11:12:23 +000040; fsub 0.0, (fsub -0.0, X) != X
Benjamin Kramerf5b2a472016-02-29 11:12:23 +000041define float @fsub_0_-0_x(float %a) {
Sanjay Patel69632442016-03-25 20:12:25 +000042; CHECK-LABEL: @fsub_0_-0_x(
Sanjay Patelb13fcd52018-02-13 18:22:53 +000043; CHECK-NEXT: [[T1:%.*]] = fsub float 0.000000e+00, [[A:%.*]]
Sanjay Patel69632442016-03-25 20:12:25 +000044; CHECK-NEXT: [[RET:%.*]] = fsub float -0.000000e+00, [[T1]]
45; CHECK-NEXT: ret float [[RET]]
46;
Benjamin Kramerf5b2a472016-02-29 11:12:23 +000047 %t1 = fsub float 0.0, %a
48 %ret = fsub float -0.0, %t1
Benjamin Kramerf5b2a472016-02-29 11:12:23 +000049 ret float %ret
50}
51
52; fsub -0.0, (fsub 0.0, X) != X
Benjamin Kramerf5b2a472016-02-29 11:12:23 +000053define float @fsub_-0_0_x(float %a) {
Sanjay Patel69632442016-03-25 20:12:25 +000054; CHECK-LABEL: @fsub_-0_0_x(
Sanjay Patelb13fcd52018-02-13 18:22:53 +000055; CHECK-NEXT: [[T1:%.*]] = fsub float -0.000000e+00, [[A:%.*]]
Sanjay Patel69632442016-03-25 20:12:25 +000056; CHECK-NEXT: [[RET:%.*]] = fsub float 0.000000e+00, [[T1]]
57; CHECK-NEXT: ret float [[RET]]
58;
Benjamin Kramerf5b2a472016-02-29 11:12:23 +000059 %t1 = fsub float -0.0, %a
60 %ret = fsub float 0.0, %t1
Benjamin Kramerf5b2a472016-02-29 11:12:23 +000061 ret float %ret
62}
63
Michael Ilsemanbb6f6912012-12-12 00:27:46 +000064; fsub X, 0 ==> X
Sanjay Patelc84b48e2018-03-25 17:48:20 +000065define float @fsub_x_0(float %x) {
Sanjay Patel69632442016-03-25 20:12:25 +000066; CHECK-LABEL: @fsub_x_0(
Sanjay Patelc84b48e2018-03-25 17:48:20 +000067; CHECK-NEXT: ret float [[X:%.*]]
Sanjay Patel69632442016-03-25 20:12:25 +000068;
Sanjay Patelc84b48e2018-03-25 17:48:20 +000069 %r = fsub float %x, 0.0
70 ret float %r
71}
72
73define <2 x float> @fsub_x_0_vec_undef(<2 x float> %x) {
74; CHECK-LABEL: @fsub_x_0_vec_undef(
75; CHECK-NEXT: [[R:%.*]] = fsub <2 x float> [[X:%.*]], <float undef, float 0.000000e+00>
76; CHECK-NEXT: ret <2 x float> [[R]]
77;
78 %r = fsub <2 x float> %x, <float undef, float 0.0>
79 ret <2 x float> %r
Michael Ilsemanbb6f6912012-12-12 00:27:46 +000080}
81
82; fadd X, -0 ==> X
Michael Ilsemanbb6f6912012-12-12 00:27:46 +000083define float @fadd_x_n0(float %a) {
Sanjay Patel69632442016-03-25 20:12:25 +000084; CHECK-LABEL: @fadd_x_n0(
Sanjay Patelb13fcd52018-02-13 18:22:53 +000085; CHECK-NEXT: ret float [[A:%.*]]
Sanjay Patel69632442016-03-25 20:12:25 +000086;
Michael Ilsemanbb6f6912012-12-12 00:27:46 +000087 %ret = fadd float %a, -0.0
Michael Ilsemanbb6f6912012-12-12 00:27:46 +000088 ret float %ret
89}
90
Sanjay Patel66911b12018-02-26 23:23:02 +000091define <2 x float> @fadd_x_n0_vec_undef_elt(<2 x float> %a) {
92; CHECK-LABEL: @fadd_x_n0_vec_undef_elt(
Sanjay Patela0d8d122018-03-12 18:17:01 +000093; CHECK-NEXT: ret <2 x float> [[A:%.*]]
Sanjay Patel66911b12018-02-26 23:23:02 +000094;
95 %ret = fadd <2 x float> %a, <float -0.0, float undef>
96 ret <2 x float> %ret
97}
98
Michael Ilsemanbb6f6912012-12-12 00:27:46 +000099; fmul X, 1.0 ==> X
Michael Ilsemanbb6f6912012-12-12 00:27:46 +0000100define double @fmul_X_1(double %a) {
Sanjay Patel69632442016-03-25 20:12:25 +0000101; CHECK-LABEL: @fmul_X_1(
Sanjay Patelb13fcd52018-02-13 18:22:53 +0000102; CHECK-NEXT: ret double [[A:%.*]]
Sanjay Patel69632442016-03-25 20:12:25 +0000103;
Sanjay Patelb13fcd52018-02-13 18:22:53 +0000104 %b = fmul double 1.0, %a
Michael Ilsemanbb6f6912012-12-12 00:27:46 +0000105 ret double %b
106}
Sanjay Patel40eaa8d2015-02-25 18:00:15 +0000107
Sanjay Patelb13fcd52018-02-13 18:22:53 +0000108; PR2642
109define <4 x float> @fmul_X_1_vec(<4 x float> %x) {
110; CHECK-LABEL: @fmul_X_1_vec(
111; CHECK-NEXT: ret <4 x float> [[X:%.*]]
112;
113 %m = fmul <4 x float> %x, <float 1.0, float 1.0, float 1.0, float 1.0>
114 ret <4 x float> %m
115}
116
Sanjay Patel2580c952016-12-08 20:23:56 +0000117; fdiv X, 1.0 ==> X
118define float @fdiv_x_1(float %a) {
119; CHECK-LABEL: @fdiv_x_1(
Sanjay Patelb13fcd52018-02-13 18:22:53 +0000120; CHECK-NEXT: ret float [[A:%.*]]
Sanjay Patel2580c952016-12-08 20:23:56 +0000121;
122 %ret = fdiv float %a, 1.0
123 ret float %ret
124}
125
Sanjay Patel40eaa8d2015-02-25 18:00:15 +0000126; We can't optimize away the fadd in this test because the input
Sanjay Patel69632442016-03-25 20:12:25 +0000127; value to the function and subsequently to the fadd may be -0.0.
Sanjay Patel40eaa8d2015-02-25 18:00:15 +0000128; In that one special case, the result of the fadd should be +0.0
129; rather than the first parameter of the fadd.
130
Sanjay Patel69632442016-03-25 20:12:25 +0000131; Fragile test warning: We need 6 sqrt calls to trigger the bug
132; because the internal logic has a magic recursion limit of 6.
Sanjay Patel40eaa8d2015-02-25 18:00:15 +0000133; This is presented without any explanation or ability to customize.
134
135declare float @sqrtf(float)
136
137define float @PR22688(float %x) {
Sanjay Patel69632442016-03-25 20:12:25 +0000138; CHECK-LABEL: @PR22688(
Sanjay Patelb13fcd52018-02-13 18:22:53 +0000139; CHECK-NEXT: [[TMP1:%.*]] = call float @sqrtf(float [[X:%.*]])
Sanjay Patel2580c952016-12-08 20:23:56 +0000140; CHECK-NEXT: [[TMP2:%.*]] = call float @sqrtf(float [[TMP1]])
141; CHECK-NEXT: [[TMP3:%.*]] = call float @sqrtf(float [[TMP2]])
142; CHECK-NEXT: [[TMP4:%.*]] = call float @sqrtf(float [[TMP3]])
143; CHECK-NEXT: [[TMP5:%.*]] = call float @sqrtf(float [[TMP4]])
144; CHECK-NEXT: [[TMP6:%.*]] = call float @sqrtf(float [[TMP5]])
145; CHECK-NEXT: [[TMP7:%.*]] = fadd float [[TMP6]], 0.000000e+00
Sanjay Patel69632442016-03-25 20:12:25 +0000146; CHECK-NEXT: ret float [[TMP7]]
147;
Sanjay Patel40eaa8d2015-02-25 18:00:15 +0000148 %1 = call float @sqrtf(float %x)
149 %2 = call float @sqrtf(float %1)
150 %3 = call float @sqrtf(float %2)
151 %4 = call float @sqrtf(float %3)
152 %5 = call float @sqrtf(float %4)
153 %6 = call float @sqrtf(float %5)
154 %7 = fadd float %6, 0.0
155 ret float %7
Sanjay Patel40eaa8d2015-02-25 18:00:15 +0000156}
157
Matt Arsenault1e0edbf2017-01-11 00:33:24 +0000158declare float @llvm.fabs.f32(float)
Craig Topperaee341e2018-02-25 06:51:52 +0000159declare <2 x float> @llvm.fabs.v2f32(<2 x float>)
Justin Lebar7e3184c2017-01-26 00:10:26 +0000160declare float @llvm.sqrt.f32(float)
Matt Arsenault1e0edbf2017-01-11 00:33:24 +0000161
Matt Arsenault1e0edbf2017-01-11 00:33:24 +0000162define float @fabs_select_positive_constants(i32 %c) {
Sanjay Patelb13fcd52018-02-13 18:22:53 +0000163; CHECK-LABEL: @fabs_select_positive_constants(
164; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[C:%.*]], 0
165; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], float 1.000000e+00, float 2.000000e+00
166; CHECK-NEXT: ret float [[SELECT]]
167;
Matt Arsenault1e0edbf2017-01-11 00:33:24 +0000168 %cmp = icmp eq i32 %c, 0
169 %select = select i1 %cmp, float 1.0, float 2.0
170 %fabs = call float @llvm.fabs.f32(float %select)
171 ret float %fabs
172}
173
Craig Topperaee341e2018-02-25 06:51:52 +0000174define <2 x float> @fabs_select_positive_constants_vector(i32 %c) {
175; CHECK-LABEL: @fabs_select_positive_constants_vector(
176; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[C:%.*]], 0
177; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], <2 x float> <float 1.000000e+00, float 1.000000e+00>, <2 x float> <float 2.000000e+00, float 2.000000e+00>
Craig Topper69c89722018-02-26 22:33:17 +0000178; CHECK-NEXT: ret <2 x float> [[SELECT]]
Craig Topperaee341e2018-02-25 06:51:52 +0000179;
180 %cmp = icmp eq i32 %c, 0
181 %select = select i1 %cmp, <2 x float> <float 1.0, float 1.0>, <2 x float> <float 2.0, float 2.0>
182 %fabs = call <2 x float> @llvm.fabs.v2f32(<2 x float> %select)
183 ret <2 x float> %fabs
184}
185
Matt Arsenault1e0edbf2017-01-11 00:33:24 +0000186define float @fabs_select_constant_variable(i32 %c, float %x) {
Sanjay Patelb13fcd52018-02-13 18:22:53 +0000187; CHECK-LABEL: @fabs_select_constant_variable(
188; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[C:%.*]], 0
189; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], float 1.000000e+00, float [[X:%.*]]
190; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[SELECT]])
191; CHECK-NEXT: ret float [[FABS]]
192;
Matt Arsenault1e0edbf2017-01-11 00:33:24 +0000193 %cmp = icmp eq i32 %c, 0
194 %select = select i1 %cmp, float 1.0, float %x
195 %fabs = call float @llvm.fabs.f32(float %select)
196 ret float %fabs
197}
198
Craig Topperaee341e2018-02-25 06:51:52 +0000199define <2 x float> @fabs_select_constant_variable_vector(i32 %c, <2 x float> %x) {
200; CHECK-LABEL: @fabs_select_constant_variable_vector(
201; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[C:%.*]], 0
202; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], <2 x float> <float 1.000000e+00, float 1.000000e+00>, <2 x float> [[X:%.*]]
203; CHECK-NEXT: [[FABS:%.*]] = call <2 x float> @llvm.fabs.v2f32(<2 x float> [[SELECT]])
204; CHECK-NEXT: ret <2 x float> [[FABS]]
205;
206 %cmp = icmp eq i32 %c, 0
207 %select = select i1 %cmp, <2 x float> <float 1.0, float 1.0>, <2 x float> %x
208 %fabs = call <2 x float> @llvm.fabs.v2f32(<2 x float> %select)
209 ret <2 x float> %fabs
210}
211
Craig Topper2b8f0512018-02-25 06:51:51 +0000212define float @fabs_select_neg0_pos0(i32 %c) {
Sanjay Patelb13fcd52018-02-13 18:22:53 +0000213; CHECK-LABEL: @fabs_select_neg0_pos0(
214; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[C:%.*]], 0
215; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], float -0.000000e+00, float 0.000000e+00
216; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[SELECT]])
217; CHECK-NEXT: ret float [[FABS]]
218;
Matt Arsenault1e0edbf2017-01-11 00:33:24 +0000219 %cmp = icmp eq i32 %c, 0
220 %select = select i1 %cmp, float -0.0, float 0.0
221 %fabs = call float @llvm.fabs.f32(float %select)
222 ret float %fabs
223}
224
Craig Topperaee341e2018-02-25 06:51:52 +0000225define <2 x float> @fabs_select_neg0_pos0_vector(i32 %c) {
226; CHECK-LABEL: @fabs_select_neg0_pos0_vector(
227; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[C:%.*]], 0
228; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], <2 x float> <float -0.000000e+00, float -0.000000e+00>, <2 x float> zeroinitializer
229; CHECK-NEXT: [[FABS:%.*]] = call <2 x float> @llvm.fabs.v2f32(<2 x float> [[SELECT]])
230; CHECK-NEXT: ret <2 x float> [[FABS]]
231;
232 %cmp = icmp eq i32 %c, 0
233 %select = select i1 %cmp, <2 x float> <float -0.0, float -0.0>, <2 x float> <float 0.0, float 0.0>
234 %fabs = call <2 x float> @llvm.fabs.v2f32(<2 x float> %select)
235 ret <2 x float> %fabs
236}
237
Craig Topper2b8f0512018-02-25 06:51:51 +0000238define float @fabs_select_neg0_neg1(i32 %c) {
Sanjay Patelb13fcd52018-02-13 18:22:53 +0000239; CHECK-LABEL: @fabs_select_neg0_neg1(
240; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[C:%.*]], 0
241; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], float -0.000000e+00, float -1.000000e+00
242; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[SELECT]])
243; CHECK-NEXT: ret float [[FABS]]
244;
Matt Arsenault1e0edbf2017-01-11 00:33:24 +0000245 %cmp = icmp eq i32 %c, 0
246 %select = select i1 %cmp, float -0.0, float -1.0
247 %fabs = call float @llvm.fabs.f32(float %select)
248 ret float %fabs
249}
250
Craig Topperaee341e2018-02-25 06:51:52 +0000251define <2 x float> @fabs_select_neg0_neg1_vector(i32 %c) {
252; CHECK-LABEL: @fabs_select_neg0_neg1_vector(
253; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[C:%.*]], 0
254; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], <2 x float> <float -0.000000e+00, float -0.000000e+00>, <2 x float> <float -1.000000e+00, float -1.000000e+00>
255; CHECK-NEXT: [[FABS:%.*]] = call <2 x float> @llvm.fabs.v2f32(<2 x float> [[SELECT]])
256; CHECK-NEXT: ret <2 x float> [[FABS]]
257;
258 %cmp = icmp eq i32 %c, 0
259 %select = select i1 %cmp, <2 x float> <float -0.0, float -0.0>, <2 x float> <float -1.0, float -1.0>
260 %fabs = call <2 x float> @llvm.fabs.v2f32(<2 x float> %select)
261 ret <2 x float> %fabs
262}
263
Craig Topper2b8f0512018-02-25 06:51:51 +0000264define float @fabs_select_nan_nan(i32 %c) {
Sanjay Patelb13fcd52018-02-13 18:22:53 +0000265; CHECK-LABEL: @fabs_select_nan_nan(
266; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[C:%.*]], 0
267; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], float 0x7FF8000000000000, float 0x7FF8000100000000
268; CHECK-NEXT: ret float [[SELECT]]
269;
Matt Arsenault1e0edbf2017-01-11 00:33:24 +0000270 %cmp = icmp eq i32 %c, 0
271 %select = select i1 %cmp, float 0x7FF8000000000000, float 0x7FF8000100000000
272 %fabs = call float @llvm.fabs.f32(float %select)
273 ret float %fabs
274}
275
Craig Topperaee341e2018-02-25 06:51:52 +0000276define <2 x float> @fabs_select_nan_nan_vector(i32 %c) {
277; CHECK-LABEL: @fabs_select_nan_nan_vector(
278; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[C:%.*]], 0
279; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], <2 x float> <float 0x7FF8000000000000, float 0x7FF8000000000000>, <2 x float> <float 0x7FF8000100000000, float 0x7FF8000100000000>
Craig Topper69c89722018-02-26 22:33:17 +0000280; CHECK-NEXT: ret <2 x float> [[SELECT]]
Craig Topperaee341e2018-02-25 06:51:52 +0000281;
282 %cmp = icmp eq i32 %c, 0
283 %select = select i1 %cmp, <2 x float> <float 0x7FF8000000000000, float 0x7FF8000000000000>, <2 x float> <float 0x7FF8000100000000, float 0x7FF8000100000000>
284 %fabs = call <2 x float> @llvm.fabs.v2f32(<2 x float> %select)
285 ret <2 x float> %fabs
286}
287
Craig Topper2b8f0512018-02-25 06:51:51 +0000288define float @fabs_select_negnan_nan(i32 %c) {
Sanjay Patelb13fcd52018-02-13 18:22:53 +0000289; CHECK-LABEL: @fabs_select_negnan_nan(
290; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[C:%.*]], 0
291; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], float 0xFFF8000000000000, float 0x7FF8000000000000
292; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[SELECT]])
293; CHECK-NEXT: ret float [[FABS]]
294;
Matt Arsenault1e0edbf2017-01-11 00:33:24 +0000295 %cmp = icmp eq i32 %c, 0
296 %select = select i1 %cmp, float 0xFFF8000000000000, float 0x7FF8000000000000
297 %fabs = call float @llvm.fabs.f32(float %select)
298 ret float %fabs
299}
300
Craig Topperaee341e2018-02-25 06:51:52 +0000301define <2 x float> @fabs_select_negnan_nan_vector(i32 %c) {
302; CHECK-LABEL: @fabs_select_negnan_nan_vector(
303; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[C:%.*]], 0
304; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], <2 x float> <float 0xFFF8000000000000, float 0xFFF8000000000000>, <2 x float> <float 0x7FF8000000000000, float 0x7FF8000000000000>
305; CHECK-NEXT: [[FABS:%.*]] = call <2 x float> @llvm.fabs.v2f32(<2 x float> [[SELECT]])
306; CHECK-NEXT: ret <2 x float> [[FABS]]
307;
308 %cmp = icmp eq i32 %c, 0
309 %select = select i1 %cmp, <2 x float> <float 0xFFF8000000000000, float 0xFFF8000000000000>, <2 x float> <float 0x7FF8000000000000, float 0x7FF8000000000000>
310 %fabs = call <2 x float> @llvm.fabs.v2f32(<2 x float> %select)
311 ret <2 x float> %fabs
312}
313
Craig Topper2b8f0512018-02-25 06:51:51 +0000314define float @fabs_select_negnan_negnan(i32 %c) {
Sanjay Patelb13fcd52018-02-13 18:22:53 +0000315; CHECK-LABEL: @fabs_select_negnan_negnan(
316; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[C:%.*]], 0
317; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], float 0xFFF8000000000000, float 0x7FF8000100000000
318; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[SELECT]])
319; CHECK-NEXT: ret float [[FABS]]
320;
Matt Arsenault1e0edbf2017-01-11 00:33:24 +0000321 %cmp = icmp eq i32 %c, 0
322 %select = select i1 %cmp, float 0xFFF8000000000000, float 0x7FF8000100000000
323 %fabs = call float @llvm.fabs.f32(float %select)
324 ret float %fabs
325}
326
Craig Topperaee341e2018-02-25 06:51:52 +0000327define <2 x float> @fabs_select_negnan_negnan_vector(i32 %c) {
328; CHECK-LABEL: @fabs_select_negnan_negnan_vector(
329; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[C:%.*]], 0
330; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], <2 x float> <float 0xFFF8000000000000, float 0xFFF8000000000000>, <2 x float> <float 0x7FF8000100000000, float 0x7FF8000100000000>
331; CHECK-NEXT: [[FABS:%.*]] = call <2 x float> @llvm.fabs.v2f32(<2 x float> [[SELECT]])
332; CHECK-NEXT: ret <2 x float> [[FABS]]
333;
334 %cmp = icmp eq i32 %c, 0
335 %select = select i1 %cmp, <2 x float> <float 0xFFF8000000000000, float 0xFFF8000000000000>, <2 x float> <float 0x7FF8000100000000, float 0x7FF8000100000000>
336 %fabs = call <2 x float> @llvm.fabs.v2f32(<2 x float> %select)
337 ret <2 x float> %fabs
338}
339
Craig Topper2b8f0512018-02-25 06:51:51 +0000340define float @fabs_select_negnan_negzero(i32 %c) {
Sanjay Patelb13fcd52018-02-13 18:22:53 +0000341; CHECK-LABEL: @fabs_select_negnan_negzero(
342; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[C:%.*]], 0
343; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], float 0xFFF8000000000000, float -0.000000e+00
344; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[SELECT]])
345; CHECK-NEXT: ret float [[FABS]]
346;
Matt Arsenault1e0edbf2017-01-11 00:33:24 +0000347 %cmp = icmp eq i32 %c, 0
348 %select = select i1 %cmp, float 0xFFF8000000000000, float -0.0
349 %fabs = call float @llvm.fabs.f32(float %select)
350 ret float %fabs
351}
352
Craig Topperaee341e2018-02-25 06:51:52 +0000353define <2 x float> @fabs_select_negnan_negzero_vector(i32 %c) {
354; CHECK-LABEL: @fabs_select_negnan_negzero_vector(
355; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[C:%.*]], 0
356; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], <2 x float> <float 0xFFF8000000000000, float 0xFFF8000000000000>, <2 x float> <float -0.000000e+00, float -0.000000e+00>
357; CHECK-NEXT: [[FABS:%.*]] = call <2 x float> @llvm.fabs.v2f32(<2 x float> [[SELECT]])
358; CHECK-NEXT: ret <2 x float> [[FABS]]
359;
360 %cmp = icmp eq i32 %c, 0
361 %select = select i1 %cmp, <2 x float> <float 0xFFF8000000000000, float 0xFFF8000000000000>, <2 x float> <float -0.0, float -0.0>
362 %fabs = call <2 x float> @llvm.fabs.v2f32(<2 x float> %select)
363 ret <2 x float> %fabs
364}
365
Craig Topper2b8f0512018-02-25 06:51:51 +0000366define float @fabs_select_negnan_zero(i32 %c) {
Sanjay Patelb13fcd52018-02-13 18:22:53 +0000367; CHECK-LABEL: @fabs_select_negnan_zero(
368; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[C:%.*]], 0
369; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], float 0xFFF8000000000000, float 0.000000e+00
370; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[SELECT]])
371; CHECK-NEXT: ret float [[FABS]]
372;
Matt Arsenault1e0edbf2017-01-11 00:33:24 +0000373 %cmp = icmp eq i32 %c, 0
374 %select = select i1 %cmp, float 0xFFF8000000000000, float 0.0
375 %fabs = call float @llvm.fabs.f32(float %select)
376 ret float %fabs
377}
Justin Lebar7e3184c2017-01-26 00:10:26 +0000378
Craig Topperaee341e2018-02-25 06:51:52 +0000379define <2 x float> @fabs_select_negnan_zero_vector(i32 %c) {
380; CHECK-LABEL: @fabs_select_negnan_zero_vector(
381; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[C:%.*]], 0
382; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], <2 x float> <float 0xFFF8000000000000, float 0xFFF8000000000000>, <2 x float> zeroinitializer
383; CHECK-NEXT: [[FABS:%.*]] = call <2 x float> @llvm.fabs.v2f32(<2 x float> [[SELECT]])
384; CHECK-NEXT: ret <2 x float> [[FABS]]
385;
386 %cmp = icmp eq i32 %c, 0
387 %select = select i1 %cmp, <2 x float> <float 0xFFF8000000000000, float 0xFFF8000000000000>, <2 x float> <float 0.0, float 0.0>
388 %fabs = call <2 x float> @llvm.fabs.v2f32(<2 x float> %select)
389 ret <2 x float> %fabs
390}
391
Justin Lebar7e3184c2017-01-26 00:10:26 +0000392; The fabs can't be eliminated because llvm.sqrt.f32 may return -0 or NaN with
393; an arbitrary sign bit.
Sanjay Patelb13fcd52018-02-13 18:22:53 +0000394define float @fabs_sqrt(float %a) {
395; CHECK-LABEL: @fabs_sqrt(
396; CHECK-NEXT: [[SQRT:%.*]] = call float @llvm.sqrt.f32(float [[A:%.*]])
397; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[SQRT]])
398; CHECK-NEXT: ret float [[FABS]]
399;
Justin Lebar7e3184c2017-01-26 00:10:26 +0000400 %sqrt = call float @llvm.sqrt.f32(float %a)
401 %fabs = call float @llvm.fabs.f32(float %sqrt)
402 ret float %fabs
403}
404
Justin Lebar7e3184c2017-01-26 00:10:26 +0000405; The fabs can't be eliminated because the nnan sqrt may still return -0.
Sanjay Patelb13fcd52018-02-13 18:22:53 +0000406define float @fabs_sqrt_nnan(float %a) {
407; CHECK-LABEL: @fabs_sqrt_nnan(
408; CHECK-NEXT: [[SQRT:%.*]] = call nnan float @llvm.sqrt.f32(float [[A:%.*]])
409; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[SQRT]])
410; CHECK-NEXT: ret float [[FABS]]
411;
Justin Lebar7e3184c2017-01-26 00:10:26 +0000412 %sqrt = call nnan float @llvm.sqrt.f32(float %a)
413 %fabs = call float @llvm.fabs.f32(float %sqrt)
414 ret float %fabs
415}
416
Justin Lebar7e3184c2017-01-26 00:10:26 +0000417; The fabs can't be eliminated because the nsz sqrt may still return NaN.
Sanjay Patelb13fcd52018-02-13 18:22:53 +0000418define float @fabs_sqrt_nsz(float %a) {
419; CHECK-LABEL: @fabs_sqrt_nsz(
420; CHECK-NEXT: [[SQRT:%.*]] = call nsz float @llvm.sqrt.f32(float [[A:%.*]])
421; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[SQRT]])
422; CHECK-NEXT: ret float [[FABS]]
423;
Justin Lebar7e3184c2017-01-26 00:10:26 +0000424 %sqrt = call nsz float @llvm.sqrt.f32(float %a)
425 %fabs = call float @llvm.fabs.f32(float %sqrt)
426 ret float %fabs
427}
428
Justin Lebar7e3184c2017-01-26 00:10:26 +0000429; The fabs can be eliminated because we're nsz and nnan.
Sanjay Patelb13fcd52018-02-13 18:22:53 +0000430define float @fabs_sqrt_nnan_nsz(float %a) {
431; CHECK-LABEL: @fabs_sqrt_nnan_nsz(
432; CHECK-NEXT: [[SQRT:%.*]] = call nnan nsz float @llvm.sqrt.f32(float [[A:%.*]])
433; CHECK-NEXT: ret float [[SQRT]]
434;
Justin Lebar7e3184c2017-01-26 00:10:26 +0000435 %sqrt = call nnan nsz float @llvm.sqrt.f32(float %a)
436 %fabs = call float @llvm.fabs.f32(float %sqrt)
437 ret float %fabs
438}
439
Justin Lebar7e3184c2017-01-26 00:10:26 +0000440; The second fabs can be eliminated because the operand to sqrt cannot be -0.
Sanjay Patelb13fcd52018-02-13 18:22:53 +0000441define float @fabs_sqrt_nnan_fabs(float %a) {
442; CHECK-LABEL: @fabs_sqrt_nnan_fabs(
443; CHECK-NEXT: [[B:%.*]] = call float @llvm.fabs.f32(float [[A:%.*]])
444; CHECK-NEXT: [[SQRT:%.*]] = call nnan float @llvm.sqrt.f32(float [[B]])
445; CHECK-NEXT: ret float [[SQRT]]
446;
Justin Lebar7e3184c2017-01-26 00:10:26 +0000447 %b = call float @llvm.fabs.f32(float %a)
448 %sqrt = call nnan float @llvm.sqrt.f32(float %b)
449 %fabs = call float @llvm.fabs.f32(float %sqrt)
450 ret float %fabs
451}
Craig Topper30199102018-02-27 19:53:45 +0000452
453define float @fabs_select_positive_constants_vector_extract(i32 %c) {
454; CHECK-LABEL: @fabs_select_positive_constants_vector_extract(
455; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[C:%.*]], 0
456; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], <2 x float> <float 1.000000e+00, float 1.000000e+00>, <2 x float> <float 2.000000e+00, float 2.000000e+00>
457; CHECK-NEXT: [[EXTRACT:%.*]] = extractelement <2 x float> [[SELECT]], i32 0
458; CHECK-NEXT: ret float [[EXTRACT]]
459;
460 %cmp = icmp eq i32 %c, 0
461 %select = select i1 %cmp, <2 x float> <float 1.0, float 1.0>, <2 x float> <float 2.0, float 2.0>
462 %extract = extractelement <2 x float> %select, i32 0
463 %fabs = call float @llvm.fabs.f32(float %extract)
464 ret float %fabs
465}