@@ -904,7 +904,7 @@ unsigned getCmpOperandFoldingProfit(Register CmpOp, MachineRegisterInfo &MRI) {
904904// Helper function for matchFpTruncFpTrunc.
905905// Checks that the given definition belongs to an FPTRUNC and that the source is
906906// not an integer, as no rounding is necessary due to the range of values
907- bool checkTruncSrc (MachineRegisterInfo &MRI, MachineInstr *MaybeFpTrunc) {
907+ bool isFPTruncFromDouble (MachineRegisterInfo &MRI, MachineInstr *MaybeFpTrunc) {
908908 if (!MaybeFpTrunc || MaybeFpTrunc->getOpcode () != TargetOpcode::G_FPTRUNC)
909909 return false ;
910910
@@ -930,8 +930,7 @@ bool checkTruncSrc(MachineRegisterInfo &MRI, MachineInstr *MaybeFpTrunc) {
930930// truncating an FP that came from an integer this is not a problem as the range
931931// of values is lower in the int
932932bool matchFpTruncFpTrunc (MachineInstr &MI, MachineRegisterInfo &MRI) {
933- if (MI.getOpcode () != TargetOpcode::G_FPTRUNC)
934- return false ;
933+ assert (MI.getOpcode () == TargetOpcode::G_FPTRUNC && " Expected G_FPTRUNC" );
935934
936935 // Check the destination is 16 bits as we only want to match a very specific
937936 // pattern
@@ -959,10 +958,9 @@ bool matchFpTruncFpTrunc(MachineInstr &MI, MachineRegisterInfo &MRI) {
959958 for (unsigned OpIdx = 1 , NumOperands = ParentDef->getNumOperands ();
960959 OpIdx != NumOperands; ++OpIdx) {
961960 Register FpTruncDst = ParentDef->getOperand (OpIdx).getReg ();
962-
963961 FpTruncDef = getDefIgnoringCopies (FpTruncDst, MRI);
964962
965- if (!checkTruncSrc (MRI, FpTruncDef))
963+ if (!isFPTruncFromDouble (MRI, FpTruncDef))
966964 return false ;
967965 }
968966
@@ -973,41 +971,43 @@ bool matchFpTruncFpTrunc(MachineInstr &MI, MachineRegisterInfo &MRI) {
973971 Register VecExtractDst = ParentDef->getOperand (2 ).getReg ();
974972 MachineInstr *VecExtractDef = getDefIgnoringCopies (VecExtractDst, MRI);
975973
974+ if (!VecExtractDef ||
975+ VecExtractDef->getOpcode () != TargetOpcode::G_EXTRACT_VECTOR_ELT)
976+ return false ;
977+
976978 Register FpTruncDst = VecExtractDef->getOperand (1 ).getReg ();
977979 FpTruncDef = getDefIgnoringCopies (FpTruncDst, MRI);
978-
979- if (!checkTruncSrc (MRI, FpTruncDef))
980- return false ;
981980 break ;
982981 }
983982 case TargetOpcode::G_FPTRUNC: {
984983 Register FpTruncDst = ParentDef->getOperand (1 ).getReg ();
985984 FpTruncDef = getDefIgnoringCopies (FpTruncDst, MRI);
986-
987- if (!checkTruncSrc (MRI, FpTruncDef))
988- return false ;
989985 break ;
990986 }
991987 }
992988
989+ if (!isFPTruncFromDouble (MRI, FpTruncDef))
990+ return false ;
991+
993992 return true ;
994993}
995994
996995void applyFpTruncFpTrunc (MachineInstr &MI, MachineRegisterInfo &MRI,
997996 MachineIRBuilder &B) {
997+ assert (MI.getOpcode () == TargetOpcode::G_FPTRUNC && " Expected G_FPTRUNC" );
998998 Register Dst = MI.getOperand (0 ).getReg ();
999999 Register Src = MI.getOperand (1 ).getReg ();
10001000
1001+ MachineInstr *ParentDef = getDefIgnoringCopies (Src, MRI);
1002+ if (!ParentDef)
1003+ return ;
1004+
10011005 LLT V2F32 = LLT::fixed_vector (2 , LLT::scalar (32 ));
10021006 LLT V4F32 = LLT::fixed_vector (4 , LLT::scalar (32 ));
10031007 LLT V4F16 = LLT::fixed_vector (4 , LLT::scalar (16 ));
10041008
10051009 B.setInstrAndDebugLoc (MI);
10061010
1007- MachineInstr *ParentDef = getDefIgnoringCopies (Src, MRI);
1008- if (!ParentDef)
1009- return ;
1010-
10111011 switch (ParentDef->getOpcode ()) {
10121012 default :
10131013 return ;
@@ -1056,8 +1056,6 @@ void applyFpTruncFpTrunc(MachineInstr &MI, MachineRegisterInfo &MRI,
10561056 Register HiFp64 = FpTrunc2Def->getOperand (1 ).getReg ();
10571057 MRI.setRegClass (HiFp64, &AArch64::FPR128RegClass);
10581058
1059- B.setInstrAndDebugLoc (MI);
1060-
10611059 // Convert the lower half
10621060 Register LoFp32 = MRI.createGenericVirtualRegister (V2F32);
10631061 MRI.setRegClass (LoFp32, &AArch64::FPR64RegClass);
0 commit comments