LLVM  8.0.1
DetectDeadLanes.cpp
Go to the documentation of this file.
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"
36 #include "llvm/CodeGen/Passes.h"
39 #include "llvm/InitializePasses.h"
40 #include "llvm/Pass.h"
41 #include "llvm/PassRegistry.h"
42 #include "llvm/Support/Debug.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();
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;
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.
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 
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 
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();
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()) {
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[
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();
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;
387  MODefinedLanes = LaneBitmask::getAll();
388  } else if (isCrossCopy(*MRI, DefMI, DefRC, MO)) {
389  MODefinedLanes = LaneBitmask::getAll();
390  } else {
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.
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();
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();
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();
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 }
const TargetRegisterClass * getCommonSubClass(const TargetRegisterClass *A, const TargetRegisterClass *B, const MVT::SimpleValueType SVT=MVT::SimpleValueType::Any) const
Find the largest common subclass of A and B.
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
const TargetRegisterClass * getRegClass(unsigned Reg) const
Return the register class of the specified virtual register.
static unsigned virtReg2Index(unsigned Reg)
Convert a virtual register number to a 0-based index.
This class represents lattice values for constants.
Definition: AllocatorList.h:24
iterator_range< mop_iterator > uses()
Returns a range that includes all operands that are register uses.
Definition: MachineInstr.h:492
static unsigned index2VirtReg(unsigned Index)
Convert a 0-based index to a virtual register number.
unsigned getReg() const
getReg - Returns the register number.
unsigned getOperandNo(const_mop_iterator I) const
Returns the number of the operand iterator I points to.
Definition: MachineInstr.h:509
void setIsUndef(bool Val=true)
static bool isVirtualRegister(unsigned Reg)
Return true if the specified register number is in the virtual register namespace.
unsigned Reg
unsigned getSubReg() const
#define DEBUG_TYPE
unsigned const TargetRegisterInfo * TRI
void setIsDead(bool Val=true)
Printable PrintLaneMask(LaneBitmask LaneMask)
Create Printable object to print LaneBitmasks on a raw_ostream.
Definition: LaneBitmask.h:94
const TargetRegisterClass * RC
Definition: MIParser.h:39
iterator_range< mop_iterator > operands()
Definition: MachineInstr.h:459
char & DetectDeadLanesID
This pass adds dead/undef flags after analyzing subregister lanes.
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
Printable printReg(unsigned Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
A Use represents the edge between a Value definition and its users.
Definition: Use.h:56
unsigned SubReg
static constexpr LaneBitmask getAll()
Definition: LaneBitmask.h:84
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
Definition: MachineInstr.h:409
static constexpr LaneBitmask getNone()
Definition: LaneBitmask.h:83
const TargetRegisterClass * getCommonSuperRegClass(const TargetRegisterClass *RCA, unsigned SubA, const TargetRegisterClass *RCB, unsigned SubB, unsigned &PreA, unsigned &PreB) const
Find a common super-register class if it exists.
bool readsReg() const
readsReg - Returns true if this operand reads the previous value of its register. ...
const MCInstrDesc & getDesc() const
Returns the target instruction descriptor of this MachineInstr.
Definition: MachineInstr.h:406
Analysis containing CSE Info
Definition: CSEInfo.cpp:21
const TargetRegisterInfo * getTargetRegisterInfo() const
unsigned const MachineRegisterInfo * MRI
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
MachineInstrBuilder & UseMI
unsigned composeSubRegIndices(unsigned a, unsigned b) const
Return the subregister index you get from composing two subregister indices.
static bool lowersToCopies(const MachineInstr &MI)
Returns true if MI will get lowered to a series of COPY instructions.
Represent the analysis usage information of a pass.
iterator_range< mop_iterator > defs()
Returns a range over all explicit operands that are register definitions.
Definition: MachineInstr.h:481
virtual const TargetRegisterClass * getMatchingSuperRegClass(const TargetRegisterClass *A, const TargetRegisterClass *B, unsigned Idx) const
Return a subclass of the specified register class A so that each register in it has a sub-register of...
bool isImplicitDef() const
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:34
static bool isCrossCopy(const MachineRegisterInfo &MRI, const MachineInstr &MI, const TargetRegisterClass *DstRC, const MachineOperand &MO)
MachineOperand class - Representation of each machine instruction operand.
MachineInstrBuilder MachineInstrBuilder & DefMI
unsigned getNumDefs() const
Return the number of MachineOperands that are register definitions.
Definition: MCInstrDesc.h:226
void setPreservesCFG()
This function should be called by the pass, iff they do not:
Definition: Pass.cpp:286
int64_t getImm() const
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:133
MachineRegisterInfo - Keep track of information for virtual and physical registers, including vreg register classes, use/def chains for registers, etc.
Representation of each machine instruction.
Definition: MachineInstr.h:64
static bool isPhysicalRegister(unsigned Reg)
Return true if the specified register number is in the physical register namespace.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
constexpr bool any() const
Definition: LaneBitmask.h:53
const bool CoveredBySubRegs
Whether a combination of subregisters can cover every register in the class.
bool isKill() const
bool isReg() const
isReg - Tests if this is a MO_Register operand.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
aarch64 promote const
std::underlying_type< E >::type Mask()
Get a bitmask with 1s in all places up to the high-order bit of E&#39;s largest value.
Definition: BitmaskEnum.h:81
IRTranslator LLVM IR MI
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:49
#define LLVM_DEBUG(X)
Definition: Debug.h:123
const MachineOperand & getOperand(unsigned i) const
Definition: MachineInstr.h:414