Skip to content

Commit 6d4bb20

Browse files
authored
[X86] Invalid fp16 comparison fix (#160304)
Missing `VCMPPHZrrik`, `VCMPPHZ128rrik`, and `VCMPPHZ256rrik` opcodes in `commuteInstructionImpl` and `findCommutedOpIndices` led to improper handling of compare instruction during optimization. Operands were commuted, but swapping of the immediate was not called. Fixes: #159723
1 parent 1ed6be6 commit 6d4bb20

File tree

2 files changed

+10
-4
lines changed

2 files changed

+10
-4
lines changed

llvm/lib/Target/X86/X86InstrInfo.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2573,10 +2573,13 @@ MachineInstr *X86InstrInfo::commuteInstructionImpl(MachineInstr &MI, bool NewMI,
25732573
case X86::VCMPPSZ256rri:
25742574
case X86::VCMPPDZrrik:
25752575
case X86::VCMPPSZrrik:
2576+
case X86::VCMPPHZrrik:
25762577
case X86::VCMPPDZ128rrik:
25772578
case X86::VCMPPSZ128rrik:
2579+
case X86::VCMPPHZ128rrik:
25782580
case X86::VCMPPDZ256rrik:
25792581
case X86::VCMPPSZ256rrik:
2582+
case X86::VCMPPHZ256rrik:
25802583
WorkingMI = CloneIfNew(MI);
25812584
WorkingMI->getOperand(MI.getNumExplicitOperands() - 1)
25822585
.setImm(X86::getSwappedVCMPImm(
@@ -2830,10 +2833,13 @@ bool X86InstrInfo::findCommutedOpIndices(const MachineInstr &MI,
28302833
case X86::VCMPPSZ256rri:
28312834
case X86::VCMPPDZrrik:
28322835
case X86::VCMPPSZrrik:
2836+
case X86::VCMPPHZrrik:
28332837
case X86::VCMPPDZ128rrik:
28342838
case X86::VCMPPSZ128rrik:
2839+
case X86::VCMPPHZ128rrik:
28352840
case X86::VCMPPDZ256rrik:
2836-
case X86::VCMPPSZ256rrik: {
2841+
case X86::VCMPPSZ256rrik:
2842+
case X86::VCMPPHZ256rrik: {
28372843
unsigned OpOffset = X86II::isKMasked(Desc.TSFlags) ? 1 : 0;
28382844

28392845
// Float comparison can be safely commuted for

llvm/test/CodeGen/X86/pr159723.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ define <8 x i1> @test_cmp_v8half_ogt(<8 x half> %rhs, <8 x i1> %mask) nounwind {
1717
; CHECK-NEXT: kmovw %k1, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill
1818
; CHECK-NEXT: callq test_call_8@PLT
1919
; CHECK-NEXT: kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 # 2-byte Reload
20-
; CHECK-NEXT: vcmpltph {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %k0 {%k1} # 16-byte Folded Reload
20+
; CHECK-NEXT: vcmpgtph {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %k0 {%k1} # 16-byte Folded Reload
2121
; CHECK-NEXT: vpmovm2w %k0, %xmm0
2222
; CHECK-NEXT: addq $40, %rsp
2323
; CHECK-NEXT: retq
@@ -79,7 +79,7 @@ define <16 x i1> @test_cmp_v16half_olt_commute(<16 x half> %rhs, <16 x i1> %mask
7979
; CHECK-NEXT: kmovw %k1, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill
8080
; CHECK-NEXT: callq test_call_16@PLT
8181
; CHECK-NEXT: kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 # 2-byte Reload
82-
; CHECK-NEXT: vcmpltph {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %k0 {%k1} # 32-byte Folded Reload
82+
; CHECK-NEXT: vcmpgtph {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %k0 {%k1} # 32-byte Folded Reload
8383
; CHECK-NEXT: vpmovm2b %k0, %xmm0
8484
; CHECK-NEXT: addq $56, %rsp
8585
; CHECK-NEXT: vzeroupper
@@ -100,7 +100,7 @@ define <32 x i1> @test_cmp_v32half_oge(<32 x half> %rhs, <32 x i1> %mask) nounwi
100100
; CHECK-NEXT: kmovd %k1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
101101
; CHECK-NEXT: callq test_call_32@PLT
102102
; CHECK-NEXT: kmovd {{[-0-9]+}}(%r{{[sb]}}p), %k1 # 4-byte Reload
103-
; CHECK-NEXT: vcmpleph {{[-0-9]+}}(%r{{[sb]}}p), %zmm0, %k0 {%k1} # 64-byte Folded Reload
103+
; CHECK-NEXT: vcmpgeph {{[-0-9]+}}(%r{{[sb]}}p), %zmm0, %k0 {%k1} # 64-byte Folded Reload
104104
; CHECK-NEXT: vpmovm2b %k0, %ymm0
105105
; CHECK-NEXT: addq $88, %rsp
106106
; CHECK-NEXT: retq

0 commit comments

Comments
 (0)