@@ -80,13 +80,13 @@ class RISCVInitUndef : public MachineFunctionPass {
8080private:
8181 bool processBasicBlock (MachineFunction &MF, MachineBasicBlock &MBB,
8282 const DeadLaneDetector &DLD);
83- bool handleImplicitDef (MachineBasicBlock &MBB,
84- MachineBasicBlock::iterator &Inst);
8583 bool isVectorRegClass (const Register R);
8684 const TargetRegisterClass *
8785 getVRLargestSuperClass (const TargetRegisterClass *RC) const ;
8886 bool handleSubReg (MachineFunction &MF, MachineInstr &MI,
8987 const DeadLaneDetector &DLD);
88+ bool fixupIllOperand (MachineInstr *MI, MachineOperand &MO);
89+ bool handleReg (MachineInstr *MI);
9090};
9191
9292} // end anonymous namespace
@@ -137,53 +137,30 @@ static bool isEarlyClobberMI(MachineInstr &MI) {
137137 });
138138}
139139
140- bool RISCVInitUndef::handleImplicitDef (MachineBasicBlock &MBB,
141- MachineBasicBlock::iterator &Inst) {
142- assert (Inst->getOpcode () == TargetOpcode::IMPLICIT_DEF);
143-
144- Register Reg = Inst->getOperand (0 ).getReg ();
145- if (!Reg.isVirtual ())
146- return false ;
147-
148- bool HasOtherUse = false ;
149- SmallVector<MachineOperand *, 1 > UseMOs;
150- for (MachineOperand &MO : MRI->use_nodbg_operands (Reg)) {
151- if (isEarlyClobberMI (*MO.getParent ())) {
152- if (MO.isUse () && !MO.isTied ())
153- UseMOs.push_back (&MO);
154- else
155- HasOtherUse = true ;
156- }
140+ static bool findImplictDefMIFromReg (Register Reg, MachineRegisterInfo *MRI) {
141+ for (auto &DefMI : MRI->def_instructions (Reg)) {
142+ if (DefMI.getOpcode () == TargetOpcode::IMPLICIT_DEF)
143+ return true ;
157144 }
145+ return false ;
146+ }
158147
159- if (UseMOs.empty ())
160- return false ;
161-
162- LLVM_DEBUG (
163- dbgs () << " Emitting PseudoRVVInitUndef for implicit vector register "
164- << Reg << ' \n ' );
165-
166- const TargetRegisterClass *TargetRegClass =
167- getVRLargestSuperClass (MRI->getRegClass (Reg));
168- unsigned Opcode = getUndefInitOpcode (TargetRegClass->getID ());
169-
170- Register NewDest = Reg;
171- if (HasOtherUse) {
172- NewDest = MRI->createVirtualRegister (TargetRegClass);
173- // We don't have a way to update dead lanes, so keep track of the
174- // new register so that we avoid querying it later.
175- NewRegs.insert (NewDest);
176- }
177- BuildMI (MBB, Inst, Inst->getDebugLoc (), TII->get (Opcode), NewDest);
178-
179- if (!HasOtherUse)
180- DeadInsts.push_back (&(*Inst));
148+ bool RISCVInitUndef::handleReg (MachineInstr *MI) {
149+ bool Changed = false ;
150+ for (auto &UseMO : MI->uses ()) {
151+ if (!UseMO.isReg ())
152+ continue ;
153+ if (UseMO.isTied ())
154+ continue ;
155+ if (!UseMO.getReg ().isVirtual ())
156+ continue ;
157+ if (!isVectorRegClass (UseMO.getReg ()))
158+ continue ;
181159
182- for (auto MO : UseMOs) {
183- MO->setReg (NewDest);
184- MO->setIsUndef (false );
160+ if (UseMO.isUndef () || findImplictDefMIFromReg (UseMO.getReg (), MRI))
161+ Changed |= fixupIllOperand (MI, UseMO);
185162 }
186- return true ;
163+ return Changed ;
187164}
188165
189166bool RISCVInitUndef::handleSubReg (MachineFunction &MF, MachineInstr &MI,
@@ -248,6 +225,23 @@ bool RISCVInitUndef::handleSubReg(MachineFunction &MF, MachineInstr &MI,
248225 return Changed;
249226}
250227
228+ bool RISCVInitUndef::fixupIllOperand (MachineInstr *MI, MachineOperand &MO) {
229+
230+ LLVM_DEBUG (
231+ dbgs () << " Emitting PseudoRVVInitUndef for implicit vector register "
232+ << MO.getReg () << ' \n ' );
233+
234+ const TargetRegisterClass *TargetRegClass =
235+ getVRLargestSuperClass (MRI->getRegClass (MO.getReg ()));
236+ unsigned Opcode = getUndefInitOpcode (TargetRegClass->getID ());
237+ Register NewReg = MRI->createVirtualRegister (TargetRegClass);
238+ BuildMI (*MI->getParent (), MI, MI->getDebugLoc (), TII->get (Opcode), NewReg);
239+ MO.setReg (NewReg);
240+ if (MO.isUndef ())
241+ MO.setIsUndef (false );
242+ return true ;
243+ }
244+
251245bool RISCVInitUndef::processBasicBlock (MachineFunction &MF,
252246 MachineBasicBlock &MBB,
253247 const DeadLaneDetector &DLD) {
@@ -274,12 +268,10 @@ bool RISCVInitUndef::processBasicBlock(MachineFunction &MF,
274268 }
275269 }
276270
277- if (ST->enableSubRegLiveness () && isEarlyClobberMI (MI))
278- Changed |= handleSubReg (MF, MI, DLD);
279- if (MI.isImplicitDef ()) {
280- auto DstReg = MI.getOperand (0 ).getReg ();
281- if (DstReg.isVirtual () && isVectorRegClass (DstReg))
282- Changed |= handleImplicitDef (MBB, I);
271+ if (isEarlyClobberMI (MI)) {
272+ if (ST->enableSubRegLiveness ())
273+ Changed |= handleSubReg (MF, MI, DLD);
274+ Changed |= handleReg (&MI);
283275 }
284276 }
285277 return Changed;
0 commit comments