DetectDeadLanes.cpp 21 KB

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