Skip to content

Commit 3669f1f

Browse files
committed
replace isKnownNeverNaN impl
1 parent 9247a2c commit 3669f1f

File tree

6 files changed

+20
-94
lines changed

6 files changed

+20
-94
lines changed

llvm/include/llvm/CodeGen/GlobalISel/Utils.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -336,12 +336,12 @@ bool isKnownToBeAPowerOfTwo(Register Val, const MachineRegisterInfo &MRI,
336336

337337
/// Returns true if \p Val can be assumed to never be a NaN. If \p SNaN is true,
338338
/// this returns if \p Val can be assumed to never be a signaling NaN.
339-
bool isKnownNeverNaN(Register Val, const MachineRegisterInfo &MRI,
339+
bool isKnownNeverNaN(Register Val, const MachineRegisterInfo &MRI, GISelValueTracking *ValueTracking,
340340
bool SNaN = false);
341341

342342
/// Returns true if \p Val can be assumed to never be a signaling NaN.
343-
inline bool isKnownNeverSNaN(Register Val, const MachineRegisterInfo &MRI) {
344-
return isKnownNeverNaN(Val, MRI, true);
343+
inline bool isKnownNeverSNaN(Register Val, const MachineRegisterInfo &MRI, GISelValueTracking *ValueTracking) {
344+
return isKnownNeverNaN(Val, MRI, ValueTracking, true);
345345
}
346346

347347
Align inferAlignFromPtrInfo(MachineFunction &MF, const MachinePointerInfo &MPO);

llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6519,8 +6519,8 @@ unsigned CombinerHelper::getFPMinMaxOpcForSelect(
65196519
CombinerHelper::SelectPatternNaNBehaviour
65206520
CombinerHelper::computeRetValAgainstNaN(Register LHS, Register RHS,
65216521
bool IsOrderedComparison) const {
6522-
bool LHSSafe = isKnownNeverNaN(LHS, MRI);
6523-
bool RHSSafe = isKnownNeverNaN(RHS, MRI);
6522+
bool LHSSafe = isKnownNeverNaN(LHS, MRI, VT);
6523+
bool RHSSafe = isKnownNeverNaN(RHS, MRI, VT);
65246524
// Completely unsafe.
65256525
if (!LHSSafe && !RHSSafe)
65266526
return SelectPatternNaNBehaviour::NOT_APPLICABLE;

llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8179,10 +8179,10 @@ LegalizerHelper::lowerFMinNumMaxNum(MachineInstr &MI) {
81798179
// Note this must be done here, and not as an optimization combine in the
81808180
// absence of a dedicate quiet-snan instruction as we're using an
81818181
// omni-purpose G_FCANONICALIZE.
8182-
if (!isKnownNeverSNaN(Src0, MRI))
8182+
if (!isKnownNeverSNaN(Src0, MRI, VT))
81838183
Src0 = MIRBuilder.buildFCanonicalize(Ty, Src0, MI.getFlags()).getReg(0);
81848184

8185-
if (!isKnownNeverSNaN(Src1, MRI))
8185+
if (!isKnownNeverSNaN(Src1, MRI, VT))
81868186
Src1 = MIRBuilder.buildFCanonicalize(Ty, Src1, MI.getFlags()).getReg(0);
81878187
}
81888188

llvm/lib/CodeGen/GlobalISel/Utils.cpp

Lines changed: 7 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "llvm/CodeGen/GlobalISel/Utils.h"
1313
#include "llvm/ADT/APFloat.h"
1414
#include "llvm/ADT/APInt.h"
15+
#include "llvm/ADT/FloatingPointMode.h"
1516
#include "llvm/Analysis/ValueTracking.h"
1617
#include "llvm/CodeGen/CodeGenCommonISel.h"
1718
#include "llvm/CodeGen/GlobalISel/GISelChangeObserver.h"
@@ -806,88 +807,13 @@ llvm::ConstantFoldVectorBinop(unsigned Opcode, const Register Op1,
806807
return FoldedElements;
807808
}
808809

809-
bool llvm::isKnownNeverNaN(Register Val, const MachineRegisterInfo &MRI,
810+
bool llvm::isKnownNeverNaN(Register Val, const MachineRegisterInfo &MRI, GISelValueTracking *VT,
810811
bool SNaN) {
811-
const MachineInstr *DefMI = MRI.getVRegDef(Val);
812-
if (!DefMI)
813-
return false;
814-
815-
const TargetMachine& TM = DefMI->getMF()->getTarget();
816-
if (DefMI->getFlag(MachineInstr::FmNoNans) || TM.Options.NoNaNsFPMath)
817-
return true;
818-
819-
// If the value is a constant, we can obviously see if it is a NaN or not.
820-
if (const ConstantFP *FPVal = getConstantFPVRegVal(Val, MRI)) {
821-
return !FPVal->getValueAPF().isNaN() ||
822-
(SNaN && !FPVal->getValueAPF().isSignaling());
823-
}
824-
825-
if (DefMI->getOpcode() == TargetOpcode::G_BUILD_VECTOR) {
826-
for (const auto &Op : DefMI->uses())
827-
if (!isKnownNeverNaN(Op.getReg(), MRI, SNaN))
828-
return false;
829-
return true;
830-
}
831-
832-
switch (DefMI->getOpcode()) {
833-
default:
834-
break;
835-
case TargetOpcode::G_FADD:
836-
case TargetOpcode::G_FSUB:
837-
case TargetOpcode::G_FMUL:
838-
case TargetOpcode::G_FDIV:
839-
case TargetOpcode::G_FREM:
840-
case TargetOpcode::G_FSIN:
841-
case TargetOpcode::G_FCOS:
842-
case TargetOpcode::G_FTAN:
843-
case TargetOpcode::G_FACOS:
844-
case TargetOpcode::G_FASIN:
845-
case TargetOpcode::G_FATAN:
846-
case TargetOpcode::G_FATAN2:
847-
case TargetOpcode::G_FCOSH:
848-
case TargetOpcode::G_FSINH:
849-
case TargetOpcode::G_FTANH:
850-
case TargetOpcode::G_FMA:
851-
case TargetOpcode::G_FMAD:
852-
if (SNaN)
853-
return true;
854-
855-
// TODO: Need isKnownNeverInfinity
856-
return false;
857-
case TargetOpcode::G_FMINNUM_IEEE:
858-
case TargetOpcode::G_FMAXNUM_IEEE: {
859-
if (SNaN)
860-
return true;
861-
// This can return a NaN if either operand is an sNaN, or if both operands
862-
// are NaN.
863-
return (isKnownNeverNaN(DefMI->getOperand(1).getReg(), MRI) &&
864-
isKnownNeverSNaN(DefMI->getOperand(2).getReg(), MRI)) ||
865-
(isKnownNeverSNaN(DefMI->getOperand(1).getReg(), MRI) &&
866-
isKnownNeverNaN(DefMI->getOperand(2).getReg(), MRI));
867-
}
868-
case TargetOpcode::G_FMINNUM:
869-
case TargetOpcode::G_FMAXNUM: {
870-
// Only one needs to be known not-nan, since it will be returned if the
871-
// other ends up being one.
872-
return isKnownNeverNaN(DefMI->getOperand(1).getReg(), MRI, SNaN) ||
873-
isKnownNeverNaN(DefMI->getOperand(2).getReg(), MRI, SNaN);
874-
}
875-
}
876-
877-
if (SNaN) {
878-
// FP operations quiet. For now, just handle the ones inserted during
879-
// legalization.
880-
switch (DefMI->getOpcode()) {
881-
case TargetOpcode::G_FPEXT:
882-
case TargetOpcode::G_FPTRUNC:
883-
case TargetOpcode::G_FCANONICALIZE:
884-
return true;
885-
default:
886-
return false;
887-
}
888-
}
889-
890-
return false;
812+
KnownFPClass FPClass = VT->computeKnownFPClass(Val, fcNan);
813+
if (SNaN)
814+
return FPClass.isKnownNever(fcSNan);
815+
816+
return FPClass.isKnownNeverNaN();
891817
}
892818

893819
Align llvm::inferAlignFromPtrInfo(MachineFunction &MF,

llvm/lib/Target/AMDGPU/AMDGPUInstructions.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -859,7 +859,7 @@ class NeverNaNPats<dag ops, list<dag> frags> : PatFrags<ops, frags> {
859859
return CurDAG->isKnownNeverNaN(SDValue(N,0));
860860
}];
861861
let GISelPredicateCode = [{
862-
return isKnownNeverNaN(MI.getOperand(0).getReg(), MRI);
862+
return isKnownNeverNaN(MI.getOperand(0).getReg(), MRI, VT);
863863
}];
864864
}
865865

llvm/lib/Target/AMDGPU/AMDGPURegBankCombiner.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ bool AMDGPURegBankCombinerImpl::matchFPMinMaxToMed3(
261261
// nodes(max/min) have same behavior when one input is NaN and other isn't.
262262
// Don't consider max(min(SNaN, K1), K0) since there is no isKnownNeverQNaN,
263263
// also post-legalizer inputs to min/max are fcanonicalized (never SNaN).
264-
if ((getIEEE() && isFminnumIeee(MI)) || isKnownNeverNaN(Dst, MRI)) {
264+
if ((getIEEE() && isFminnumIeee(MI)) || isKnownNeverNaN(Dst, MRI, VT)) {
265265
// Don't fold single use constant that can't be inlined.
266266
if ((!MRI.hasOneNonDBGUse(K0->VReg) || TII.isInlineConstant(K0->Value)) &&
267267
(!MRI.hasOneNonDBGUse(K1->VReg) || TII.isInlineConstant(K1->Value))) {
@@ -291,8 +291,8 @@ bool AMDGPURegBankCombinerImpl::matchFPMinMaxToClamp(MachineInstr &MI,
291291
// For IEEE=true consider NaN inputs. Only min(max(QNaN, 0.0), 1.0) evaluates
292292
// to 0.0 requires dx10_clamp = true.
293293
if ((getIEEE() && getDX10Clamp() && isFminnumIeee(MI) &&
294-
isKnownNeverSNaN(Val, MRI)) ||
295-
isKnownNeverNaN(MI.getOperand(0).getReg(), MRI)) {
294+
isKnownNeverSNaN(Val, MRI, VT)) ||
295+
isKnownNeverNaN(MI.getOperand(0).getReg(), MRI, VT)) {
296296
Reg = Val;
297297
return true;
298298
}
@@ -338,9 +338,9 @@ bool AMDGPURegBankCombinerImpl::matchFPMed3ToClamp(MachineInstr &MI,
338338
// no NaN inputs. Most often MI is marked with nnan fast math flag.
339339
// For IEEE=true consider NaN inputs. Requires dx10_clamp = true. Safe to fold
340340
// when Val could be QNaN. If Val can also be SNaN third input should be 0.0.
341-
if (isKnownNeverNaN(MI.getOperand(0).getReg(), MRI) ||
341+
if (isKnownNeverNaN(MI.getOperand(0).getReg(), MRI, VT) ||
342342
(getIEEE() && getDX10Clamp() &&
343-
(isKnownNeverSNaN(Val, MRI) || isOp3Zero()))) {
343+
(isKnownNeverSNaN(Val, MRI, VT) || isOp3Zero()))) {
344344
Reg = Val;
345345
return true;
346346
}

0 commit comments

Comments
 (0)