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:
parent
d4955d9b95
commit
c52ff1a825
@ -522,9 +522,6 @@ MipsTargetLowering::MipsTargetLowering(const MipsTargetMachine &TM,
|
|||||||
|
|
||||||
setOperationAction(ISD::TRAP, MVT::Other, Legal);
|
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,
|
setTargetDAGCombine({ISD::SDIVREM, ISD::UDIVREM, ISD::SELECT, ISD::AND,
|
||||||
ISD::OR, ISD::ADD, ISD::SUB, ISD::AssertZext, ISD::SHL,
|
ISD::OR, ISD::ADD, ISD::SUB, ISD::AssertZext, ISD::SHL,
|
||||||
ISD::SIGN_EXTEND});
|
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::FP_TO_SINT: return lowerFP_TO_SINT(Op, DAG);
|
||||||
case ISD::READCYCLECOUNTER:
|
case ISD::READCYCLECOUNTER:
|
||||||
return lowerREADCYCLECOUNTER(Op, DAG);
|
return lowerREADCYCLECOUNTER(Op, DAG);
|
||||||
case ISD::ConstantFP:
|
|
||||||
return lowerConstantFP(Op, DAG);
|
|
||||||
}
|
}
|
||||||
return SDValue();
|
return SDValue();
|
||||||
}
|
}
|
||||||
@ -3019,30 +3014,6 @@ SDValue MipsTargetLowering::lowerFP_TO_SINT(SDValue Op,
|
|||||||
return DAG.getNode(ISD::BITCAST, SDLoc(Op), Op.getValueType(), Trunc);
|
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
|
// Calling Convention Implementation
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
@ -592,7 +592,6 @@ class TargetRegisterClass;
|
|||||||
SDValue lowerEH_DWARF_CFA(SDValue Op, SelectionDAG &DAG) const;
|
SDValue lowerEH_DWARF_CFA(SDValue Op, SelectionDAG &DAG) const;
|
||||||
SDValue lowerFP_TO_SINT(SDValue Op, SelectionDAG &DAG) const;
|
SDValue lowerFP_TO_SINT(SDValue Op, SelectionDAG &DAG) const;
|
||||||
SDValue lowerREADCYCLECOUNTER(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
|
/// isEligibleForTailCallOptimization - Check whether the call is eligible
|
||||||
/// for tail call optimization.
|
/// for tail call optimization.
|
||||||
|
25
llvm/test/CodeGen/Mips/nan_lowering.ll
Normal file
25
llvm/test/CodeGen/Mips/nan_lowering.ll
Normal 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)
|
||||||
|
}
|
@ -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
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user