Skip to content

Commit 9b72dc0

Browse files
committed
Ensure test functions are not NOPs
Previously, when optimizing fmax(x, nan) -> x, the functions would return immediately, since the input parameter x to the function is already in the necessary register for output. To make the transformations more explicit, instead add a 2nd argument to the outer function, so that a MOV instruction is needed to take arg1 -> reg0. This makes the transformation easier to read than just making the entire function a NOP.
1 parent e88374d commit 9b72dc0

File tree

4 files changed

+80
-38
lines changed

4 files changed

+80
-38
lines changed

llvm/test/CodeGen/X86/fmaxnum.ll

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -645,20 +645,32 @@ define float @test_maxnum_const_op2(float %x) {
645645
ret float %r
646646
}
647647

648-
define float @test_maxnum_const_nan(float %x) {
649-
; CHECK-LABEL: test_maxnum_const_nan:
650-
; CHECK: # %bb.0:
651-
; CHECK-NEXT: retq
652-
%r = call float @llvm.maxnum.f32(float %x, float 0x7fff000000000000)
648+
define float @test_maxnum_const_nan(float %x, float %y) {
649+
; SSE-LABEL: test_maxnum_const_nan:
650+
; SSE: # %bb.0:
651+
; SSE-NEXT: movaps %xmm1, %xmm0
652+
; SSE-NEXT: retq
653+
;
654+
; AVX-LABEL: test_maxnum_const_nan:
655+
; AVX: # %bb.0:
656+
; AVX-NEXT: vmovaps %xmm1, %xmm0
657+
; AVX-NEXT: retq
658+
%r = call float @llvm.maxnum.f32(float %y, float 0x7fff000000000000)
653659
ret float %r
654660
}
655661

656-
; nnan maxnum(X, -inf) -> X
657-
define float @test_maxnum_neg_inf_nnan(float %x) nounwind {
658-
; CHECK-LABEL: test_maxnum_neg_inf_nnan:
659-
; CHECK: # %bb.0:
660-
; CHECK-NEXT: retq
661-
%r = call nnan float @llvm.maxnum.f32(float %x, float 0xfff0000000000000)
662+
; nnan maxnum(Y, -inf) -> Y
663+
define float @test_maxnum_neg_inf_nnan(float %x, float %y) nounwind {
664+
; SSE-LABEL: test_maxnum_neg_inf_nnan:
665+
; SSE: # %bb.0:
666+
; SSE-NEXT: movaps %xmm1, %xmm0
667+
; SSE-NEXT: retq
668+
;
669+
; AVX-LABEL: test_maxnum_neg_inf_nnan:
670+
; AVX: # %bb.0:
671+
; AVX-NEXT: vmovaps %xmm1, %xmm0
672+
; AVX-NEXT: retq
673+
%r = call nnan float @llvm.maxnum.f32(float %y, float 0xfff0000000000000)
662674
ret float %r
663675
}
664676

llvm/test/CodeGen/X86/fminimum-fmaximum.ll

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2650,47 +2650,53 @@ define <4 x bfloat> @test_fmaximum_v4bf16(<4 x bfloat> %x, <4 x bfloat> %y) {
26502650
ret <4 x bfloat> %r
26512651
}
26522652

2653-
; nnan minimum(X, +inf) -> X
2654-
define float @test_fminimum_inf_nnan(float %x) nounwind {
2653+
; nnan minimum(Y, +inf) -> Y
2654+
define float @test_fminimum_inf_nnan(float %x, float %y) nounwind {
26552655
; SSE2-LABEL: test_fminimum_inf_nnan:
26562656
; SSE2: # %bb.0:
2657+
; SSE2-NEXT: movaps %xmm1, %xmm0
26572658
; SSE2-NEXT: retq
26582659
;
26592660
; AVX-LABEL: test_fminimum_inf_nnan:
26602661
; AVX: # %bb.0:
2662+
; AVX-NEXT: vmovaps %xmm1, %xmm0
26612663
; AVX-NEXT: retq
26622664
;
26632665
; AVX10_2-LABEL: test_fminimum_inf_nnan:
26642666
; AVX10_2: # %bb.0:
2667+
; AVX10_2-NEXT: vmovaps %xmm1, %xmm0
26652668
; AVX10_2-NEXT: retq
26662669
;
26672670
; X86-LABEL: test_fminimum_inf_nnan:
26682671
; X86: # %bb.0:
26692672
; X86-NEXT: flds {{[0-9]+}}(%esp)
26702673
; X86-NEXT: retl
2671-
%1 = call nnan float @llvm.minimum.f32(float %x, float 0x7ff0000000000000)
2674+
%1 = call nnan float @llvm.minimum.f32(float %y, float 0x7ff0000000000000)
26722675
ret float %1
26732676
}
26742677

2675-
; nnan maximum(X, -inf) -> X
2676-
define float @test_fmaximum_neg_inf_nnan(float %x) nounwind {
2678+
; nnan maximum(Y, -inf) -> Y
2679+
define float @test_fmaximum_neg_inf_nnan(float %x, float %y) nounwind {
26772680
; SSE2-LABEL: test_fmaximum_neg_inf_nnan:
26782681
; SSE2: # %bb.0:
2682+
; SSE2-NEXT: movaps %xmm1, %xmm0
26792683
; SSE2-NEXT: retq
26802684
;
26812685
; AVX-LABEL: test_fmaximum_neg_inf_nnan:
26822686
; AVX: # %bb.0:
2687+
; AVX-NEXT: vmovaps %xmm1, %xmm0
26832688
; AVX-NEXT: retq
26842689
;
26852690
; AVX10_2-LABEL: test_fmaximum_neg_inf_nnan:
26862691
; AVX10_2: # %bb.0:
2692+
; AVX10_2-NEXT: vmovaps %xmm1, %xmm0
26872693
; AVX10_2-NEXT: retq
26882694
;
26892695
; X86-LABEL: test_fmaximum_neg_inf_nnan:
26902696
; X86: # %bb.0:
26912697
; X86-NEXT: flds {{[0-9]+}}(%esp)
26922698
; X86-NEXT: retl
2693-
%1 = call nnan float @llvm.maximum.f32(float %x, float 0xfff0000000000000)
2699+
%1 = call nnan float @llvm.maximum.f32(float %y, float 0xfff0000000000000)
26942700
ret float %1
26952701
}
26962702

llvm/test/CodeGen/X86/fminimumnum-fmaximumnum.ll

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2480,89 +2480,101 @@ define <4 x bfloat> @test_fmaximumnum_v4bf16(<4 x bfloat> %x, <4 x bfloat> %y) n
24802480
ret <4 x bfloat> %r
24812481
}
24822482

2483-
; nnan minimumnum(X, +inf) -> X
2484-
define float @test_fminimumnum_inf_nnan(float %x) nounwind {
2483+
; nnan minimumnum(Y, +inf) -> Y
2484+
define float @test_fminimumnum_inf_nnan(float %x, float %y) nounwind {
24852485
; SSE2-LABEL: test_fminimumnum_inf_nnan:
24862486
; SSE2: # %bb.0:
2487+
; SSE2-NEXT: movaps %xmm1, %xmm0
24872488
; SSE2-NEXT: retq
24882489
;
24892490
; AVX-LABEL: test_fminimumnum_inf_nnan:
24902491
; AVX: # %bb.0:
2492+
; AVX-NEXT: vmovaps %xmm1, %xmm0
24912493
; AVX-NEXT: retq
24922494
;
24932495
; AVX10_2-LABEL: test_fminimumnum_inf_nnan:
24942496
; AVX10_2: # %bb.0:
2497+
; AVX10_2-NEXT: vmovaps %xmm1, %xmm0
24952498
; AVX10_2-NEXT: retq
24962499
;
24972500
; X86-LABEL: test_fminimumnum_inf_nnan:
24982501
; X86: # %bb.0:
24992502
; X86-NEXT: flds {{[0-9]+}}(%esp)
25002503
; X86-NEXT: retl
2501-
%1 = call nnan float @llvm.minimumnum.f32(float %x, float 0x7ff0000000000000)
2504+
%1 = call nnan float @llvm.minimumnum.f32(float %y, float 0x7ff0000000000000)
25022505
ret float %1
25032506
}
25042507

2505-
; nnan maximumnum(X, -inf) -> X
2506-
define float @test_fmaximumnum_neg_inf_nnan(float %x) nounwind {
2508+
; nnan maximumnum(Y, -inf) -> Y
2509+
define float @test_fmaximumnum_neg_inf_nnan(float %x, float %y) nounwind {
25072510
; SSE2-LABEL: test_fmaximumnum_neg_inf_nnan:
25082511
; SSE2: # %bb.0:
2512+
; SSE2-NEXT: movaps %xmm1, %xmm0
25092513
; SSE2-NEXT: retq
25102514
;
25112515
; AVX-LABEL: test_fmaximumnum_neg_inf_nnan:
25122516
; AVX: # %bb.0:
2517+
; AVX-NEXT: vmovaps %xmm1, %xmm0
25132518
; AVX-NEXT: retq
25142519
;
25152520
; AVX10_2-LABEL: test_fmaximumnum_neg_inf_nnan:
25162521
; AVX10_2: # %bb.0:
2522+
; AVX10_2-NEXT: vmovaps %xmm1, %xmm0
25172523
; AVX10_2-NEXT: retq
25182524
;
25192525
; X86-LABEL: test_fmaximumnum_neg_inf_nnan:
25202526
; X86: # %bb.0:
25212527
; X86-NEXT: flds {{[0-9]+}}(%esp)
25222528
; X86-NEXT: retl
2523-
%1 = call nnan float @llvm.maximumnum.f32(float %x, float 0xfff0000000000000)
2529+
%1 = call nnan float @llvm.maximumnum.f32(float %y, float 0xfff0000000000000)
25242530
ret float %1
25252531
}
25262532

25272533
; Test we propagate the non-NaN arg, even if one arg is SNaN
2528-
define float @test_fmaximumnum_snan(float %x) {
2534+
define float @test_fmaximumnum_snan(float %x, float %y) {
25292535
; SSE2-LABEL: test_fmaximumnum_snan:
25302536
; SSE2: # %bb.0:
2537+
; SSE2-NEXT: movaps %xmm1, %xmm0
25312538
; SSE2-NEXT: retq
25322539
;
25332540
; AVX-LABEL: test_fmaximumnum_snan:
25342541
; AVX: # %bb.0:
2542+
; AVX-NEXT: vmovaps %xmm1, %xmm0
25352543
; AVX-NEXT: retq
25362544
;
25372545
; AVX10_2-LABEL: test_fmaximumnum_snan:
25382546
; AVX10_2: # %bb.0:
2547+
; AVX10_2-NEXT: vmovaps %xmm1, %xmm0
25392548
; AVX10_2-NEXT: retq
25402549
;
25412550
; X86-LABEL: test_fmaximumnum_snan:
25422551
; X86: # %bb.0:
25432552
; X86-NEXT: flds {{[0-9]+}}(%esp)
25442553
; X86-NEXT: retl
2545-
%1 = tail call float @llvm.maximumnum.f32(float 0x7ff4000000000000, float %x)
2554+
%1 = tail call float @llvm.maximumnum.f32(float 0x7ff4000000000000, float %y)
25462555
ret float %1
25472556
}
25482557

2549-
define float @test_fminimumnum_snan(float %x) {
2558+
define float @test_fminimumnum_snan(float %x, float %y) {
25502559
; SSE2-LABEL: test_fminimumnum_snan:
25512560
; SSE2: # %bb.0:
2561+
; SSE2-NEXT: movaps %xmm1, %xmm0
25522562
; SSE2-NEXT: retq
25532563
;
25542564
; AVX-LABEL: test_fminimumnum_snan:
25552565
; AVX: # %bb.0:
2566+
; AVX-NEXT: vmovaps %xmm1, %xmm0
25562567
; AVX-NEXT: retq
25572568
;
25582569
; AVX10_2-LABEL: test_fminimumnum_snan:
25592570
; AVX10_2: # %bb.0:
2571+
; AVX10_2-NEXT: vmovaps %xmm1, %xmm0
25602572
; AVX10_2-NEXT: retq
25612573
;
25622574
; X86-LABEL: test_fminimumnum_snan:
25632575
; X86: # %bb.0:
25642576
; X86-NEXT: flds {{[0-9]+}}(%esp)
25652577
; X86-NEXT: retl
2566-
%1 = tail call float @llvm.minimumnum.f32(float 0x7ff4000000000000, float %x)
2578+
%1 = tail call float @llvm.minimumnum.f32(float 0x7ff4000000000000, float %y)
25672579
ret float %1
25682580
}

llvm/test/CodeGen/X86/fminnum.ll

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -645,20 +645,32 @@ define float @test_minnum_const_op2(float %x) {
645645
ret float %r
646646
}
647647

648-
define float @test_minnum_const_nan(float %x) {
649-
; CHECK-LABEL: test_minnum_const_nan:
650-
; CHECK: # %bb.0:
651-
; CHECK-NEXT: retq
652-
%r = call float @llvm.minnum.f32(float %x, float 0x7fff000000000000)
648+
define float @test_minnum_const_nan(float %x, float %y) {
649+
; SSE-LABEL: test_minnum_const_nan:
650+
; SSE: # %bb.0:
651+
; SSE-NEXT: movaps %xmm1, %xmm0
652+
; SSE-NEXT: retq
653+
;
654+
; AVX-LABEL: test_minnum_const_nan:
655+
; AVX: # %bb.0:
656+
; AVX-NEXT: vmovaps %xmm1, %xmm0
657+
; AVX-NEXT: retq
658+
%r = call float @llvm.minnum.f32(float %y, float 0x7fff000000000000)
653659
ret float %r
654660
}
655661

656-
; nnan minnum(X, +inf) -> X
657-
define float @test_minnum_inf_nnan(float %x) nounwind {
658-
; CHECK-LABEL: test_minnum_inf_nnan:
659-
; CHECK: # %bb.0:
660-
; CHECK-NEXT: retq
661-
%r = call nnan float @llvm.minnum.f32(float %x, float 0x7ff0000000000000)
662+
; nnan minnum(Y, +inf) -> Y
663+
define float @test_minnum_inf_nnan(float %x, float %y) nounwind {
664+
; SSE-LABEL: test_minnum_inf_nnan:
665+
; SSE: # %bb.0:
666+
; SSE-NEXT: movaps %xmm1, %xmm0
667+
; SSE-NEXT: retq
668+
;
669+
; AVX-LABEL: test_minnum_inf_nnan:
670+
; AVX: # %bb.0:
671+
; AVX-NEXT: vmovaps %xmm1, %xmm0
672+
; AVX-NEXT: retq
673+
%r = call nnan float @llvm.minnum.f32(float %y, float 0x7ff0000000000000)
662674
ret float %r
663675
}
664676

0 commit comments

Comments
 (0)