]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/lib/CodeGen/DetectDeadLanes.cpp
Update mandoc to 1.14.5
[FreeBSD/FreeBSD.git] / contrib / llvm / lib / CodeGen / DetectDeadLanes.cpp
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;
63   DetectDeadLanes() : MachineFunctionPass(ID) {}
64
65   StringRef getPassName() const override { return "Detect Dead Lanes"; }
66
67   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
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.
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
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
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
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
230 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
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
311 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
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
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
459 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
466 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
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
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 }