@@ -80,13 +80,13 @@ class RISCVInitUndef : public MachineFunctionPass {
80
80
private:
81
81
bool processBasicBlock (MachineFunction &MF, MachineBasicBlock &MBB,
82
82
const DeadLaneDetector &DLD);
83
- bool handleImplicitDef (MachineBasicBlock &MBB,
84
- MachineBasicBlock::iterator &Inst);
85
83
bool isVectorRegClass (const Register R);
86
84
const TargetRegisterClass *
87
85
getVRLargestSuperClass (const TargetRegisterClass *RC) const ;
88
86
bool handleSubReg (MachineFunction &MF, MachineInstr &MI,
89
87
const DeadLaneDetector &DLD);
88
+ bool fixupIllOperand (MachineInstr *MI, MachineOperand &MO);
89
+ bool handleReg (MachineInstr *MI);
90
90
};
91
91
92
92
} // end anonymous namespace
@@ -137,53 +137,30 @@ static bool isEarlyClobberMI(MachineInstr &MI) {
137
137
});
138
138
}
139
139
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 ;
157
144
}
145
+ return false ;
146
+ }
158
147
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 ;
181
159
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);
185
162
}
186
- return true ;
163
+ return Changed ;
187
164
}
188
165
189
166
bool RISCVInitUndef::handleSubReg (MachineFunction &MF, MachineInstr &MI,
@@ -248,6 +225,23 @@ bool RISCVInitUndef::handleSubReg(MachineFunction &MF, MachineInstr &MI,
248
225
return Changed;
249
226
}
250
227
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
+
251
245
bool RISCVInitUndef::processBasicBlock (MachineFunction &MF,
252
246
MachineBasicBlock &MBB,
253
247
const DeadLaneDetector &DLD) {
@@ -274,12 +268,10 @@ bool RISCVInitUndef::processBasicBlock(MachineFunction &MF,
274
268
}
275
269
}
276
270
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);
283
275
}
284
276
}
285
277
return Changed;
0 commit comments