DetectDeadLanes.cpp 21 KB

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