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/CodeGen/MachineFunctionPass.h"
34 #include "llvm/CodeGen/MachineRegisterInfo.h"
35 #include "llvm/CodeGen/Passes.h"
36 #include "llvm/InitializePasses.h"
37 #include "llvm/Pass.h"
38 #include "llvm/PassRegistry.h"
39 #include "llvm/Support/Debug.h"
40 #include "llvm/Support/raw_ostream.h"
41 #include "llvm/Target/TargetInstrInfo.h"
42 #include "llvm/Target/TargetRegisterInfo.h"
43 #include "llvm/Target/TargetSubtargetInfo.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   const char *getPassName() const override { return "Detect Dead Lanes"; }
66 
67 private:
68   /// Add used lane bits on the register used by operand \p MO. This translates
69   /// the bitmask based on the operands subregister, and puts the register into
70   /// the worklist if any new bits were added.
71   void addUsedLanesOnOperand(const MachineOperand &MO, LaneBitmask UsedLanes);
72 
73   /// Given a bitmask \p UsedLanes for the used lanes on a def output of a
74   /// COPY-like instruction determine the lanes used on the use operands
75   /// and call addUsedLanesOnOperand() for them.
76   void transferUsedLanesStep(const MachineOperand &Def, LaneBitmask UsedLanes);
77 
78   /// Given a use regiser operand \p Use and a mask of defined lanes, check
79   /// if the operand belongs to a lowersToCopies() instruction, transfer the
80   /// mask to the def and put the instruction into the worklist.
81   void transferDefinedLanesStep(const MachineOperand &Use,
82                                 LaneBitmask DefinedLanes);
83 
84   /// Given a mask \p DefinedLanes of lanes defined at operand \p OpNum
85   /// of COPY-like instruction, determine which lanes are defined at the output
86   /// operand \p Def.
87   LaneBitmask transferDefinedLanes(const MachineOperand &Def, unsigned OpNum,
88                                    LaneBitmask DefinedLanes) const;
89 
90   LaneBitmask determineInitialDefinedLanes(unsigned Reg);
91   LaneBitmask determineInitialUsedLanes(unsigned Reg);
92 
93   const MachineRegisterInfo *MRI;
94   const TargetRegisterInfo *TRI;
95 
96   void PutInWorklist(unsigned RegIdx) {
97     if (WorklistMembers.test(RegIdx))
98       return;
99     WorklistMembers.set(RegIdx);
100     Worklist.push_back(RegIdx);
101   }
102 
103   VRegInfo *VRegInfos;
104   /// Worklist containing virtreg indexes.
105   std::deque<unsigned> Worklist;
106   BitVector WorklistMembers;
107   /// This bitvector is set for each vreg index where the vreg is defined
108   /// by an instruction where lowersToCopies()==true.
109   BitVector DefinedByCopy;
110 };
111 
112 } // end anonymous namespace
113 
114 char DetectDeadLanes::ID = 0;
115 char &llvm::DetectDeadLanesID = DetectDeadLanes::ID;
116 
117 INITIALIZE_PASS(DetectDeadLanes, "detect-dead-lanes", "Detect Dead Lanes",
118                 false, false)
119 
120 /// Returns true if \p MI will get lowered to a series of COPY instructions.
121 /// We call this a COPY-like instruction.
122 static bool lowersToCopies(const MachineInstr &MI) {
123   // Note: We could support instructions with MCInstrDesc::isRegSequenceLike(),
124   // isExtractSubRegLike(), isInsertSubregLike() in the future even though they
125   // are not lowered to a COPY.
126   switch (MI.getOpcode()) {
127   case TargetOpcode::COPY:
128   case TargetOpcode::PHI:
129   case TargetOpcode::INSERT_SUBREG:
130   case TargetOpcode::REG_SEQUENCE:
131   case TargetOpcode::EXTRACT_SUBREG:
132     return true;
133   }
134   return false;
135 }
136 
137 static bool isCrossCopy(const MachineRegisterInfo &MRI,
138                         const MachineInstr &MI,
139                         const TargetRegisterClass *DstRC,
140                         const MachineOperand &MO) {
141   assert(lowersToCopies(MI));
142   unsigned SrcReg = MO.getReg();
143   const TargetRegisterClass *SrcRC = MRI.getRegClass(SrcReg);
144   if (DstRC == SrcRC)
145     return false;
146 
147   unsigned SrcSubIdx = MO.getSubReg();
148 
149   const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
150   unsigned DstSubIdx = 0;
151   switch (MI.getOpcode()) {
152   case TargetOpcode::INSERT_SUBREG:
153     if (MI.getOperandNo(&MO) == 2)
154       DstSubIdx = MI.getOperand(3).getImm();
155     break;
156   case TargetOpcode::REG_SEQUENCE: {
157     unsigned OpNum = MI.getOperandNo(&MO);
158     DstSubIdx = MI.getOperand(OpNum+1).getImm();
159     break;
160   }
161   case TargetOpcode::EXTRACT_SUBREG: {
162     unsigned SubReg = MI.getOperand(2).getImm();
163     SrcSubIdx = TRI.composeSubRegIndices(SubReg, SrcSubIdx);
164   }
165   }
166 
167   unsigned PreA, PreB; // Unused.
168   if (SrcSubIdx && DstSubIdx)
169     return !TRI.getCommonSuperRegClass(SrcRC, SrcSubIdx, DstRC, DstSubIdx, PreA,
170                                        PreB);
171   if (SrcSubIdx)
172     return !TRI.getMatchingSuperRegClass(SrcRC, DstRC, SrcSubIdx);
173   if (DstSubIdx)
174     return !TRI.getMatchingSuperRegClass(DstRC, SrcRC, DstSubIdx);
175   return !TRI.getCommonSubClass(SrcRC, DstRC);
176 }
177 
178 void DetectDeadLanes::addUsedLanesOnOperand(const MachineOperand &MO,
179                                             LaneBitmask UsedLanes) {
180   if (!MO.readsReg())
181     return;
182   unsigned MOReg = MO.getReg();
183   if (!TargetRegisterInfo::isVirtualRegister(MOReg))
184     return;
185 
186   unsigned MOSubReg = MO.getSubReg();
187   if (MOSubReg != 0)
188     UsedLanes = TRI->composeSubRegIndexLaneMask(MOSubReg, UsedLanes);
189   UsedLanes &= MRI->getMaxLaneMaskForVReg(MOReg);
190 
191   unsigned MORegIdx = TargetRegisterInfo::virtReg2Index(MOReg);
192   VRegInfo &MORegInfo = VRegInfos[MORegIdx];
193   LaneBitmask PrevUsedLanes = MORegInfo.UsedLanes;
194   // Any change at all?
195   if ((UsedLanes & ~PrevUsedLanes) == 0)
196     return;
197 
198   // Set UsedLanes and remember instruction for further propagation.
199   MORegInfo.UsedLanes = PrevUsedLanes | UsedLanes;
200   if (DefinedByCopy.test(MORegIdx))
201     PutInWorklist(MORegIdx);
202 }
203 
204 void DetectDeadLanes::transferUsedLanesStep(const MachineOperand &Def,
205                                             LaneBitmask UsedLanes) {
206   const MachineInstr &MI = *Def.getParent();
207   switch (MI.getOpcode()) {
208   case TargetOpcode::COPY:
209   case TargetOpcode::PHI:
210     for (const MachineOperand &MO : MI.uses()) {
211       if (MO.isReg() && MO.isUse())
212         addUsedLanesOnOperand(MO, UsedLanes);
213     }
214     break;
215   case TargetOpcode::REG_SEQUENCE: {
216     // Note: This loop makes the conservative assumption that subregister
217     // indices do not overlap or that we do not know how the overlap is
218     // resolved when lowering to copies.
219     for (unsigned I = 1, N = MI.getNumOperands(); I < N; I += 2) {
220       const MachineOperand &MO = MI.getOperand(I);
221       unsigned SubIdx = MI.getOperand(I + 1).getImm();
222       LaneBitmask MOUsedLanes =
223           TRI->reverseComposeSubRegIndexLaneMask(SubIdx, UsedLanes);
224 
225       addUsedLanesOnOperand(MO, MOUsedLanes);
226     }
227     break;
228   }
229   case TargetOpcode::INSERT_SUBREG: {
230     const MachineOperand &MO2 = MI.getOperand(2);
231     unsigned SubIdx = MI.getOperand(3).getImm();
232     LaneBitmask MO2UsedLanes =
233         TRI->reverseComposeSubRegIndexLaneMask(SubIdx, UsedLanes);
234     addUsedLanesOnOperand(MO2, MO2UsedLanes);
235 
236     const MachineOperand &MO1 = MI.getOperand(1);
237     unsigned DefReg = Def.getReg();
238     const TargetRegisterClass *RC = MRI->getRegClass(DefReg);
239     LaneBitmask MO1UsedLanes;
240     if (RC->CoveredBySubRegs)
241       MO1UsedLanes = UsedLanes & ~TRI->getSubRegIndexLaneMask(SubIdx);
242     else
243       MO1UsedLanes = RC->LaneMask;
244     addUsedLanesOnOperand(MO1, MO1UsedLanes);
245     break;
246   }
247   case TargetOpcode::EXTRACT_SUBREG: {
248     const MachineOperand &MO = MI.getOperand(1);
249     unsigned SubIdx = MI.getOperand(2).getImm();
250     LaneBitmask MOUsedLanes =
251         TRI->composeSubRegIndexLaneMask(SubIdx, UsedLanes);
252     addUsedLanesOnOperand(MO, MOUsedLanes);
253     break;
254   }
255   default:
256     llvm_unreachable("function must be called with COPY-like instruction");
257   }
258 }
259 
260 void DetectDeadLanes::transferDefinedLanesStep(const MachineOperand &Use,
261                                                LaneBitmask DefinedLanes) {
262   if (!Use.readsReg())
263     return;
264   // Check whether the operand writes a vreg and is part of a COPY-like
265   // instruction.
266   const MachineInstr &MI = *Use.getParent();
267   if (MI.getDesc().getNumDefs() != 1)
268     return;
269   // FIXME: PATCHPOINT instructions announce a Def that does not always exist,
270   // they really need to be modeled differently!
271   if (MI.getOpcode() == TargetOpcode::PATCHPOINT)
272     return;
273   const MachineOperand &Def = *MI.defs().begin();
274   unsigned DefReg = Def.getReg();
275   if (!TargetRegisterInfo::isVirtualRegister(DefReg))
276     return;
277   unsigned DefRegIdx = TargetRegisterInfo::virtReg2Index(DefReg);
278   if (!DefinedByCopy.test(DefRegIdx))
279     return;
280 
281   unsigned OpNum = MI.getOperandNo(&Use);
282   DefinedLanes =
283       TRI->reverseComposeSubRegIndexLaneMask(Use.getSubReg(), DefinedLanes);
284   DefinedLanes = transferDefinedLanes(Def, OpNum, DefinedLanes);
285 
286   VRegInfo &RegInfo = VRegInfos[DefRegIdx];
287   LaneBitmask PrevDefinedLanes = RegInfo.DefinedLanes;
288   // Any change at all?
289   if ((DefinedLanes & ~PrevDefinedLanes) == 0)
290     return;
291 
292   RegInfo.DefinedLanes = PrevDefinedLanes | DefinedLanes;
293   PutInWorklist(DefRegIdx);
294 }
295 
296 LaneBitmask DetectDeadLanes::transferDefinedLanes(const MachineOperand &Def,
297     unsigned OpNum, LaneBitmask DefinedLanes) const {
298   const MachineInstr &MI = *Def.getParent();
299   // Translate DefinedLanes if necessary.
300   switch (MI.getOpcode()) {
301   case TargetOpcode::REG_SEQUENCE: {
302     unsigned SubIdx = MI.getOperand(OpNum + 1).getImm();
303     DefinedLanes = TRI->composeSubRegIndexLaneMask(SubIdx, DefinedLanes);
304     DefinedLanes &= TRI->getSubRegIndexLaneMask(SubIdx);
305     break;
306   }
307   case TargetOpcode::INSERT_SUBREG: {
308     unsigned SubIdx = MI.getOperand(3).getImm();
309     if (OpNum == 2) {
310       DefinedLanes = TRI->composeSubRegIndexLaneMask(SubIdx, DefinedLanes);
311       DefinedLanes &= TRI->getSubRegIndexLaneMask(SubIdx);
312     } else {
313       assert(OpNum == 1 && "INSERT_SUBREG must have two operands");
314       // Ignore lanes defined by operand 2.
315       DefinedLanes &= ~TRI->getSubRegIndexLaneMask(SubIdx);
316     }
317     break;
318   }
319   case TargetOpcode::EXTRACT_SUBREG: {
320     unsigned SubIdx = MI.getOperand(2).getImm();
321     assert(OpNum == 1 && "EXTRACT_SUBREG must have one register operand only");
322     DefinedLanes = TRI->reverseComposeSubRegIndexLaneMask(SubIdx, DefinedLanes);
323     break;
324   }
325   case TargetOpcode::COPY:
326   case TargetOpcode::PHI:
327     break;
328   default:
329     llvm_unreachable("function must be called with COPY-like instruction");
330   }
331 
332   assert(Def.getSubReg() == 0 &&
333          "Should not have subregister defs in machine SSA phase");
334   DefinedLanes &= MRI->getMaxLaneMaskForVReg(Def.getReg());
335   return DefinedLanes;
336 }
337 
338 LaneBitmask DetectDeadLanes::determineInitialDefinedLanes(unsigned Reg) {
339   // Live-In or unused registers have no definition but are considered fully
340   // defined.
341   if (!MRI->hasOneDef(Reg))
342     return ~0u;
343 
344   const MachineOperand &Def = *MRI->def_begin(Reg);
345   const MachineInstr &DefMI = *Def.getParent();
346   if (lowersToCopies(DefMI)) {
347     // Start optimisatically with no used or defined lanes for copy
348     // instructions. The following dataflow analysis will add more bits.
349     unsigned RegIdx = TargetRegisterInfo::virtReg2Index(Reg);
350     DefinedByCopy.set(RegIdx);
351     PutInWorklist(RegIdx);
352 
353     if (Def.isDead())
354       return 0;
355 
356     // COPY/PHI can copy across unrelated register classes (example: float/int)
357     // with incompatible subregister structure. Do not include these in the
358     // dataflow analysis since we cannot transfer lanemasks in a meaningful way.
359     const TargetRegisterClass *DefRC = MRI->getRegClass(Reg);
360 
361     // Determine initially DefinedLanes.
362     LaneBitmask DefinedLanes = 0;
363     for (const MachineOperand &MO : DefMI.uses()) {
364       if (!MO.isReg() || !MO.readsReg())
365         continue;
366       unsigned MOReg = MO.getReg();
367       if (!MOReg)
368         continue;
369 
370       LaneBitmask MODefinedLanes;
371       if (TargetRegisterInfo::isPhysicalRegister(MOReg)) {
372         MODefinedLanes = ~0u;
373       } else if (isCrossCopy(*MRI, DefMI, DefRC, MO)) {
374         MODefinedLanes = ~0u;
375       } else {
376         assert(TargetRegisterInfo::isVirtualRegister(MOReg));
377         if (MRI->hasOneDef(MOReg)) {
378           const MachineOperand &MODef = *MRI->def_begin(MOReg);
379           const MachineInstr &MODefMI = *MODef.getParent();
380           // Bits from copy-like operations will be added later.
381           if (lowersToCopies(MODefMI) || MODefMI.isImplicitDef())
382             continue;
383         }
384         unsigned MOSubReg = MO.getSubReg();
385         MODefinedLanes = MRI->getMaxLaneMaskForVReg(MOReg);
386         MODefinedLanes = TRI->reverseComposeSubRegIndexLaneMask(
387             MOSubReg, MODefinedLanes);
388       }
389 
390       unsigned OpNum = DefMI.getOperandNo(&MO);
391       DefinedLanes |= transferDefinedLanes(Def, OpNum, MODefinedLanes);
392     }
393     return DefinedLanes;
394   }
395   if (DefMI.isImplicitDef() || Def.isDead())
396     return 0;
397 
398   assert(Def.getSubReg() == 0 &&
399          "Should not have subregister defs in machine SSA phase");
400   return MRI->getMaxLaneMaskForVReg(Reg);
401 }
402 
403 LaneBitmask DetectDeadLanes::determineInitialUsedLanes(unsigned Reg) {
404   LaneBitmask UsedLanes = 0;
405   for (const MachineOperand &MO : MRI->use_nodbg_operands(Reg)) {
406     if (!MO.readsReg())
407       continue;
408 
409     const MachineInstr &UseMI = *MO.getParent();
410     if (UseMI.isKill())
411       continue;
412 
413     unsigned SubReg = MO.getSubReg();
414     if (lowersToCopies(UseMI)) {
415       assert(UseMI.getDesc().getNumDefs() == 1);
416       const MachineOperand &Def = *UseMI.defs().begin();
417       unsigned DefReg = Def.getReg();
418       // The used lanes of COPY-like instruction operands are determined by the
419       // following dataflow analysis.
420       if (TargetRegisterInfo::isVirtualRegister(DefReg)) {
421         // But ignore copies across incompatible register classes.
422         bool CrossCopy = false;
423         if (lowersToCopies(UseMI)) {
424           const TargetRegisterClass *DstRC = MRI->getRegClass(DefReg);
425           CrossCopy = isCrossCopy(*MRI, UseMI, DstRC, MO);
426         }
427 
428         if (!CrossCopy)
429           continue;
430       }
431     }
432 
433     // Shortcut: All lanes are used.
434     if (SubReg == 0)
435       return MRI->getMaxLaneMaskForVReg(Reg);
436 
437     UsedLanes |= TRI->getSubRegIndexLaneMask(SubReg);
438   }
439   return UsedLanes;
440 }
441 
442 bool DetectDeadLanes::runOnMachineFunction(MachineFunction &MF) {
443   // Don't bother if we won't track subregister liveness later.  This pass is
444   // required for correctness if subregister liveness is enabled because the
445   // register coalescer cannot deal with hidden dead defs. However without
446   // subregister liveness enabled, the expected benefits of this pass are small
447   // so we safe the compile time.
448   if (!MF.getSubtarget().enableSubRegLiveness()) {
449     DEBUG(dbgs() << "Skipping Detect dead lanes pass\n");
450     return false;
451   }
452 
453   MRI = &MF.getRegInfo();
454   TRI = MRI->getTargetRegisterInfo();
455 
456   unsigned NumVirtRegs = MRI->getNumVirtRegs();
457   VRegInfos = new VRegInfo[NumVirtRegs];
458   WorklistMembers.resize(NumVirtRegs);
459   DefinedByCopy.resize(NumVirtRegs);
460 
461   // First pass: Populate defs/uses of vregs with initial values
462   for (unsigned RegIdx = 0; RegIdx < NumVirtRegs; ++RegIdx) {
463     unsigned Reg = TargetRegisterInfo::index2VirtReg(RegIdx);
464 
465     // Determine used/defined lanes and add copy instructions to worklist.
466     VRegInfo &Info = VRegInfos[RegIdx];
467     Info.DefinedLanes = determineInitialDefinedLanes(Reg);
468     Info.UsedLanes = determineInitialUsedLanes(Reg);
469   }
470 
471   // Iterate as long as defined lanes/used lanes keep changing.
472   while (!Worklist.empty()) {
473     unsigned RegIdx = Worklist.front();
474     Worklist.pop_front();
475     WorklistMembers.reset(RegIdx);
476     VRegInfo &Info = VRegInfos[RegIdx];
477     unsigned Reg = TargetRegisterInfo::index2VirtReg(RegIdx);
478 
479     // Transfer UsedLanes to operands of DefMI (backwards dataflow).
480     MachineOperand &Def = *MRI->def_begin(Reg);
481     transferUsedLanesStep(Def, Info.UsedLanes);
482     // Transfer DefinedLanes to users of Reg (forward dataflow).
483     for (const MachineOperand &MO : MRI->use_nodbg_operands(Reg))
484       transferDefinedLanesStep(MO, Info.DefinedLanes);
485   }
486 
487   DEBUG(
488     dbgs() << "Defined/Used lanes:\n";
489     for (unsigned RegIdx = 0; RegIdx < NumVirtRegs; ++RegIdx) {
490       unsigned Reg = TargetRegisterInfo::index2VirtReg(RegIdx);
491       const VRegInfo &Info = VRegInfos[RegIdx];
492       dbgs() << PrintReg(Reg, nullptr)
493              << " Used: " << PrintLaneMask(Info.UsedLanes)
494              << " Def: " << PrintLaneMask(Info.DefinedLanes) << '\n';
495     }
496     dbgs() << "\n";
497   );
498 
499   // Mark operands as dead/unused.
500   for (MachineBasicBlock &MBB : MF) {
501     for (MachineInstr &MI : MBB) {
502       for (MachineOperand &MO : MI.operands()) {
503         if (!MO.isReg())
504           continue;
505         unsigned Reg = MO.getReg();
506         if (!TargetRegisterInfo::isVirtualRegister(Reg))
507           continue;
508         unsigned SubReg = MO.getSubReg();
509         LaneBitmask Mask = TRI->getSubRegIndexLaneMask(SubReg);
510         unsigned RegIdx = TargetRegisterInfo::virtReg2Index(Reg);
511         const VRegInfo &RegInfo = VRegInfos[RegIdx];
512         if (RegInfo.UsedLanes == 0 && MO.isDef() && !MO.isDead()) {
513           DEBUG(dbgs() << "Marking operand '" << MO << "' as dead in " << MI);
514           MO.setIsDead();
515         }
516         if (((RegInfo.UsedLanes & Mask) == 0 ||
517              (RegInfo.DefinedLanes & Mask) == 0) && MO.readsReg()) {
518           DEBUG(dbgs() << "Marking operand '" << MO << "' as undef in " << MI);
519           MO.setIsUndef();
520         }
521       }
522     }
523   }
524 
525   DefinedByCopy.clear();
526   WorklistMembers.clear();
527   delete[] VRegInfos;
528   return true;
529 }
530