|
12 | 12 | #include "llvm/CodeGen/GlobalISel/Utils.h" |
13 | 13 | #include "llvm/ADT/APFloat.h" |
14 | 14 | #include "llvm/ADT/APInt.h" |
| 15 | +#include "llvm/ADT/FloatingPointMode.h" |
15 | 16 | #include "llvm/Analysis/ValueTracking.h" |
16 | 17 | #include "llvm/CodeGen/CodeGenCommonISel.h" |
17 | 18 | #include "llvm/CodeGen/GlobalISel/GISelChangeObserver.h" |
@@ -806,88 +807,13 @@ llvm::ConstantFoldVectorBinop(unsigned Opcode, const Register Op1, |
806 | 807 | return FoldedElements; |
807 | 808 | } |
808 | 809 |
|
809 | | -bool llvm::isKnownNeverNaN(Register Val, const MachineRegisterInfo &MRI, |
| 810 | +bool llvm::isKnownNeverNaN(Register Val, const MachineRegisterInfo &MRI, GISelValueTracking *VT, |
810 | 811 | 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(); |
891 | 817 | } |
892 | 818 |
|
893 | 819 | Align llvm::inferAlignFromPtrInfo(MachineFunction &MF, |
|
0 commit comments