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