[InstCombine] Preserve signbit semantics of NaN with fold to fabs (#1… · llvm/llvm-project@f4779c3 (original) (raw)
`@@ -256,19 +256,54 @@ define double @select_fcmp_ole_zero(double %x) {
`
256
256
`; CHECK-LABEL: @select_fcmp_ole_zero(
`
257
257
`; CHECK-NEXT: [[FABS:%.]] = call double @llvm.fabs.f64(double [[X:%.]])
`
258
258
`; CHECK-NEXT: ret double [[FABS]]
`
``
259
`+
;
`
``
260
`+
%lezero = fcmp nnan ole double %x, 0.0
`
``
261
`+
%negx = fsub double 0.0, %x
`
``
262
`+
%fabs = select i1 %lezero, double %negx, double %x
`
``
263
`+
ret double %fabs
`
``
264
`+
}
`
``
265
+
``
266
`+
define double @select_fcmp_ole_zero_no_nnan(double %x) {
`
``
267
`+
; CHECK-LABEL: @select_fcmp_ole_zero_no_nnan(
`
``
268
`+
; CHECK-NEXT: [[LEZERO:%.]] = fcmp ole double [[X:%.]], 0.000000e+00
`
``
269
`+
; CHECK-NEXT: [[NEGX:%.*]] = fsub double 0.000000e+00, [[X]]
`
``
270
`+
; CHECK-NEXT: [[FABS:%.*]] = select i1 [[LEZERO]], double [[NEGX]], double [[X]]
`
``
271
`+
; CHECK-NEXT: ret double [[FABS]]
`
259
272
`;
`
260
273
`%lezero = fcmp ole double %x, 0.0
`
261
274
`%negx = fsub double 0.0, %x
`
262
275
`%fabs = select i1 %lezero, double %negx, double %x
`
263
276
`ret double %fabs
`
264
277
`}
`
265
278
``
``
279
`+
define double @select_fcmp_ole_zero_no_nnan_input_nofpclass_nan(double nofpclass(nan) %x) {
`
``
280
`+
; CHECK-LABEL: @select_fcmp_ole_zero_no_nnan_input_nofpclass_nan(
`
``
281
`+
; CHECK-NEXT: [[FABS:%.]] = call double @llvm.fabs.f64(double [[X:%.]])
`
``
282
`+
; CHECK-NEXT: ret double [[FABS]]
`
``
283
`+
;
`
``
284
`+
%lezero = fcmp ole double %x, 0.0
`
``
285
`+
%negx = fsub double 0.0, %x
`
``
286
`+
%fabs = select i1 %lezero, double %negx, double %x
`
``
287
`+
ret double %fabs
`
``
288
`+
}
`
``
289
+
``
290
`+
define double @select_fcmp_ole_zero_select_nnan(double %x) {
`
``
291
`+
; CHECK-LABEL: @select_fcmp_ole_zero_select_nnan(
`
``
292
`+
; CHECK-NEXT: [[FABS:%.]] = call nnan double @llvm.fabs.f64(double [[X:%.]])
`
``
293
`+
; CHECK-NEXT: ret double [[FABS]]
`
``
294
`+
;
`
``
295
`+
%lezero = fcmp ole double %x, 0.0
`
``
296
`+
%negx = fsub double 0.0, %x
`
``
297
`+
%fabs = select nnan i1 %lezero, double %negx, double %x
`
``
298
`+
ret double %fabs
`
``
299
`+
}
`
``
300
+
266
301
`define double @select_fcmp_nnan_ole_zero(double %x) {
`
267
302
`; CHECK-LABEL: @select_fcmp_nnan_ole_zero(
`
268
303
`; CHECK-NEXT: [[FABS:%.]] = call double @llvm.fabs.f64(double [[X:%.]])
`
269
304
`; CHECK-NEXT: ret double [[FABS]]
`
270
305
`;
`
271
``
`-
%lezero = fcmp ole double %x, 0.0
`
``
306
`+
%lezero = fcmp nnan ole double %x, 0.0
`
272
307
`%negx = fsub nnan double 0.0, %x
`
273
308
`%fabs = select i1 %lezero, double %negx, double %x
`
274
309
`ret double %fabs
`
`@@ -279,7 +314,7 @@ define double @select_nnan_fcmp_nnan_ole_zero(double %x) {
`
279
314
`; CHECK-NEXT: [[FABS:%.]] = call nnan double @llvm.fabs.f64(double [[X:%.]])
`
280
315
`; CHECK-NEXT: ret double [[FABS]]
`
281
316
`;
`
282
``
`-
%lezero = fcmp ole double %x, 0.0
`
``
317
`+
%lezero = fcmp nnan ole double %x, 0.0
`
283
318
`%negx = fsub nnan double 0.0, %x
`
284
319
`%fabs = select nnan i1 %lezero, double %negx, double %x
`
285
320
`ret double %fabs
`
`@@ -292,7 +327,7 @@ define double @select_fcmp_nnan_ule_zero(double %x) {
`
292
327
`; CHECK-NEXT: [[FABS:%.]] = call double @llvm.fabs.f64(double [[X:%.]])
`
293
328
`; CHECK-NEXT: ret double [[FABS]]
`
294
329
`;
`
295
``
`-
%lezero = fcmp ule double %x, 0.0
`
``
330
`+
%lezero = fcmp nnan ule double %x, 0.0
`
296
331
`%negx = fsub nnan double 0.0, %x
`
297
332
`%fabs = select i1 %lezero, double %negx, double %x
`
298
333
`ret double %fabs
`
`@@ -320,7 +355,7 @@ define <2 x float> @select_fcmp_nnan_ole_negzero(<2 x float> %x) {
`
320
355
`; CHECK-NEXT: [[FABS:%.]] = call <2 x float> @llvm.fabs.v2f32(<2 x float> [[X:%.]])
`
321
356
`; CHECK-NEXT: ret <2 x float> [[FABS]]
`
322
357
`;
`
323
``
`-
%lezero = fcmp ole <2 x float> %x, <float -0.0, float -0.0>
`
``
358
`+
%lezero = fcmp nnan ole <2 x float> %x, <float -0.0, float -0.0>
`
324
359
`%negx = fsub nnan <2 x float> <float 0.0, float poison>, %x
`
325
360
`%fabs = select <2 x i1> %lezero, <2 x float> %negx, <2 x float> %x
`
326
361
`ret <2 x float> %fabs
`
`@@ -331,7 +366,7 @@ define <2 x float> @select_nnan_fcmp_nnan_ole_negzero(<2 x float> %x) {
`
331
366
`; CHECK-NEXT: [[FABS:%.]] = call nnan <2 x float> @llvm.fabs.v2f32(<2 x float> [[X:%.]])
`
332
367
`; CHECK-NEXT: ret <2 x float> [[FABS]]
`
333
368
`;
`
334
``
`-
%lezero = fcmp ole <2 x float> %x, <float -0.0, float -0.0>
`
``
369
`+
%lezero = fcmp nnan ole <2 x float> %x, <float -0.0, float -0.0>
`
335
370
`%negx = fsub nnan <2 x float> <float 0.0, float poison>, %x
`
336
371
`%fabs = select nnan <2 x i1> %lezero, <2 x float> %negx, <2 x float> %x
`
337
372
`ret <2 x float> %fabs
`
`@@ -344,7 +379,7 @@ define fp128 @select_fcmp_ogt_zero(fp128 %x) {
`
344
379
`; CHECK-NEXT: [[FABS:%.]] = call fp128 @llvm.fabs.f128(fp128 [[X:%.]])
`
345
380
`; CHECK-NEXT: ret fp128 [[FABS]]
`
346
381
`;
`
347
``
`-
%gtzero = fcmp ogt fp128 %x, zeroinitializer
`
``
382
`+
%gtzero = fcmp nnan ogt fp128 %x, zeroinitializer
`
348
383
`%negx = fsub fp128 zeroinitializer, %x
`
349
384
`%fabs = select i1 %gtzero, fp128 %x, fp128 %negx
`
350
385
`ret fp128 %fabs
`
`@@ -382,7 +417,7 @@ define fp128 @select_fcmp_nnan_ogt_zero(fp128 %x) {
`
382
417
`; CHECK-NEXT: [[FABS:%.]] = call fp128 @llvm.fabs.f128(fp128 [[X:%.]])
`
383
418
`; CHECK-NEXT: ret fp128 [[FABS]]
`
384
419
`;
`
385
``
`-
%gtzero = fcmp ogt fp128 %x, zeroinitializer
`
``
420
`+
%gtzero = fcmp nnan ogt fp128 %x, zeroinitializer
`
386
421
`%negx = fsub nnan fp128 zeroinitializer, %x
`
387
422
`%fabs = select i1 %gtzero, fp128 %x, fp128 %negx
`
388
423
`ret fp128 %fabs
`
`@@ -393,7 +428,7 @@ define fp128 @select_nnan_fcmp_nnan_ogt_zero(fp128 %x) {
`
393
428
`; CHECK-NEXT: [[FABS:%.]] = call nnan fp128 @llvm.fabs.f128(fp128 [[X:%.]])
`
394
429
`; CHECK-NEXT: ret fp128 [[FABS]]
`
395
430
`;
`
396
``
`-
%gtzero = fcmp ogt fp128 %x, zeroinitializer
`
``
431
`+
%gtzero = fcmp nnan ogt fp128 %x, zeroinitializer
`
397
432
`%negx = fsub nnan fp128 zeroinitializer, %x
`
398
433
`%fabs = select nnan i1 %gtzero, fp128 %x, fp128 %negx
`
399
434
`ret fp128 %fabs
`
`@@ -406,7 +441,7 @@ define half @select_fcmp_nnan_ogt_negzero(half %x) {
`
406
441
`; CHECK-NEXT: [[FABS:%.]] = call half @llvm.fabs.f16(half [[X:%.]])
`
407
442
`; CHECK-NEXT: ret half [[FABS]]
`
408
443
`;
`
409
``
`-
%gtzero = fcmp ogt half %x, -0.0
`
``
444
`+
%gtzero = fcmp nnan ogt half %x, -0.0
`
410
445
`%negx = fsub nnan half 0.0, %x
`
411
446
`%fabs = select i1 %gtzero, half %x, half %negx
`
412
447
`ret half %fabs
`
`@@ -417,7 +452,7 @@ define half @select_nnan_fcmp_nnan_ogt_negzero(half %x) {
`
417
452
`; CHECK-NEXT: [[FABS:%.]] = call nnan half @llvm.fabs.f16(half [[X:%.]])
`
418
453
`; CHECK-NEXT: ret half [[FABS]]
`
419
454
`;
`
420
``
`-
%gtzero = fcmp ogt half %x, -0.0
`
``
455
`+
%gtzero = fcmp nnan ogt half %x, -0.0
`
421
456
`%negx = fsub nnan half 0.0, %x
`
422
457
`%fabs = select nnan i1 %gtzero, half %x, half %negx
`
423
458
`ret half %fabs
`
`@@ -430,7 +465,7 @@ define half @select_fcmp_nnan_ugt_negzero(half %x) {
`
430
465
`; CHECK-NEXT: [[FABS:%.]] = call half @llvm.fabs.f16(half [[X:%.]])
`
431
466
`; CHECK-NEXT: ret half [[FABS]]
`
432
467
`;
`
433
``
`-
%gtzero = fcmp ugt half %x, -0.0
`
``
468
`+
%gtzero = fcmp nnan ugt half %x, -0.0
`
434
469
`%negx = fsub nnan half 0.0, %x
`
435
470
`%fabs = select i1 %gtzero, half %x, half %negx
`
436
471
`ret half %fabs
`