Revert "[MIPS]Fix QNaNs in the MIPS legacy NaN encodings" (#150773)

Reverts llvm/llvm-project#139829.

We can't just randomly change the value of constants during lowering.

Fixes https://github.com/llvm/llvm-project/issues/149295.

(cherry picked from commit 525090e83ca392753d371602b5e64f06e7debd9a)
This commit is contained in:
Nikita Popov 2025-07-28 10:36:40 +02:00 committed by Tobias Hieta
parent d4955d9b95
commit c52ff1a825
4 changed files with 25 additions and 44 deletions

View File

@ -522,9 +522,6 @@ MipsTargetLowering::MipsTargetLowering(const MipsTargetMachine &TM,
setOperationAction(ISD::TRAP, MVT::Other, Legal);
setOperationAction(ISD::ConstantFP, MVT::f32, Custom);
setOperationAction(ISD::ConstantFP, MVT::f64, Custom);
setTargetDAGCombine({ISD::SDIVREM, ISD::UDIVREM, ISD::SELECT, ISD::AND,
ISD::OR, ISD::ADD, ISD::SUB, ISD::AssertZext, ISD::SHL,
ISD::SIGN_EXTEND});
@ -1360,8 +1357,6 @@ LowerOperation(SDValue Op, SelectionDAG &DAG) const
case ISD::FP_TO_SINT: return lowerFP_TO_SINT(Op, DAG);
case ISD::READCYCLECOUNTER:
return lowerREADCYCLECOUNTER(Op, DAG);
case ISD::ConstantFP:
return lowerConstantFP(Op, DAG);
}
return SDValue();
}
@ -3019,30 +3014,6 @@ SDValue MipsTargetLowering::lowerFP_TO_SINT(SDValue Op,
return DAG.getNode(ISD::BITCAST, SDLoc(Op), Op.getValueType(), Trunc);
}
SDValue MipsTargetLowering::lowerConstantFP(SDValue Op,
SelectionDAG &DAG) const {
SDLoc DL(Op);
EVT VT = Op.getSimpleValueType();
SDNode *N = Op.getNode();
ConstantFPSDNode *CFP = cast<ConstantFPSDNode>(N);
if (!CFP->isNaN() || Subtarget.isNaN2008()) {
return SDValue();
}
APFloat NaNValue = CFP->getValueAPF();
auto &Sem = NaNValue.getSemantics();
// The MSB of the mantissa should be zero for QNaNs in the MIPS legacy NaN
// encodings, and one for sNaNs. Check every NaN constants and make sure
// they are correctly encoded for legacy encodings.
if (!NaNValue.isSignaling()) {
APFloat RealQNaN = NaNValue.getSNaN(Sem);
return DAG.getConstantFP(RealQNaN, DL, VT);
}
return SDValue();
}
//===----------------------------------------------------------------------===//
// Calling Convention Implementation
//===----------------------------------------------------------------------===//

View File

@ -592,7 +592,6 @@ class TargetRegisterClass;
SDValue lowerEH_DWARF_CFA(SDValue Op, SelectionDAG &DAG) const;
SDValue lowerFP_TO_SINT(SDValue Op, SelectionDAG &DAG) const;
SDValue lowerREADCYCLECOUNTER(SDValue Op, SelectionDAG &DAG) const;
SDValue lowerConstantFP(SDValue Op, SelectionDAG &DAG) const;
/// isEligibleForTailCallOptimization - Check whether the call is eligible
/// for tail call optimization.

View File

@ -0,0 +1,25 @@
; RUN: llc -mtriple=mips-linux-gnu -mattr=-nan2008 < %s | FileCheck %s
; RUN: llc -mtriple=mips-linux-gnu -mattr=+nan2008 < %s | FileCheck %s
; Make sure that lowering does not corrupt the value of NaN values,
; regardless of what the NaN mode is.
define float @test1() {
; CHECK: .4byte 0x7fc00000
ret float bitcast (i32 u0x7fc00000 to float)
}
define float @test2() {
; CHECK: .4byte 0x7fc00001
ret float bitcast (i32 u0x7fc00001 to float)
}
define float @test3() {
; CHECK: .4byte 0x7f800000
ret float bitcast (i32 u0x7f800000 to float)
}
define float @test4() {
; CHECK: .4byte 0x7f800001
ret float bitcast (i32 u0x7f800001 to float)
}

View File

@ -1,14 +0,0 @@
; RUN: llc -O3 -mcpu=mips32r2 -mtriple=mips-linux-gnu < %s -o - | FileCheck %s -check-prefixes=MIPS_Legacy
; RUN: llc -O3 -mcpu=mips32r2 -mtriple=mips-linux-gnu -mattr=+nan2008 < %s -o - | FileCheck %s -check-prefixes=MIPS_NaN2008
define dso_local float @nan(float noundef %a, float noundef %b) local_unnamed_addr #0 {
; MIPS_Legacy: $CPI0_0:
; MIPS_Legacy-NEXT: .4byte 0x7fa00000 # float NaN
; MIPS_NaN2008: $CPI0_0:
; MIPS_NaN2008-NEXT: .4byte 0x7fc00000 # float NaN
entry:
%0 = tail call float @llvm.minimum.f32(float %a, float %b)
ret float %0
}