@@ -700,7 +700,7 @@ static unsigned removeCopies(const MachineRegisterInfo &MRI, unsigned VReg) {
700700// csel instruction. If so, return the folded opcode, and the replacement
701701// register.
702702static unsigned canFoldIntoCSel (const MachineRegisterInfo &MRI, unsigned VReg,
703- unsigned *NewVReg = nullptr ) {
703+ unsigned *NewReg = nullptr ) {
704704 VReg = removeCopies (MRI, VReg);
705705 if (!Register::isVirtualRegister (VReg))
706706 return 0 ;
@@ -724,8 +724,13 @@ static unsigned canFoldIntoCSel(const MachineRegisterInfo &MRI, unsigned VReg,
724724 DefMI = MRI.getVRegDef (DefMI->getOperand (2 ).getReg ());
725725 if (DefMI->getOpcode () != AArch64::MOVi32imm)
726726 return 0 ;
727- // fall-through to MOVi32imm case.
728- [[fallthrough]];
727+ if (!DefMI->getOperand (1 ).isImm () || DefMI->getOperand (1 ).getImm () != 1 )
728+ return 0 ;
729+ assert (Is64Bit);
730+ SrcReg = AArch64::XZR;
731+ Opc = AArch64::CSINCXr;
732+ break ;
733+
729734 case AArch64::MOVi32imm:
730735 case AArch64::MOVi64imm:
731736 if (!DefMI->getOperand (1 ).isImm () || DefMI->getOperand (1 ).getImm () != 1 )
@@ -786,8 +791,8 @@ static unsigned canFoldIntoCSel(const MachineRegisterInfo &MRI, unsigned VReg,
786791 }
787792 assert (Opc && SrcReg && " Missing parameters" );
788793
789- if (NewVReg )
790- *NewVReg = SrcReg;
794+ if (NewReg )
795+ *NewReg = SrcReg;
791796 return Opc;
792797}
793798
@@ -988,30 +993,30 @@ void AArch64InstrInfo::insertSelect(MachineBasicBlock &MBB,
988993
989994 // Try folding simple instructions into the csel.
990995 if (TryFold) {
991- unsigned NewVReg = 0 ;
992- unsigned FoldedOpc = canFoldIntoCSel (MRI, TrueReg, &NewVReg );
996+ unsigned NewReg = 0 ;
997+ unsigned FoldedOpc = canFoldIntoCSel (MRI, TrueReg, &NewReg );
993998 if (FoldedOpc) {
994999 // The folded opcodes csinc, csinc and csneg apply the operation to
9951000 // FalseReg, so we need to invert the condition.
9961001 CC = AArch64CC::getInvertedCondCode (CC);
9971002 TrueReg = FalseReg;
9981003 } else
999- FoldedOpc = canFoldIntoCSel (MRI, FalseReg, &NewVReg );
1004+ FoldedOpc = canFoldIntoCSel (MRI, FalseReg, &NewReg );
10001005
10011006 // Fold the operation. Leave any dead instructions for DCE to clean up.
10021007 if (FoldedOpc) {
10031008 // NewVReg might be XZR/WZR. In that case create a COPY into a virtual
10041009 // register.
1005- if (!Register::isVirtualRegister (NewVReg )) {
1006- unsigned ZeroReg = NewVReg ;
1007- NewVReg = MRI.createVirtualRegister (RC);
1008- BuildMI (MBB, I, DL, get (TargetOpcode::COPY), NewVReg ).addReg (ZeroReg);
1010+ if (!Register::isVirtualRegister (NewReg )) {
1011+ unsigned ZeroReg = NewReg ;
1012+ NewReg = MRI.createVirtualRegister (RC);
1013+ BuildMI (MBB, I, DL, get (TargetOpcode::COPY), NewReg ).addReg (ZeroReg);
10091014 }
10101015
1011- FalseReg = NewVReg ;
1016+ FalseReg = NewReg ;
10121017 Opc = FoldedOpc;
10131018 // The extends the live range of NewVReg.
1014- MRI.clearKillFlags (NewVReg );
1019+ MRI.clearKillFlags (NewReg );
10151020 }
10161021 }
10171022
0 commit comments