Skip to content

Commit 6dcece4

Browse files
davemgreentstellar
authored andcommitted
[GlobalISel][AArch64] Fix fptoi.sat lowering. (llvm#127901)
The SDAG version uses fminnum/fmaxnum, in converting it to fcmp+select it appears the order of the operands was chosen badly. This switches the conditions used to keep the constant on the RHS. (cherry picked from commit 70ed381)
1 parent 05cce88 commit 6dcece4

File tree

5 files changed

+158
-158
lines changed

5 files changed

+158
-158
lines changed

llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7801,13 +7801,13 @@ LegalizerHelper::lowerFPTOINT_SAT(MachineInstr &MI) {
78017801
if (AreExactFloatBounds) {
78027802
// Clamp Src by MinFloat from below. If Src is NaN the result is MinFloat.
78037803
auto MaxC = MIRBuilder.buildFConstant(SrcTy, MinFloat);
7804-
auto MaxP = MIRBuilder.buildFCmp(CmpInst::FCMP_ULT,
7804+
auto MaxP = MIRBuilder.buildFCmp(CmpInst::FCMP_OGT,
78057805
SrcTy.changeElementSize(1), Src, MaxC);
78067806
auto Max = MIRBuilder.buildSelect(SrcTy, MaxP, Src, MaxC);
78077807
// Clamp by MaxFloat from above. NaN cannot occur.
78087808
auto MinC = MIRBuilder.buildFConstant(SrcTy, MaxFloat);
78097809
auto MinP =
7810-
MIRBuilder.buildFCmp(CmpInst::FCMP_OGT, SrcTy.changeElementSize(1), Max,
7810+
MIRBuilder.buildFCmp(CmpInst::FCMP_OLT, SrcTy.changeElementSize(1), Max,
78117811
MinC, MachineInstr::FmNoNans);
78127812
auto Min =
78137813
MIRBuilder.buildSelect(SrcTy, MinP, Max, MinC, MachineInstr::FmNoNans);

llvm/test/CodeGen/AArch64/fptosi-sat-scalar.ll

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -987,25 +987,25 @@ define i32 @test_signed_f128_i32(fp128 %f) {
987987
; CHECK-GI-NEXT: adrp x8, .LCPI30_1
988988
; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
989989
; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI30_1]
990-
; CHECK-GI-NEXT: bl __getf2
990+
; CHECK-GI-NEXT: bl __gttf2
991991
; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload
992992
; CHECK-GI-NEXT: cmp w0, #0
993993
; CHECK-GI-NEXT: mov x9, #-4603241769126068224 // =0xc01e000000000000
994994
; CHECK-GI-NEXT: fmov x8, d0
995-
; CHECK-GI-NEXT: csel x19, x8, xzr, lt
995+
; CHECK-GI-NEXT: csel x19, x8, xzr, gt
996996
; CHECK-GI-NEXT: mov x8, v0.d[1]
997997
; CHECK-GI-NEXT: mov v0.d[0], x19
998-
; CHECK-GI-NEXT: csel x20, x8, x9, lt
998+
; CHECK-GI-NEXT: csel x20, x8, x9, gt
999999
; CHECK-GI-NEXT: adrp x8, .LCPI30_0
10001000
; CHECK-GI-NEXT: mov v0.d[1], x20
10011001
; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI30_0]
1002-
; CHECK-GI-NEXT: bl __gttf2
1002+
; CHECK-GI-NEXT: bl __lttf2
10031003
; CHECK-GI-NEXT: cmp w0, #0
1004-
; CHECK-GI-NEXT: csel x8, x19, xzr, gt
1004+
; CHECK-GI-NEXT: csel x8, x19, xzr, lt
10051005
; CHECK-GI-NEXT: mov v0.d[0], x8
10061006
; CHECK-GI-NEXT: mov x8, #281474976448512 // =0xfffffffc0000
10071007
; CHECK-GI-NEXT: movk x8, #16413, lsl #48
1008-
; CHECK-GI-NEXT: csel x8, x20, x8, gt
1008+
; CHECK-GI-NEXT: csel x8, x20, x8, lt
10091009
; CHECK-GI-NEXT: mov v0.d[1], x8
10101010
; CHECK-GI-NEXT: bl __fixtfsi
10111011
; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload

0 commit comments

Comments
 (0)