1 //===- DetectDeadLanes.cpp - SubRegister Lane Usage Analysis --*- C++ -*---===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 /// \file
11 /// Analysis that tracks defined/used subregister lanes across COPY instructions
12 /// and instructions that get lowered to a COPY (PHI, REG_SEQUENCE,
13 /// INSERT_SUBREG, EXTRACT_SUBREG).
14 /// The information is used to detect dead definitions and the usage of
15 /// (completely) undefined values and mark the operands as such.
16 /// This pass is necessary because the dead/undef status is not obvious anymore
17 /// when subregisters are involved.
18 ///
19 /// Example:
20 /// %0 = some definition
21 /// %1 = IMPLICIT_DEF
22 /// %2 = REG_SEQUENCE %0, sub0, %1, sub1
23 /// %3 = EXTRACT_SUBREG %2, sub1
24 /// = use %3
25 /// The %0 definition is dead and %3 contains an undefined value.
26 //
27 //===----------------------------------------------------------------------===//
28
29 #include <deque>
30 #include <vector>
31
32 #include "llvm/ADT/BitVector.h"
33 #include "llvm/ADT/SetVector.h"
34 #include "llvm/CodeGen/MachineFunctionPass.h"
35 #include "llvm/CodeGen/MachineRegisterInfo.h"
36 #include "llvm/CodeGen/Passes.h"
37 #include "llvm/CodeGen/TargetRegisterInfo.h"
38 #include "llvm/CodeGen/TargetSubtargetInfo.h"
39 #include "llvm/InitializePasses.h"
40 #include "llvm/Pass.h"
41 #include "llvm/PassRegistry.h"
42 #include "llvm/Support/Debug.h"
43 #include "llvm/Support/raw_ostream.h"
44
45 using namespace llvm;
46
47 #define DEBUG_TYPE "detect-dead-lanes"
48
49 namespace {
50
51 /// Contains a bitmask of which lanes of a given virtual register are
52 /// defined and which ones are actually used.
53 struct VRegInfo {
54 LaneBitmask UsedLanes;
55 LaneBitmask DefinedLanes;
56 };
57
58 class DetectDeadLanes : public MachineFunctionPass {
59 public:
60 bool runOnMachineFunction(MachineFunction &MF) override;
61
62 static char ID;
DetectDeadLanes()63 DetectDeadLanes() : MachineFunctionPass(ID) {}
64
getPassName() const65 StringRef getPassName() const override { return "Detect Dead Lanes"; }
66
getAnalysisUsage(AnalysisUsage & AU) const67 void getAnalysisUsage(AnalysisUsage &AU) const override {
68 AU.setPreservesCFG();
69 MachineFunctionPass::getAnalysisUsage(AU);
70 }
71
72 private:
73 /// Add used lane bits on the register used by operand \p MO. This translates
74 /// the bitmask based on the operands subregister, and puts the register into
75 /// the worklist if any new bits were added.
76 void addUsedLanesOnOperand(const MachineOperand &MO, LaneBitmask UsedLanes);
77
78 /// Given a bitmask \p UsedLanes for the used lanes on a def output of a
79 /// COPY-like instruction determine the lanes used on the use operands
80 /// and call addUsedLanesOnOperand() for them.
81 void transferUsedLanesStep(const MachineInstr &MI, LaneBitmask UsedLanes);
82
83 /// Given a use regiser operand \p Use and a mask of defined lanes, check
84 /// if the operand belongs to a lowersToCopies() instruction, transfer the
85 /// mask to the def and put the instruction into the worklist.
86 void transferDefinedLanesStep(const MachineOperand &Use,
87 LaneBitmask DefinedLanes);
88
89 /// Given a mask \p DefinedLanes of lanes defined at operand \p OpNum
90 /// of COPY-like instruction, determine which lanes are defined at the output
91 /// operand \p Def.
92 LaneBitmask transferDefinedLanes(const MachineOperand &Def, unsigned OpNum,
93 LaneBitmask DefinedLanes) const;
94
95 /// Given a mask \p UsedLanes used from the output of instruction \p MI
96 /// determine which lanes are used from operand \p MO of this instruction.
97 LaneBitmask transferUsedLanes(const MachineInstr &MI, LaneBitmask UsedLanes,
98 const MachineOperand &MO) const;
99
100 bool runOnce(MachineFunction &MF);
101
102 LaneBitmask determineInitialDefinedLanes(unsigned Reg);
103 LaneBitmask determineInitialUsedLanes(unsigned Reg);
104
105 bool isUndefRegAtInput(const MachineOperand &MO,
106 const VRegInfo &RegInfo) const;
107
108 bool isUndefInput(const MachineOperand &MO, bool *CrossCopy) const;
109
110 const MachineRegisterInfo *MRI;
111 const TargetRegisterInfo *TRI;
112
PutInWorklist(unsigned RegIdx)113 void PutInWorklist(unsigned RegIdx) {
114 if (WorklistMembers.test(RegIdx))
115 return;
116 WorklistMembers.set(RegIdx);
117 Worklist.push_back(RegIdx);
118 }
119
120 VRegInfo *VRegInfos;
121 /// Worklist containing virtreg indexes.
122 std::deque<unsigned> Worklist;
123 BitVector WorklistMembers;
124 /// This bitvector is set for each vreg index where the vreg is defined
125 /// by an instruction where lowersToCopies()==true.
126 BitVector DefinedByCopy;
127 };
128
129 } // end anonymous namespace
130
131 char DetectDeadLanes::ID = 0;
132 char &llvm::DetectDeadLanesID = DetectDeadLanes::ID;
133
134 INITIALIZE_PASS(DetectDeadLanes, DEBUG_TYPE, "Detect Dead Lanes", false, false)
135
136 /// Returns true if \p MI will get lowered to a series of COPY instructions.
137 /// We call this a COPY-like instruction.
lowersToCopies(const MachineInstr & MI)138 static bool lowersToCopies(const MachineInstr &MI) {
139 // Note: We could support instructions with MCInstrDesc::isRegSequenceLike(),
140 // isExtractSubRegLike(), isInsertSubregLike() in the future even though they
141 // are not lowered to a COPY.
142 switch (MI.getOpcode()) {
143 case TargetOpcode::COPY:
144 case TargetOpcode::PHI:
145 case TargetOpcode::INSERT_SUBREG:
146 case TargetOpcode::REG_SEQUENCE:
147 case TargetOpcode::EXTRACT_SUBREG:
148 return true;
149 }
150 return false;
151 }
152
isCrossCopy(const MachineRegisterInfo & MRI,const MachineInstr & MI,const TargetRegisterClass * DstRC,const MachineOperand & MO)153 static bool isCrossCopy(const MachineRegisterInfo &MRI,
154 const MachineInstr &MI,
155 const TargetRegisterClass *DstRC,
156 const MachineOperand &MO) {
157 assert(lowersToCopies(MI));
158 unsigned SrcReg = MO.getReg();
159 const TargetRegisterClass *SrcRC = MRI.getRegClass(SrcReg);
160 if (DstRC == SrcRC)
161 return false;
162
163 unsigned SrcSubIdx = MO.getSubReg();
164
165 const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
166 unsigned DstSubIdx = 0;
167 switch (MI.getOpcode()) {
168 case TargetOpcode::INSERT_SUBREG:
169 if (MI.getOperandNo(&MO) == 2)
170 DstSubIdx = MI.getOperand(3).getImm();
171 break;
172 case TargetOpcode::REG_SEQUENCE: {
173 unsigned OpNum = MI.getOperandNo(&MO);
174 DstSubIdx = MI.getOperand(OpNum+1).getImm();
175 break;
176 }
177 case TargetOpcode::EXTRACT_SUBREG: {
178 unsigned SubReg = MI.getOperand(2).getImm();
179 SrcSubIdx = TRI.composeSubRegIndices(SubReg, SrcSubIdx);
180 }
181 }
182
183 unsigned PreA, PreB; // Unused.
184 if (SrcSubIdx && DstSubIdx)
185 return !TRI.getCommonSuperRegClass(SrcRC, SrcSubIdx, DstRC, DstSubIdx, PreA,
186 PreB);
187 if (SrcSubIdx)
188 return !TRI.getMatchingSuperRegClass(SrcRC, DstRC, SrcSubIdx);
189 if (DstSubIdx)
190 return !TRI.getMatchingSuperRegClass(DstRC, SrcRC, DstSubIdx);
191 return !TRI.getCommonSubClass(SrcRC, DstRC);
192 }
193
addUsedLanesOnOperand(const MachineOperand & MO,LaneBitmask UsedLanes)194 void DetectDeadLanes::addUsedLanesOnOperand(const MachineOperand &MO,
195 LaneBitmask UsedLanes) {
196 if (!MO.readsReg())
197 return;
198 unsigned MOReg = MO.getReg();
199 if (!TargetRegisterInfo::isVirtualRegister(MOReg))
200 return;
201
202 unsigned MOSubReg = MO.getSubReg();
203 if (MOSubReg != 0)
204 UsedLanes = TRI->composeSubRegIndexLaneMask(MOSubReg, UsedLanes);
205 UsedLanes &= MRI->getMaxLaneMaskForVReg(MOReg);
206
207 unsigned MORegIdx = TargetRegisterInfo::virtReg2Index(MOReg);
208 VRegInfo &MORegInfo = VRegInfos[MORegIdx];
209 LaneBitmask PrevUsedLanes = MORegInfo.UsedLanes;
210 // Any change at all?
211 if ((UsedLanes & ~PrevUsedLanes).none())
212 return;
213
214 // Set UsedLanes and remember instruction for further propagation.
215 MORegInfo.UsedLanes = PrevUsedLanes | UsedLanes;
216 if (DefinedByCopy.test(MORegIdx))
217 PutInWorklist(MORegIdx);
218 }
219
transferUsedLanesStep(const MachineInstr & MI,LaneBitmask UsedLanes)220 void DetectDeadLanes::transferUsedLanesStep(const MachineInstr &MI,
221 LaneBitmask UsedLanes) {
222 for (const MachineOperand &MO : MI.uses()) {
223 if (!MO.isReg() || !TargetRegisterInfo::isVirtualRegister(MO.getReg()))
224 continue;
225 LaneBitmask UsedOnMO = transferUsedLanes(MI, UsedLanes, MO);
226 addUsedLanesOnOperand(MO, UsedOnMO);
227 }
228 }
229
transferUsedLanes(const MachineInstr & MI,LaneBitmask UsedLanes,const MachineOperand & MO) const230 LaneBitmask DetectDeadLanes::transferUsedLanes(const MachineInstr &MI,
231 LaneBitmask UsedLanes,
232 const MachineOperand &MO) const {
233 unsigned OpNum = MI.getOperandNo(&MO);
234 assert(lowersToCopies(MI) && DefinedByCopy[
235 TargetRegisterInfo::virtReg2Index(MI.getOperand(0).getReg())]);
236
237 switch (MI.getOpcode()) {
238 case TargetOpcode::COPY:
239 case TargetOpcode::PHI:
240 return UsedLanes;
241 case TargetOpcode::REG_SEQUENCE: {
242 assert(OpNum % 2 == 1);
243 unsigned SubIdx = MI.getOperand(OpNum + 1).getImm();
244 return TRI->reverseComposeSubRegIndexLaneMask(SubIdx, UsedLanes);
245 }
246 case TargetOpcode::INSERT_SUBREG: {
247 unsigned SubIdx = MI.getOperand(3).getImm();
248 LaneBitmask MO2UsedLanes =
249 TRI->reverseComposeSubRegIndexLaneMask(SubIdx, UsedLanes);
250 if (OpNum == 2)
251 return MO2UsedLanes;
252
253 const MachineOperand &Def = MI.getOperand(0);
254 unsigned DefReg = Def.getReg();
255 const TargetRegisterClass *RC = MRI->getRegClass(DefReg);
256 LaneBitmask MO1UsedLanes;
257 if (RC->CoveredBySubRegs)
258 MO1UsedLanes = UsedLanes & ~TRI->getSubRegIndexLaneMask(SubIdx);
259 else
260 MO1UsedLanes = RC->LaneMask;
261
262 assert(OpNum == 1);
263 return MO1UsedLanes;
264 }
265 case TargetOpcode::EXTRACT_SUBREG: {
266 assert(OpNum == 1);
267 unsigned SubIdx = MI.getOperand(2).getImm();
268 return TRI->composeSubRegIndexLaneMask(SubIdx, UsedLanes);
269 }
270 default:
271 llvm_unreachable("function must be called with COPY-like instruction");
272 }
273 }
274
transferDefinedLanesStep(const MachineOperand & Use,LaneBitmask DefinedLanes)275 void DetectDeadLanes::transferDefinedLanesStep(const MachineOperand &Use,
276 LaneBitmask DefinedLanes) {
277 if (!Use.readsReg())
278 return;
279 // Check whether the operand writes a vreg and is part of a COPY-like
280 // instruction.
281 const MachineInstr &MI = *Use.getParent();
282 if (MI.getDesc().getNumDefs() != 1)
283 return;
284 // FIXME: PATCHPOINT instructions announce a Def that does not always exist,
285 // they really need to be modeled differently!
286 if (MI.getOpcode() == TargetOpcode::PATCHPOINT)
287 return;
288 const MachineOperand &Def = *MI.defs().begin();
289 unsigned DefReg = Def.getReg();
290 if (!TargetRegisterInfo::isVirtualRegister(DefReg))
291 return;
292 unsigned DefRegIdx = TargetRegisterInfo::virtReg2Index(DefReg);
293 if (!DefinedByCopy.test(DefRegIdx))
294 return;
295
296 unsigned OpNum = MI.getOperandNo(&Use);
297 DefinedLanes =
298 TRI->reverseComposeSubRegIndexLaneMask(Use.getSubReg(), DefinedLanes);
299 DefinedLanes = transferDefinedLanes(Def, OpNum, DefinedLanes);
300
301 VRegInfo &RegInfo = VRegInfos[DefRegIdx];
302 LaneBitmask PrevDefinedLanes = RegInfo.DefinedLanes;
303 // Any change at all?
304 if ((DefinedLanes & ~PrevDefinedLanes).none())
305 return;
306
307 RegInfo.DefinedLanes = PrevDefinedLanes | DefinedLanes;
308 PutInWorklist(DefRegIdx);
309 }
310
transferDefinedLanes(const MachineOperand & Def,unsigned OpNum,LaneBitmask DefinedLanes) const311 LaneBitmask DetectDeadLanes::transferDefinedLanes(const MachineOperand &Def,
312 unsigned OpNum, LaneBitmask DefinedLanes) const {
313 const MachineInstr &MI = *Def.getParent();
314 // Translate DefinedLanes if necessary.
315 switch (MI.getOpcode()) {
316 case TargetOpcode::REG_SEQUENCE: {
317 unsigned SubIdx = MI.getOperand(OpNum + 1).getImm();
318 DefinedLanes = TRI->composeSubRegIndexLaneMask(SubIdx, DefinedLanes);
319 DefinedLanes &= TRI->getSubRegIndexLaneMask(SubIdx);
320 break;
321 }
322 case TargetOpcode::INSERT_SUBREG: {
323 unsigned SubIdx = MI.getOperand(3).getImm();
324 if (OpNum == 2) {
325 DefinedLanes = TRI->composeSubRegIndexLaneMask(SubIdx, DefinedLanes);
326 DefinedLanes &= TRI->getSubRegIndexLaneMask(SubIdx);
327 } else {
328 assert(OpNum == 1 && "INSERT_SUBREG must have two operands");
329 // Ignore lanes defined by operand 2.
330 DefinedLanes &= ~TRI->getSubRegIndexLaneMask(SubIdx);
331 }
332 break;
333 }
334 case TargetOpcode::EXTRACT_SUBREG: {
335 unsigned SubIdx = MI.getOperand(2).getImm();
336 assert(OpNum == 1 && "EXTRACT_SUBREG must have one register operand only");
337 DefinedLanes = TRI->reverseComposeSubRegIndexLaneMask(SubIdx, DefinedLanes);
338 break;
339 }
340 case TargetOpcode::COPY:
341 case TargetOpcode::PHI:
342 break;
343 default:
344 llvm_unreachable("function must be called with COPY-like instruction");
345 }
346
347 assert(Def.getSubReg() == 0 &&
348 "Should not have subregister defs in machine SSA phase");
349 DefinedLanes &= MRI->getMaxLaneMaskForVReg(Def.getReg());
350 return DefinedLanes;
351 }
352
determineInitialDefinedLanes(unsigned Reg)353 LaneBitmask DetectDeadLanes::determineInitialDefinedLanes(unsigned Reg) {
354 // Live-In or unused registers have no definition but are considered fully
355 // defined.
356 if (!MRI->hasOneDef(Reg))
357 return LaneBitmask::getAll();
358
359 const MachineOperand &Def = *MRI->def_begin(Reg);
360 const MachineInstr &DefMI = *Def.getParent();
361 if (lowersToCopies(DefMI)) {
362 // Start optimisatically with no used or defined lanes for copy
363 // instructions. The following dataflow analysis will add more bits.
364 unsigned RegIdx = TargetRegisterInfo::virtReg2Index(Reg);
365 DefinedByCopy.set(RegIdx);
366 PutInWorklist(RegIdx);
367
368 if (Def.isDead())
369 return LaneBitmask::getNone();
370
371 // COPY/PHI can copy across unrelated register classes (example: float/int)
372 // with incompatible subregister structure. Do not include these in the
373 // dataflow analysis since we cannot transfer lanemasks in a meaningful way.
374 const TargetRegisterClass *DefRC = MRI->getRegClass(Reg);
375
376 // Determine initially DefinedLanes.
377 LaneBitmask DefinedLanes;
378 for (const MachineOperand &MO : DefMI.uses()) {
379 if (!MO.isReg() || !MO.readsReg())
380 continue;
381 unsigned MOReg = MO.getReg();
382 if (!MOReg)
383 continue;
384
385 LaneBitmask MODefinedLanes;
386 if (TargetRegisterInfo::isPhysicalRegister(MOReg)) {
387 MODefinedLanes = LaneBitmask::getAll();
388 } else if (isCrossCopy(*MRI, DefMI, DefRC, MO)) {
389 MODefinedLanes = LaneBitmask::getAll();
390 } else {
391 assert(TargetRegisterInfo::isVirtualRegister(MOReg));
392 if (MRI->hasOneDef(MOReg)) {
393 const MachineOperand &MODef = *MRI->def_begin(MOReg);
394 const MachineInstr &MODefMI = *MODef.getParent();
395 // Bits from copy-like operations will be added later.
396 if (lowersToCopies(MODefMI) || MODefMI.isImplicitDef())
397 continue;
398 }
399 unsigned MOSubReg = MO.getSubReg();
400 MODefinedLanes = MRI->getMaxLaneMaskForVReg(MOReg);
401 MODefinedLanes = TRI->reverseComposeSubRegIndexLaneMask(
402 MOSubReg, MODefinedLanes);
403 }
404
405 unsigned OpNum = DefMI.getOperandNo(&MO);
406 DefinedLanes |= transferDefinedLanes(Def, OpNum, MODefinedLanes);
407 }
408 return DefinedLanes;
409 }
410 if (DefMI.isImplicitDef() || Def.isDead())
411 return LaneBitmask::getNone();
412
413 assert(Def.getSubReg() == 0 &&
414 "Should not have subregister defs in machine SSA phase");
415 return MRI->getMaxLaneMaskForVReg(Reg);
416 }
417
determineInitialUsedLanes(unsigned Reg)418 LaneBitmask DetectDeadLanes::determineInitialUsedLanes(unsigned Reg) {
419 LaneBitmask UsedLanes = LaneBitmask::getNone();
420 for (const MachineOperand &MO : MRI->use_nodbg_operands(Reg)) {
421 if (!MO.readsReg())
422 continue;
423
424 const MachineInstr &UseMI = *MO.getParent();
425 if (UseMI.isKill())
426 continue;
427
428 unsigned SubReg = MO.getSubReg();
429 if (lowersToCopies(UseMI)) {
430 assert(UseMI.getDesc().getNumDefs() == 1);
431 const MachineOperand &Def = *UseMI.defs().begin();
432 unsigned DefReg = Def.getReg();
433 // The used lanes of COPY-like instruction operands are determined by the
434 // following dataflow analysis.
435 if (TargetRegisterInfo::isVirtualRegister(DefReg)) {
436 // But ignore copies across incompatible register classes.
437 bool CrossCopy = false;
438 if (lowersToCopies(UseMI)) {
439 const TargetRegisterClass *DstRC = MRI->getRegClass(DefReg);
440 CrossCopy = isCrossCopy(*MRI, UseMI, DstRC, MO);
441 if (CrossCopy)
442 LLVM_DEBUG(dbgs() << "Copy across incompatible classes: " << UseMI);
443 }
444
445 if (!CrossCopy)
446 continue;
447 }
448 }
449
450 // Shortcut: All lanes are used.
451 if (SubReg == 0)
452 return MRI->getMaxLaneMaskForVReg(Reg);
453
454 UsedLanes |= TRI->getSubRegIndexLaneMask(SubReg);
455 }
456 return UsedLanes;
457 }
458
isUndefRegAtInput(const MachineOperand & MO,const VRegInfo & RegInfo) const459 bool DetectDeadLanes::isUndefRegAtInput(const MachineOperand &MO,
460 const VRegInfo &RegInfo) const {
461 unsigned SubReg = MO.getSubReg();
462 LaneBitmask Mask = TRI->getSubRegIndexLaneMask(SubReg);
463 return (RegInfo.DefinedLanes & RegInfo.UsedLanes & Mask).none();
464 }
465
isUndefInput(const MachineOperand & MO,bool * CrossCopy) const466 bool DetectDeadLanes::isUndefInput(const MachineOperand &MO,
467 bool *CrossCopy) const {
468 if (!MO.isUse())
469 return false;
470 const MachineInstr &MI = *MO.getParent();
471 if (!lowersToCopies(MI))
472 return false;
473 const MachineOperand &Def = MI.getOperand(0);
474 unsigned DefReg = Def.getReg();
475 if (!TargetRegisterInfo::isVirtualRegister(DefReg))
476 return false;
477 unsigned DefRegIdx = TargetRegisterInfo::virtReg2Index(DefReg);
478 if (!DefinedByCopy.test(DefRegIdx))
479 return false;
480
481 const VRegInfo &DefRegInfo = VRegInfos[DefRegIdx];
482 LaneBitmask UsedLanes = transferUsedLanes(MI, DefRegInfo.UsedLanes, MO);
483 if (UsedLanes.any())
484 return false;
485
486 unsigned MOReg = MO.getReg();
487 if (TargetRegisterInfo::isVirtualRegister(MOReg)) {
488 const TargetRegisterClass *DstRC = MRI->getRegClass(DefReg);
489 *CrossCopy = isCrossCopy(*MRI, MI, DstRC, MO);
490 }
491 return true;
492 }
493
runOnce(MachineFunction & MF)494 bool DetectDeadLanes::runOnce(MachineFunction &MF) {
495 // First pass: Populate defs/uses of vregs with initial values
496 unsigned NumVirtRegs = MRI->getNumVirtRegs();
497 for (unsigned RegIdx = 0; RegIdx < NumVirtRegs; ++RegIdx) {
498 unsigned Reg = TargetRegisterInfo::index2VirtReg(RegIdx);
499
500 // Determine used/defined lanes and add copy instructions to worklist.
501 VRegInfo &Info = VRegInfos[RegIdx];
502 Info.DefinedLanes = determineInitialDefinedLanes(Reg);
503 Info.UsedLanes = determineInitialUsedLanes(Reg);
504 }
505
506 // Iterate as long as defined lanes/used lanes keep changing.
507 while (!Worklist.empty()) {
508 unsigned RegIdx = Worklist.front();
509 Worklist.pop_front();
510 WorklistMembers.reset(RegIdx);
511 VRegInfo &Info = VRegInfos[RegIdx];
512 unsigned Reg = TargetRegisterInfo::index2VirtReg(RegIdx);
513
514 // Transfer UsedLanes to operands of DefMI (backwards dataflow).
515 MachineOperand &Def = *MRI->def_begin(Reg);
516 const MachineInstr &MI = *Def.getParent();
517 transferUsedLanesStep(MI, Info.UsedLanes);
518 // Transfer DefinedLanes to users of Reg (forward dataflow).
519 for (const MachineOperand &MO : MRI->use_nodbg_operands(Reg))
520 transferDefinedLanesStep(MO, Info.DefinedLanes);
521 }
522
523 LLVM_DEBUG(dbgs() << "Defined/Used lanes:\n"; for (unsigned RegIdx = 0;
524 RegIdx < NumVirtRegs;
525 ++RegIdx) {
526 unsigned Reg = TargetRegisterInfo::index2VirtReg(RegIdx);
527 const VRegInfo &Info = VRegInfos[RegIdx];
528 dbgs() << printReg(Reg, nullptr)
529 << " Used: " << PrintLaneMask(Info.UsedLanes)
530 << " Def: " << PrintLaneMask(Info.DefinedLanes) << '\n';
531 } dbgs() << "\n";);
532
533 bool Again = false;
534 // Mark operands as dead/unused.
535 for (MachineBasicBlock &MBB : MF) {
536 for (MachineInstr &MI : MBB) {
537 for (MachineOperand &MO : MI.operands()) {
538 if (!MO.isReg())
539 continue;
540 unsigned Reg = MO.getReg();
541 if (!TargetRegisterInfo::isVirtualRegister(Reg))
542 continue;
543 unsigned RegIdx = TargetRegisterInfo::virtReg2Index(Reg);
544 const VRegInfo &RegInfo = VRegInfos[RegIdx];
545 if (MO.isDef() && !MO.isDead() && RegInfo.UsedLanes.none()) {
546 LLVM_DEBUG(dbgs()
547 << "Marking operand '" << MO << "' as dead in " << MI);
548 MO.setIsDead();
549 }
550 if (MO.readsReg()) {
551 bool CrossCopy = false;
552 if (isUndefRegAtInput(MO, RegInfo)) {
553 LLVM_DEBUG(dbgs()
554 << "Marking operand '" << MO << "' as undef in " << MI);
555 MO.setIsUndef();
556 } else if (isUndefInput(MO, &CrossCopy)) {
557 LLVM_DEBUG(dbgs()
558 << "Marking operand '" << MO << "' as undef in " << MI);
559 MO.setIsUndef();
560 if (CrossCopy)
561 Again = true;
562 }
563 }
564 }
565 }
566 }
567
568 return Again;
569 }
570
runOnMachineFunction(MachineFunction & MF)571 bool DetectDeadLanes::runOnMachineFunction(MachineFunction &MF) {
572 // Don't bother if we won't track subregister liveness later. This pass is
573 // required for correctness if subregister liveness is enabled because the
574 // register coalescer cannot deal with hidden dead defs. However without
575 // subregister liveness enabled, the expected benefits of this pass are small
576 // so we safe the compile time.
577 MRI = &MF.getRegInfo();
578 if (!MRI->subRegLivenessEnabled()) {
579 LLVM_DEBUG(dbgs() << "Skipping Detect dead lanes pass\n");
580 return false;
581 }
582
583 TRI = MRI->getTargetRegisterInfo();
584
585 unsigned NumVirtRegs = MRI->getNumVirtRegs();
586 VRegInfos = new VRegInfo[NumVirtRegs];
587 WorklistMembers.resize(NumVirtRegs);
588 DefinedByCopy.resize(NumVirtRegs);
589
590 bool Again;
591 do {
592 Again = runOnce(MF);
593 } while(Again);
594
595 DefinedByCopy.clear();
596 WorklistMembers.clear();
597 delete[] VRegInfos;
598 return true;
599 }
600