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 ///    %vreg0 = some definition
21 ///    %vreg1 = IMPLICIT_DEF
22 ///    %vreg2 = REG_SEQUENCE %vreg0, sub0, %vreg1, sub1
23 ///    %vreg3 = EXTRACT_SUBREG %vreg2, sub1
24 ///           = use %vreg3
25 /// The %vreg0 definition is dead and %vreg3 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/InitializePasses.h"
38 #include "llvm/Pass.h"
39 #include "llvm/PassRegistry.h"
40 #include "llvm/Support/Debug.h"
41 #include "llvm/Support/raw_ostream.h"
42 #include "llvm/Target/TargetInstrInfo.h"
43 #include "llvm/Target/TargetRegisterInfo.h"
44 #include "llvm/Target/TargetSubtargetInfo.h"
45 
46 using namespace llvm;
47 
48 #define DEBUG_TYPE "detect-dead-lanes"
49 
50 namespace {
51 
52 /// Contains a bitmask of which lanes of a given virtual register are
53 /// defined and which ones are actually used.
54 struct VRegInfo {
55   LaneBitmask UsedLanes;
56   LaneBitmask DefinedLanes;
57 };
58 
59 class DetectDeadLanes : public MachineFunctionPass {
60 public:
61   bool runOnMachineFunction(MachineFunction &MF) override;
62 
63   static char ID;
64   DetectDeadLanes() : MachineFunctionPass(ID) {}
65 
66   const char *getPassName() const override { return "Detect Dead Lanes"; }
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, "detect-dead-lanes", "Detect Dead Lanes",
131                 false, false)
132 
133 /// Returns true if \p MI will get lowered to a series of COPY instructions.
134 /// We call this a COPY-like instruction.
135 static bool lowersToCopies(const MachineInstr &MI) {
136   // Note: We could support instructions with MCInstrDesc::isRegSequenceLike(),
137   // isExtractSubRegLike(), isInsertSubregLike() in the future even though they
138   // are not lowered to a COPY.
139   switch (MI.getOpcode()) {
140   case TargetOpcode::COPY:
141   case TargetOpcode::PHI:
142   case TargetOpcode::INSERT_SUBREG:
143   case TargetOpcode::REG_SEQUENCE:
144   case TargetOpcode::EXTRACT_SUBREG:
145     return true;
146   }
147   return false;
148 }
149 
150 static bool isCrossCopy(const MachineRegisterInfo &MRI,
151                         const MachineInstr &MI,
152                         const TargetRegisterClass *DstRC,
153                         const MachineOperand &MO) {
154   assert(lowersToCopies(MI));
155   unsigned SrcReg = MO.getReg();
156   const TargetRegisterClass *SrcRC = MRI.getRegClass(SrcReg);
157   if (DstRC == SrcRC)
158     return false;
159 
160   unsigned SrcSubIdx = MO.getSubReg();
161 
162   const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
163   unsigned DstSubIdx = 0;
164   switch (MI.getOpcode()) {
165   case TargetOpcode::INSERT_SUBREG:
166     if (MI.getOperandNo(&MO) == 2)
167       DstSubIdx = MI.getOperand(3).getImm();
168     break;
169   case TargetOpcode::REG_SEQUENCE: {
170     unsigned OpNum = MI.getOperandNo(&MO);
171     DstSubIdx = MI.getOperand(OpNum+1).getImm();
172     break;
173   }
174   case TargetOpcode::EXTRACT_SUBREG: {
175     unsigned SubReg = MI.getOperand(2).getImm();
176     SrcSubIdx = TRI.composeSubRegIndices(SubReg, SrcSubIdx);
177   }
178   }
179 
180   unsigned PreA, PreB; // Unused.
181   if (SrcSubIdx && DstSubIdx)
182     return !TRI.getCommonSuperRegClass(SrcRC, SrcSubIdx, DstRC, DstSubIdx, PreA,
183                                        PreB);
184   if (SrcSubIdx)
185     return !TRI.getMatchingSuperRegClass(SrcRC, DstRC, SrcSubIdx);
186   if (DstSubIdx)
187     return !TRI.getMatchingSuperRegClass(DstRC, SrcRC, DstSubIdx);
188   return !TRI.getCommonSubClass(SrcRC, DstRC);
189 }
190 
191 void DetectDeadLanes::addUsedLanesOnOperand(const MachineOperand &MO,
192                                             LaneBitmask UsedLanes) {
193   if (!MO.readsReg())
194     return;
195   unsigned MOReg = MO.getReg();
196   if (!TargetRegisterInfo::isVirtualRegister(MOReg))
197     return;
198 
199   unsigned MOSubReg = MO.getSubReg();
200   if (MOSubReg != 0)
201     UsedLanes = TRI->composeSubRegIndexLaneMask(MOSubReg, UsedLanes);
202   UsedLanes &= MRI->getMaxLaneMaskForVReg(MOReg);
203 
204   unsigned MORegIdx = TargetRegisterInfo::virtReg2Index(MOReg);
205   VRegInfo &MORegInfo = VRegInfos[MORegIdx];
206   LaneBitmask PrevUsedLanes = MORegInfo.UsedLanes;
207   // Any change at all?
208   if ((UsedLanes & ~PrevUsedLanes) == 0)
209     return;
210 
211   // Set UsedLanes and remember instruction for further propagation.
212   MORegInfo.UsedLanes = PrevUsedLanes | UsedLanes;
213   if (DefinedByCopy.test(MORegIdx))
214     PutInWorklist(MORegIdx);
215 }
216 
217 void DetectDeadLanes::transferUsedLanesStep(const MachineInstr &MI,
218                                             LaneBitmask UsedLanes) {
219   for (const MachineOperand &MO : MI.uses()) {
220     if (!MO.isReg() || !TargetRegisterInfo::isVirtualRegister(MO.getReg()))
221       continue;
222     LaneBitmask UsedOnMO = transferUsedLanes(MI, UsedLanes, MO);
223     addUsedLanesOnOperand(MO, UsedOnMO);
224   }
225 }
226 
227 LaneBitmask DetectDeadLanes::transferUsedLanes(const MachineInstr &MI,
228                                                LaneBitmask UsedLanes,
229                                                const MachineOperand &MO) const {
230   unsigned OpNum = MI.getOperandNo(&MO);
231   assert(lowersToCopies(MI) && DefinedByCopy[
232            TargetRegisterInfo::virtReg2Index(MI.getOperand(0).getReg())]);
233 
234   switch (MI.getOpcode()) {
235   case TargetOpcode::COPY:
236   case TargetOpcode::PHI:
237     return UsedLanes;
238   case TargetOpcode::REG_SEQUENCE: {
239     assert(OpNum % 2 == 1);
240     unsigned SubIdx = MI.getOperand(OpNum + 1).getImm();
241     return TRI->reverseComposeSubRegIndexLaneMask(SubIdx, UsedLanes);
242   }
243   case TargetOpcode::INSERT_SUBREG: {
244     unsigned SubIdx = MI.getOperand(3).getImm();
245     LaneBitmask MO2UsedLanes =
246         TRI->reverseComposeSubRegIndexLaneMask(SubIdx, UsedLanes);
247     if (OpNum == 2)
248       return MO2UsedLanes;
249 
250     const MachineOperand &Def = MI.getOperand(0);
251     unsigned DefReg = Def.getReg();
252     const TargetRegisterClass *RC = MRI->getRegClass(DefReg);
253     LaneBitmask MO1UsedLanes;
254     if (RC->CoveredBySubRegs)
255       MO1UsedLanes = UsedLanes & ~TRI->getSubRegIndexLaneMask(SubIdx);
256     else
257       MO1UsedLanes = RC->LaneMask;
258 
259     assert(OpNum == 1);
260     return MO1UsedLanes;
261   }
262   case TargetOpcode::EXTRACT_SUBREG: {
263     assert(OpNum == 1);
264     unsigned SubIdx = MI.getOperand(2).getImm();
265     return TRI->composeSubRegIndexLaneMask(SubIdx, UsedLanes);
266   }
267   default:
268     llvm_unreachable("function must be called with COPY-like instruction");
269   }
270 }
271 
272 void DetectDeadLanes::transferDefinedLanesStep(const MachineOperand &Use,
273                                                LaneBitmask DefinedLanes) {
274   if (!Use.readsReg())
275     return;
276   // Check whether the operand writes a vreg and is part of a COPY-like
277   // instruction.
278   const MachineInstr &MI = *Use.getParent();
279   if (MI.getDesc().getNumDefs() != 1)
280     return;
281   // FIXME: PATCHPOINT instructions announce a Def that does not always exist,
282   // they really need to be modeled differently!
283   if (MI.getOpcode() == TargetOpcode::PATCHPOINT)
284     return;
285   const MachineOperand &Def = *MI.defs().begin();
286   unsigned DefReg = Def.getReg();
287   if (!TargetRegisterInfo::isVirtualRegister(DefReg))
288     return;
289   unsigned DefRegIdx = TargetRegisterInfo::virtReg2Index(DefReg);
290   if (!DefinedByCopy.test(DefRegIdx))
291     return;
292 
293   unsigned OpNum = MI.getOperandNo(&Use);
294   DefinedLanes =
295       TRI->reverseComposeSubRegIndexLaneMask(Use.getSubReg(), DefinedLanes);
296   DefinedLanes = transferDefinedLanes(Def, OpNum, DefinedLanes);
297 
298   VRegInfo &RegInfo = VRegInfos[DefRegIdx];
299   LaneBitmask PrevDefinedLanes = RegInfo.DefinedLanes;
300   // Any change at all?
301   if ((DefinedLanes & ~PrevDefinedLanes) == 0)
302     return;
303 
304   RegInfo.DefinedLanes = PrevDefinedLanes | DefinedLanes;
305   PutInWorklist(DefRegIdx);
306 }
307 
308 LaneBitmask DetectDeadLanes::transferDefinedLanes(const MachineOperand &Def,
309     unsigned OpNum, LaneBitmask DefinedLanes) const {
310   const MachineInstr &MI = *Def.getParent();
311   // Translate DefinedLanes if necessary.
312   switch (MI.getOpcode()) {
313   case TargetOpcode::REG_SEQUENCE: {
314     unsigned SubIdx = MI.getOperand(OpNum + 1).getImm();
315     DefinedLanes = TRI->composeSubRegIndexLaneMask(SubIdx, DefinedLanes);
316     DefinedLanes &= TRI->getSubRegIndexLaneMask(SubIdx);
317     break;
318   }
319   case TargetOpcode::INSERT_SUBREG: {
320     unsigned SubIdx = MI.getOperand(3).getImm();
321     if (OpNum == 2) {
322       DefinedLanes = TRI->composeSubRegIndexLaneMask(SubIdx, DefinedLanes);
323       DefinedLanes &= TRI->getSubRegIndexLaneMask(SubIdx);
324     } else {
325       assert(OpNum == 1 && "INSERT_SUBREG must have two operands");
326       // Ignore lanes defined by operand 2.
327       DefinedLanes &= ~TRI->getSubRegIndexLaneMask(SubIdx);
328     }
329     break;
330   }
331   case TargetOpcode::EXTRACT_SUBREG: {
332     unsigned SubIdx = MI.getOperand(2).getImm();
333     assert(OpNum == 1 && "EXTRACT_SUBREG must have one register operand only");
334     DefinedLanes = TRI->reverseComposeSubRegIndexLaneMask(SubIdx, DefinedLanes);
335     break;
336   }
337   case TargetOpcode::COPY:
338   case TargetOpcode::PHI:
339     break;
340   default:
341     llvm_unreachable("function must be called with COPY-like instruction");
342   }
343 
344   assert(Def.getSubReg() == 0 &&
345          "Should not have subregister defs in machine SSA phase");
346   DefinedLanes &= MRI->getMaxLaneMaskForVReg(Def.getReg());
347   return DefinedLanes;
348 }
349 
350 LaneBitmask DetectDeadLanes::determineInitialDefinedLanes(unsigned Reg) {
351   // Live-In or unused registers have no definition but are considered fully
352   // defined.
353   if (!MRI->hasOneDef(Reg))
354     return ~0u;
355 
356   const MachineOperand &Def = *MRI->def_begin(Reg);
357   const MachineInstr &DefMI = *Def.getParent();
358   if (lowersToCopies(DefMI)) {
359     // Start optimisatically with no used or defined lanes for copy
360     // instructions. The following dataflow analysis will add more bits.
361     unsigned RegIdx = TargetRegisterInfo::virtReg2Index(Reg);
362     DefinedByCopy.set(RegIdx);
363     PutInWorklist(RegIdx);
364 
365     if (Def.isDead())
366       return 0;
367 
368     // COPY/PHI can copy across unrelated register classes (example: float/int)
369     // with incompatible subregister structure. Do not include these in the
370     // dataflow analysis since we cannot transfer lanemasks in a meaningful way.
371     const TargetRegisterClass *DefRC = MRI->getRegClass(Reg);
372 
373     // Determine initially DefinedLanes.
374     LaneBitmask DefinedLanes = 0;
375     for (const MachineOperand &MO : DefMI.uses()) {
376       if (!MO.isReg() || !MO.readsReg())
377         continue;
378       unsigned MOReg = MO.getReg();
379       if (!MOReg)
380         continue;
381 
382       LaneBitmask MODefinedLanes;
383       if (TargetRegisterInfo::isPhysicalRegister(MOReg)) {
384         MODefinedLanes = ~0u;
385       } else if (isCrossCopy(*MRI, DefMI, DefRC, MO)) {
386         MODefinedLanes = ~0u;
387       } else {
388         assert(TargetRegisterInfo::isVirtualRegister(MOReg));
389         if (MRI->hasOneDef(MOReg)) {
390           const MachineOperand &MODef = *MRI->def_begin(MOReg);
391           const MachineInstr &MODefMI = *MODef.getParent();
392           // Bits from copy-like operations will be added later.
393           if (lowersToCopies(MODefMI) || MODefMI.isImplicitDef())
394             continue;
395         }
396         unsigned MOSubReg = MO.getSubReg();
397         MODefinedLanes = MRI->getMaxLaneMaskForVReg(MOReg);
398         MODefinedLanes = TRI->reverseComposeSubRegIndexLaneMask(
399             MOSubReg, MODefinedLanes);
400       }
401 
402       unsigned OpNum = DefMI.getOperandNo(&MO);
403       DefinedLanes |= transferDefinedLanes(Def, OpNum, MODefinedLanes);
404     }
405     return DefinedLanes;
406   }
407   if (DefMI.isImplicitDef() || Def.isDead())
408     return 0;
409 
410   assert(Def.getSubReg() == 0 &&
411          "Should not have subregister defs in machine SSA phase");
412   return MRI->getMaxLaneMaskForVReg(Reg);
413 }
414 
415 LaneBitmask DetectDeadLanes::determineInitialUsedLanes(unsigned Reg) {
416   LaneBitmask UsedLanes = 0;
417   for (const MachineOperand &MO : MRI->use_nodbg_operands(Reg)) {
418     if (!MO.readsReg())
419       continue;
420 
421     const MachineInstr &UseMI = *MO.getParent();
422     if (UseMI.isKill())
423       continue;
424 
425     unsigned SubReg = MO.getSubReg();
426     if (lowersToCopies(UseMI)) {
427       assert(UseMI.getDesc().getNumDefs() == 1);
428       const MachineOperand &Def = *UseMI.defs().begin();
429       unsigned DefReg = Def.getReg();
430       // The used lanes of COPY-like instruction operands are determined by the
431       // following dataflow analysis.
432       if (TargetRegisterInfo::isVirtualRegister(DefReg)) {
433         // But ignore copies across incompatible register classes.
434         bool CrossCopy = false;
435         if (lowersToCopies(UseMI)) {
436           const TargetRegisterClass *DstRC = MRI->getRegClass(DefReg);
437           CrossCopy = isCrossCopy(*MRI, UseMI, DstRC, MO);
438           if (CrossCopy)
439             DEBUG(dbgs() << "Copy accross incompatible classes: " << UseMI);
440         }
441 
442         if (!CrossCopy)
443           continue;
444       }
445     }
446 
447     // Shortcut: All lanes are used.
448     if (SubReg == 0)
449       return MRI->getMaxLaneMaskForVReg(Reg);
450 
451     UsedLanes |= TRI->getSubRegIndexLaneMask(SubReg);
452   }
453   return UsedLanes;
454 }
455 
456 bool DetectDeadLanes::isUndefRegAtInput(const MachineOperand &MO,
457                                         const VRegInfo &RegInfo) const {
458   unsigned SubReg = MO.getSubReg();
459   LaneBitmask Mask = TRI->getSubRegIndexLaneMask(SubReg);
460   return (RegInfo.DefinedLanes & RegInfo.UsedLanes & Mask) == 0;
461 }
462 
463 bool DetectDeadLanes::isUndefInput(const MachineOperand &MO,
464                                    bool *CrossCopy) const {
465   if (!MO.isUse())
466     return false;
467   const MachineInstr &MI = *MO.getParent();
468   if (!lowersToCopies(MI))
469     return false;
470   const MachineOperand &Def = MI.getOperand(0);
471   unsigned DefReg = Def.getReg();
472   if (!TargetRegisterInfo::isVirtualRegister(DefReg))
473     return false;
474   unsigned DefRegIdx = TargetRegisterInfo::virtReg2Index(DefReg);
475   if (!DefinedByCopy.test(DefRegIdx))
476     return false;
477 
478   const VRegInfo &DefRegInfo = VRegInfos[DefRegIdx];
479   LaneBitmask UsedLanes = transferUsedLanes(MI, DefRegInfo.UsedLanes, MO);
480   if (UsedLanes != 0)
481     return false;
482 
483   unsigned MOReg = MO.getReg();
484   if (TargetRegisterInfo::isVirtualRegister(MOReg)) {
485     const TargetRegisterClass *DstRC = MRI->getRegClass(DefReg);
486     *CrossCopy = isCrossCopy(*MRI, MI, DstRC, MO);
487   }
488   return true;
489 }
490 
491 bool DetectDeadLanes::runOnce(MachineFunction &MF) {
492   // First pass: Populate defs/uses of vregs with initial values
493   unsigned NumVirtRegs = MRI->getNumVirtRegs();
494   for (unsigned RegIdx = 0; RegIdx < NumVirtRegs; ++RegIdx) {
495     unsigned Reg = TargetRegisterInfo::index2VirtReg(RegIdx);
496 
497     // Determine used/defined lanes and add copy instructions to worklist.
498     VRegInfo &Info = VRegInfos[RegIdx];
499     Info.DefinedLanes = determineInitialDefinedLanes(Reg);
500     Info.UsedLanes = determineInitialUsedLanes(Reg);
501   }
502 
503   // Iterate as long as defined lanes/used lanes keep changing.
504   while (!Worklist.empty()) {
505     unsigned RegIdx = Worklist.front();
506     Worklist.pop_front();
507     WorklistMembers.reset(RegIdx);
508     VRegInfo &Info = VRegInfos[RegIdx];
509     unsigned Reg = TargetRegisterInfo::index2VirtReg(RegIdx);
510 
511     // Transfer UsedLanes to operands of DefMI (backwards dataflow).
512     MachineOperand &Def = *MRI->def_begin(Reg);
513     const MachineInstr &MI = *Def.getParent();
514     transferUsedLanesStep(MI, Info.UsedLanes);
515     // Transfer DefinedLanes to users of Reg (forward dataflow).
516     for (const MachineOperand &MO : MRI->use_nodbg_operands(Reg))
517       transferDefinedLanesStep(MO, Info.DefinedLanes);
518   }
519 
520   DEBUG(
521     dbgs() << "Defined/Used lanes:\n";
522     for (unsigned RegIdx = 0; RegIdx < NumVirtRegs; ++RegIdx) {
523       unsigned Reg = TargetRegisterInfo::index2VirtReg(RegIdx);
524       const VRegInfo &Info = VRegInfos[RegIdx];
525       dbgs() << PrintReg(Reg, nullptr)
526              << " Used: " << PrintLaneMask(Info.UsedLanes)
527              << " Def: " << PrintLaneMask(Info.DefinedLanes) << '\n';
528     }
529     dbgs() << "\n";
530   );
531 
532   bool Again = false;
533   // Mark operands as dead/unused.
534   for (MachineBasicBlock &MBB : MF) {
535     for (MachineInstr &MI : MBB) {
536       for (MachineOperand &MO : MI.operands()) {
537         if (!MO.isReg())
538           continue;
539         unsigned Reg = MO.getReg();
540         if (!TargetRegisterInfo::isVirtualRegister(Reg))
541           continue;
542         unsigned RegIdx = TargetRegisterInfo::virtReg2Index(Reg);
543         const VRegInfo &RegInfo = VRegInfos[RegIdx];
544         if (MO.isDef() && !MO.isDead() && RegInfo.UsedLanes == 0) {
545           DEBUG(dbgs() << "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             DEBUG(dbgs() << "Marking operand '" << MO << "' as undef in "
552                   << MI);
553             MO.setIsUndef();
554           } else if (isUndefInput(MO, &CrossCopy)) {
555             DEBUG(dbgs() << "Marking operand '" << MO << "' as undef in "
556                   << 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   if (!MF.getSubtarget().enableSubRegLiveness()) {
576     DEBUG(dbgs() << "Skipping Detect dead lanes pass\n");
577     return false;
578   }
579 
580   MRI = &MF.getRegInfo();
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