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::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
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -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.
|
||||
|
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