ReachingDefAnalysis.cpp 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713
  1. //===---- ReachingDefAnalysis.cpp - Reaching Def 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. #include "llvm/ADT/SmallSet.h"
  9. #include "llvm/ADT/SetOperations.h"
  10. #include "llvm/CodeGen/LivePhysRegs.h"
  11. #include "llvm/CodeGen/ReachingDefAnalysis.h"
  12. #include "llvm/CodeGen/TargetRegisterInfo.h"
  13. #include "llvm/CodeGen/TargetSubtargetInfo.h"
  14. #include "llvm/Support/Debug.h"
  15. using namespace llvm;
  16. #define DEBUG_TYPE "reaching-deps-analysis"
  17. char ReachingDefAnalysis::ID = 0;
  18. INITIALIZE_PASS(ReachingDefAnalysis, DEBUG_TYPE, "ReachingDefAnalysis", false,
  19. true)
  20. static bool isValidReg(const MachineOperand &MO) {
  21. return MO.isReg() && MO.getReg();
  22. }
  23. static bool isValidRegUse(const MachineOperand &MO) {
  24. return isValidReg(MO) && MO.isUse();
  25. }
  26. static bool isValidRegUseOf(const MachineOperand &MO, MCRegister PhysReg,
  27. const TargetRegisterInfo *TRI) {
  28. if (!isValidRegUse(MO))
  29. return false;
  30. return TRI->regsOverlap(MO.getReg(), PhysReg);
  31. }
  32. static bool isValidRegDef(const MachineOperand &MO) {
  33. return isValidReg(MO) && MO.isDef();
  34. }
  35. static bool isValidRegDefOf(const MachineOperand &MO, MCRegister PhysReg,
  36. const TargetRegisterInfo *TRI) {
  37. if (!isValidRegDef(MO))
  38. return false;
  39. return TRI->regsOverlap(MO.getReg(), PhysReg);
  40. }
  41. void ReachingDefAnalysis::enterBasicBlock(MachineBasicBlock *MBB) {
  42. unsigned MBBNumber = MBB->getNumber();
  43. assert(MBBNumber < MBBReachingDefs.size() &&
  44. "Unexpected basic block number.");
  45. MBBReachingDefs[MBBNumber].resize(NumRegUnits);
  46. // Reset instruction counter in each basic block.
  47. CurInstr = 0;
  48. // Set up LiveRegs to represent registers entering MBB.
  49. // Default values are 'nothing happened a long time ago'.
  50. if (LiveRegs.empty())
  51. LiveRegs.assign(NumRegUnits, ReachingDefDefaultVal);
  52. // This is the entry block.
  53. if (MBB->pred_empty()) {
  54. for (const auto &LI : MBB->liveins()) {
  55. for (MCRegUnitIterator Unit(LI.PhysReg, TRI); Unit.isValid(); ++Unit) {
  56. // Treat function live-ins as if they were defined just before the first
  57. // instruction. Usually, function arguments are set up immediately
  58. // before the call.
  59. if (LiveRegs[*Unit] != -1) {
  60. LiveRegs[*Unit] = -1;
  61. MBBReachingDefs[MBBNumber][*Unit].push_back(-1);
  62. }
  63. }
  64. }
  65. LLVM_DEBUG(dbgs() << printMBBReference(*MBB) << ": entry\n");
  66. return;
  67. }
  68. // Try to coalesce live-out registers from predecessors.
  69. for (MachineBasicBlock *pred : MBB->predecessors()) {
  70. assert(unsigned(pred->getNumber()) < MBBOutRegsInfos.size() &&
  71. "Should have pre-allocated MBBInfos for all MBBs");
  72. const LiveRegsDefInfo &Incoming = MBBOutRegsInfos[pred->getNumber()];
  73. // Incoming is null if this is a backedge from a BB
  74. // we haven't processed yet
  75. if (Incoming.empty())
  76. continue;
  77. // Find the most recent reaching definition from a predecessor.
  78. for (unsigned Unit = 0; Unit != NumRegUnits; ++Unit)
  79. LiveRegs[Unit] = std::max(LiveRegs[Unit], Incoming[Unit]);
  80. }
  81. // Insert the most recent reaching definition we found.
  82. for (unsigned Unit = 0; Unit != NumRegUnits; ++Unit)
  83. if (LiveRegs[Unit] != ReachingDefDefaultVal)
  84. MBBReachingDefs[MBBNumber][Unit].push_back(LiveRegs[Unit]);
  85. }
  86. void ReachingDefAnalysis::leaveBasicBlock(MachineBasicBlock *MBB) {
  87. assert(!LiveRegs.empty() && "Must enter basic block first.");
  88. unsigned MBBNumber = MBB->getNumber();
  89. assert(MBBNumber < MBBOutRegsInfos.size() &&
  90. "Unexpected basic block number.");
  91. // Save register clearances at end of MBB - used by enterBasicBlock().
  92. MBBOutRegsInfos[MBBNumber] = LiveRegs;
  93. // While processing the basic block, we kept `Def` relative to the start
  94. // of the basic block for convenience. However, future use of this information
  95. // only cares about the clearance from the end of the block, so adjust
  96. // everything to be relative to the end of the basic block.
  97. for (int &OutLiveReg : MBBOutRegsInfos[MBBNumber])
  98. if (OutLiveReg != ReachingDefDefaultVal)
  99. OutLiveReg -= CurInstr;
  100. LiveRegs.clear();
  101. }
  102. void ReachingDefAnalysis::processDefs(MachineInstr *MI) {
  103. assert(!MI->isDebugInstr() && "Won't process debug instructions");
  104. unsigned MBBNumber = MI->getParent()->getNumber();
  105. assert(MBBNumber < MBBReachingDefs.size() &&
  106. "Unexpected basic block number.");
  107. for (auto &MO : MI->operands()) {
  108. if (!isValidRegDef(MO))
  109. continue;
  110. for (MCRegUnitIterator Unit(MO.getReg().asMCReg(), TRI); Unit.isValid();
  111. ++Unit) {
  112. // This instruction explicitly defines the current reg unit.
  113. LLVM_DEBUG(dbgs() << printRegUnit(*Unit, TRI) << ":\t" << CurInstr
  114. << '\t' << *MI);
  115. // How many instructions since this reg unit was last written?
  116. if (LiveRegs[*Unit] != CurInstr) {
  117. LiveRegs[*Unit] = CurInstr;
  118. MBBReachingDefs[MBBNumber][*Unit].push_back(CurInstr);
  119. }
  120. }
  121. }
  122. InstIds[MI] = CurInstr;
  123. ++CurInstr;
  124. }
  125. void ReachingDefAnalysis::reprocessBasicBlock(MachineBasicBlock *MBB) {
  126. unsigned MBBNumber = MBB->getNumber();
  127. assert(MBBNumber < MBBReachingDefs.size() &&
  128. "Unexpected basic block number.");
  129. // Count number of non-debug instructions for end of block adjustment.
  130. auto NonDbgInsts =
  131. instructionsWithoutDebug(MBB->instr_begin(), MBB->instr_end());
  132. int NumInsts = std::distance(NonDbgInsts.begin(), NonDbgInsts.end());
  133. // When reprocessing a block, the only thing we need to do is check whether
  134. // there is now a more recent incoming reaching definition from a predecessor.
  135. for (MachineBasicBlock *pred : MBB->predecessors()) {
  136. assert(unsigned(pred->getNumber()) < MBBOutRegsInfos.size() &&
  137. "Should have pre-allocated MBBInfos for all MBBs");
  138. const LiveRegsDefInfo &Incoming = MBBOutRegsInfos[pred->getNumber()];
  139. // Incoming may be empty for dead predecessors.
  140. if (Incoming.empty())
  141. continue;
  142. for (unsigned Unit = 0; Unit != NumRegUnits; ++Unit) {
  143. int Def = Incoming[Unit];
  144. if (Def == ReachingDefDefaultVal)
  145. continue;
  146. auto Start = MBBReachingDefs[MBBNumber][Unit].begin();
  147. if (Start != MBBReachingDefs[MBBNumber][Unit].end() && *Start < 0) {
  148. if (*Start >= Def)
  149. continue;
  150. // Update existing reaching def from predecessor to a more recent one.
  151. *Start = Def;
  152. } else {
  153. // Insert new reaching def from predecessor.
  154. MBBReachingDefs[MBBNumber][Unit].insert(Start, Def);
  155. }
  156. // Update reaching def at end of of BB. Keep in mind that these are
  157. // adjusted relative to the end of the basic block.
  158. if (MBBOutRegsInfos[MBBNumber][Unit] < Def - NumInsts)
  159. MBBOutRegsInfos[MBBNumber][Unit] = Def - NumInsts;
  160. }
  161. }
  162. }
  163. void ReachingDefAnalysis::processBasicBlock(
  164. const LoopTraversal::TraversedMBBInfo &TraversedMBB) {
  165. MachineBasicBlock *MBB = TraversedMBB.MBB;
  166. LLVM_DEBUG(dbgs() << printMBBReference(*MBB)
  167. << (!TraversedMBB.IsDone ? ": incomplete\n"
  168. : ": all preds known\n"));
  169. if (!TraversedMBB.PrimaryPass) {
  170. // Reprocess MBB that is part of a loop.
  171. reprocessBasicBlock(MBB);
  172. return;
  173. }
  174. enterBasicBlock(MBB);
  175. for (MachineInstr &MI :
  176. instructionsWithoutDebug(MBB->instr_begin(), MBB->instr_end()))
  177. processDefs(&MI);
  178. leaveBasicBlock(MBB);
  179. }
  180. bool ReachingDefAnalysis::runOnMachineFunction(MachineFunction &mf) {
  181. MF = &mf;
  182. TRI = MF->getSubtarget().getRegisterInfo();
  183. LLVM_DEBUG(dbgs() << "********** REACHING DEFINITION ANALYSIS **********\n");
  184. init();
  185. traverse();
  186. return false;
  187. }
  188. void ReachingDefAnalysis::releaseMemory() {
  189. // Clear the internal vectors.
  190. MBBOutRegsInfos.clear();
  191. MBBReachingDefs.clear();
  192. InstIds.clear();
  193. LiveRegs.clear();
  194. }
  195. void ReachingDefAnalysis::reset() {
  196. releaseMemory();
  197. init();
  198. traverse();
  199. }
  200. void ReachingDefAnalysis::init() {
  201. NumRegUnits = TRI->getNumRegUnits();
  202. MBBReachingDefs.resize(MF->getNumBlockIDs());
  203. // Initialize the MBBOutRegsInfos
  204. MBBOutRegsInfos.resize(MF->getNumBlockIDs());
  205. LoopTraversal Traversal;
  206. TraversedMBBOrder = Traversal.traverse(*MF);
  207. }
  208. void ReachingDefAnalysis::traverse() {
  209. // Traverse the basic blocks.
  210. for (LoopTraversal::TraversedMBBInfo TraversedMBB : TraversedMBBOrder)
  211. processBasicBlock(TraversedMBB);
  212. #ifndef NDEBUG
  213. // Make sure reaching defs are sorted and unique.
  214. for (MBBDefsInfo &MBBDefs : MBBReachingDefs) {
  215. for (MBBRegUnitDefs &RegUnitDefs : MBBDefs) {
  216. int LastDef = ReachingDefDefaultVal;
  217. for (int Def : RegUnitDefs) {
  218. assert(Def > LastDef && "Defs must be sorted and unique");
  219. LastDef = Def;
  220. }
  221. }
  222. }
  223. #endif
  224. }
  225. int ReachingDefAnalysis::getReachingDef(MachineInstr *MI,
  226. MCRegister PhysReg) const {
  227. assert(InstIds.count(MI) && "Unexpected machine instuction.");
  228. int InstId = InstIds.lookup(MI);
  229. int DefRes = ReachingDefDefaultVal;
  230. unsigned MBBNumber = MI->getParent()->getNumber();
  231. assert(MBBNumber < MBBReachingDefs.size() &&
  232. "Unexpected basic block number.");
  233. int LatestDef = ReachingDefDefaultVal;
  234. for (MCRegUnitIterator Unit(PhysReg, TRI); Unit.isValid(); ++Unit) {
  235. for (int Def : MBBReachingDefs[MBBNumber][*Unit]) {
  236. if (Def >= InstId)
  237. break;
  238. DefRes = Def;
  239. }
  240. LatestDef = std::max(LatestDef, DefRes);
  241. }
  242. return LatestDef;
  243. }
  244. MachineInstr *
  245. ReachingDefAnalysis::getReachingLocalMIDef(MachineInstr *MI,
  246. MCRegister PhysReg) const {
  247. return hasLocalDefBefore(MI, PhysReg)
  248. ? getInstFromId(MI->getParent(), getReachingDef(MI, PhysReg))
  249. : nullptr;
  250. }
  251. bool ReachingDefAnalysis::hasSameReachingDef(MachineInstr *A, MachineInstr *B,
  252. MCRegister PhysReg) const {
  253. MachineBasicBlock *ParentA = A->getParent();
  254. MachineBasicBlock *ParentB = B->getParent();
  255. if (ParentA != ParentB)
  256. return false;
  257. return getReachingDef(A, PhysReg) == getReachingDef(B, PhysReg);
  258. }
  259. MachineInstr *ReachingDefAnalysis::getInstFromId(MachineBasicBlock *MBB,
  260. int InstId) const {
  261. assert(static_cast<size_t>(MBB->getNumber()) < MBBReachingDefs.size() &&
  262. "Unexpected basic block number.");
  263. assert(InstId < static_cast<int>(MBB->size()) &&
  264. "Unexpected instruction id.");
  265. if (InstId < 0)
  266. return nullptr;
  267. for (auto &MI : *MBB) {
  268. auto F = InstIds.find(&MI);
  269. if (F != InstIds.end() && F->second == InstId)
  270. return &MI;
  271. }
  272. return nullptr;
  273. }
  274. int ReachingDefAnalysis::getClearance(MachineInstr *MI,
  275. MCRegister PhysReg) const {
  276. assert(InstIds.count(MI) && "Unexpected machine instuction.");
  277. return InstIds.lookup(MI) - getReachingDef(MI, PhysReg);
  278. }
  279. bool ReachingDefAnalysis::hasLocalDefBefore(MachineInstr *MI,
  280. MCRegister PhysReg) const {
  281. return getReachingDef(MI, PhysReg) >= 0;
  282. }
  283. void ReachingDefAnalysis::getReachingLocalUses(MachineInstr *Def,
  284. MCRegister PhysReg,
  285. InstSet &Uses) const {
  286. MachineBasicBlock *MBB = Def->getParent();
  287. MachineBasicBlock::iterator MI = MachineBasicBlock::iterator(Def);
  288. while (++MI != MBB->end()) {
  289. if (MI->isDebugInstr())
  290. continue;
  291. // If/when we find a new reaching def, we know that there's no more uses
  292. // of 'Def'.
  293. if (getReachingLocalMIDef(&*MI, PhysReg) != Def)
  294. return;
  295. for (auto &MO : MI->operands()) {
  296. if (!isValidRegUseOf(MO, PhysReg, TRI))
  297. continue;
  298. Uses.insert(&*MI);
  299. if (MO.isKill())
  300. return;
  301. }
  302. }
  303. }
  304. bool ReachingDefAnalysis::getLiveInUses(MachineBasicBlock *MBB,
  305. MCRegister PhysReg,
  306. InstSet &Uses) const {
  307. for (MachineInstr &MI :
  308. instructionsWithoutDebug(MBB->instr_begin(), MBB->instr_end())) {
  309. for (auto &MO : MI.operands()) {
  310. if (!isValidRegUseOf(MO, PhysReg, TRI))
  311. continue;
  312. if (getReachingDef(&MI, PhysReg) >= 0)
  313. return false;
  314. Uses.insert(&MI);
  315. }
  316. }
  317. auto Last = MBB->getLastNonDebugInstr();
  318. if (Last == MBB->end())
  319. return true;
  320. return isReachingDefLiveOut(&*Last, PhysReg);
  321. }
  322. void ReachingDefAnalysis::getGlobalUses(MachineInstr *MI, MCRegister PhysReg,
  323. InstSet &Uses) const {
  324. MachineBasicBlock *MBB = MI->getParent();
  325. // Collect the uses that each def touches within the block.
  326. getReachingLocalUses(MI, PhysReg, Uses);
  327. // Handle live-out values.
  328. if (auto *LiveOut = getLocalLiveOutMIDef(MI->getParent(), PhysReg)) {
  329. if (LiveOut != MI)
  330. return;
  331. SmallVector<MachineBasicBlock *, 4> ToVisit(MBB->successors());
  332. SmallPtrSet<MachineBasicBlock*, 4>Visited;
  333. while (!ToVisit.empty()) {
  334. MachineBasicBlock *MBB = ToVisit.pop_back_val();
  335. if (Visited.count(MBB) || !MBB->isLiveIn(PhysReg))
  336. continue;
  337. if (getLiveInUses(MBB, PhysReg, Uses))
  338. llvm::append_range(ToVisit, MBB->successors());
  339. Visited.insert(MBB);
  340. }
  341. }
  342. }
  343. void ReachingDefAnalysis::getGlobalReachingDefs(MachineInstr *MI,
  344. MCRegister PhysReg,
  345. InstSet &Defs) const {
  346. if (auto *Def = getUniqueReachingMIDef(MI, PhysReg)) {
  347. Defs.insert(Def);
  348. return;
  349. }
  350. for (auto *MBB : MI->getParent()->predecessors())
  351. getLiveOuts(MBB, PhysReg, Defs);
  352. }
  353. void ReachingDefAnalysis::getLiveOuts(MachineBasicBlock *MBB,
  354. MCRegister PhysReg, InstSet &Defs) const {
  355. SmallPtrSet<MachineBasicBlock*, 2> VisitedBBs;
  356. getLiveOuts(MBB, PhysReg, Defs, VisitedBBs);
  357. }
  358. void ReachingDefAnalysis::getLiveOuts(MachineBasicBlock *MBB,
  359. MCRegister PhysReg, InstSet &Defs,
  360. BlockSet &VisitedBBs) const {
  361. if (VisitedBBs.count(MBB))
  362. return;
  363. VisitedBBs.insert(MBB);
  364. LivePhysRegs LiveRegs(*TRI);
  365. LiveRegs.addLiveOuts(*MBB);
  366. if (LiveRegs.available(MBB->getParent()->getRegInfo(), PhysReg))
  367. return;
  368. if (auto *Def = getLocalLiveOutMIDef(MBB, PhysReg))
  369. Defs.insert(Def);
  370. else
  371. for (auto *Pred : MBB->predecessors())
  372. getLiveOuts(Pred, PhysReg, Defs, VisitedBBs);
  373. }
  374. MachineInstr *
  375. ReachingDefAnalysis::getUniqueReachingMIDef(MachineInstr *MI,
  376. MCRegister PhysReg) const {
  377. // If there's a local def before MI, return it.
  378. MachineInstr *LocalDef = getReachingLocalMIDef(MI, PhysReg);
  379. if (LocalDef && InstIds.lookup(LocalDef) < InstIds.lookup(MI))
  380. return LocalDef;
  381. SmallPtrSet<MachineInstr*, 2> Incoming;
  382. MachineBasicBlock *Parent = MI->getParent();
  383. for (auto *Pred : Parent->predecessors())
  384. getLiveOuts(Pred, PhysReg, Incoming);
  385. // Check that we have a single incoming value and that it does not
  386. // come from the same block as MI - since it would mean that the def
  387. // is executed after MI.
  388. if (Incoming.size() == 1 && (*Incoming.begin())->getParent() != Parent)
  389. return *Incoming.begin();
  390. return nullptr;
  391. }
  392. MachineInstr *ReachingDefAnalysis::getMIOperand(MachineInstr *MI,
  393. unsigned Idx) const {
  394. assert(MI->getOperand(Idx).isReg() && "Expected register operand");
  395. return getUniqueReachingMIDef(MI, MI->getOperand(Idx).getReg());
  396. }
  397. MachineInstr *ReachingDefAnalysis::getMIOperand(MachineInstr *MI,
  398. MachineOperand &MO) const {
  399. assert(MO.isReg() && "Expected register operand");
  400. return getUniqueReachingMIDef(MI, MO.getReg());
  401. }
  402. bool ReachingDefAnalysis::isRegUsedAfter(MachineInstr *MI,
  403. MCRegister PhysReg) const {
  404. MachineBasicBlock *MBB = MI->getParent();
  405. LivePhysRegs LiveRegs(*TRI);
  406. LiveRegs.addLiveOuts(*MBB);
  407. // Yes if the register is live out of the basic block.
  408. if (!LiveRegs.available(MBB->getParent()->getRegInfo(), PhysReg))
  409. return true;
  410. // Walk backwards through the block to see if the register is live at some
  411. // point.
  412. for (MachineInstr &Last :
  413. instructionsWithoutDebug(MBB->instr_rbegin(), MBB->instr_rend())) {
  414. LiveRegs.stepBackward(Last);
  415. if (!LiveRegs.available(MBB->getParent()->getRegInfo(), PhysReg))
  416. return InstIds.lookup(&Last) > InstIds.lookup(MI);
  417. }
  418. return false;
  419. }
  420. bool ReachingDefAnalysis::isRegDefinedAfter(MachineInstr *MI,
  421. MCRegister PhysReg) const {
  422. MachineBasicBlock *MBB = MI->getParent();
  423. auto Last = MBB->getLastNonDebugInstr();
  424. if (Last != MBB->end() &&
  425. getReachingDef(MI, PhysReg) != getReachingDef(&*Last, PhysReg))
  426. return true;
  427. if (auto *Def = getLocalLiveOutMIDef(MBB, PhysReg))
  428. return Def == getReachingLocalMIDef(MI, PhysReg);
  429. return false;
  430. }
  431. bool ReachingDefAnalysis::isReachingDefLiveOut(MachineInstr *MI,
  432. MCRegister PhysReg) const {
  433. MachineBasicBlock *MBB = MI->getParent();
  434. LivePhysRegs LiveRegs(*TRI);
  435. LiveRegs.addLiveOuts(*MBB);
  436. if (LiveRegs.available(MBB->getParent()->getRegInfo(), PhysReg))
  437. return false;
  438. auto Last = MBB->getLastNonDebugInstr();
  439. int Def = getReachingDef(MI, PhysReg);
  440. if (Last != MBB->end() && getReachingDef(&*Last, PhysReg) != Def)
  441. return false;
  442. // Finally check that the last instruction doesn't redefine the register.
  443. for (auto &MO : Last->operands())
  444. if (isValidRegDefOf(MO, PhysReg, TRI))
  445. return false;
  446. return true;
  447. }
  448. MachineInstr *
  449. ReachingDefAnalysis::getLocalLiveOutMIDef(MachineBasicBlock *MBB,
  450. MCRegister PhysReg) const {
  451. LivePhysRegs LiveRegs(*TRI);
  452. LiveRegs.addLiveOuts(*MBB);
  453. if (LiveRegs.available(MBB->getParent()->getRegInfo(), PhysReg))
  454. return nullptr;
  455. auto Last = MBB->getLastNonDebugInstr();
  456. if (Last == MBB->end())
  457. return nullptr;
  458. int Def = getReachingDef(&*Last, PhysReg);
  459. for (auto &MO : Last->operands())
  460. if (isValidRegDefOf(MO, PhysReg, TRI))
  461. return &*Last;
  462. return Def < 0 ? nullptr : getInstFromId(MBB, Def);
  463. }
  464. static bool mayHaveSideEffects(MachineInstr &MI) {
  465. return MI.mayLoadOrStore() || MI.mayRaiseFPException() ||
  466. MI.hasUnmodeledSideEffects() || MI.isTerminator() ||
  467. MI.isCall() || MI.isBarrier() || MI.isBranch() || MI.isReturn();
  468. }
  469. // Can we safely move 'From' to just before 'To'? To satisfy this, 'From' must
  470. // not define a register that is used by any instructions, after and including,
  471. // 'To'. These instructions also must not redefine any of Froms operands.
  472. template<typename Iterator>
  473. bool ReachingDefAnalysis::isSafeToMove(MachineInstr *From,
  474. MachineInstr *To) const {
  475. if (From->getParent() != To->getParent() || From == To)
  476. return false;
  477. SmallSet<int, 2> Defs;
  478. // First check that From would compute the same value if moved.
  479. for (auto &MO : From->operands()) {
  480. if (!isValidReg(MO))
  481. continue;
  482. if (MO.isDef())
  483. Defs.insert(MO.getReg());
  484. else if (!hasSameReachingDef(From, To, MO.getReg()))
  485. return false;
  486. }
  487. // Now walk checking that the rest of the instructions will compute the same
  488. // value and that we're not overwriting anything. Don't move the instruction
  489. // past any memory, control-flow or other ambiguous instructions.
  490. for (auto I = ++Iterator(From), E = Iterator(To); I != E; ++I) {
  491. if (mayHaveSideEffects(*I))
  492. return false;
  493. for (auto &MO : I->operands())
  494. if (MO.isReg() && MO.getReg() && Defs.count(MO.getReg()))
  495. return false;
  496. }
  497. return true;
  498. }
  499. bool ReachingDefAnalysis::isSafeToMoveForwards(MachineInstr *From,
  500. MachineInstr *To) const {
  501. using Iterator = MachineBasicBlock::iterator;
  502. // Walk forwards until we find the instruction.
  503. for (auto I = Iterator(From), E = From->getParent()->end(); I != E; ++I)
  504. if (&*I == To)
  505. return isSafeToMove<Iterator>(From, To);
  506. return false;
  507. }
  508. bool ReachingDefAnalysis::isSafeToMoveBackwards(MachineInstr *From,
  509. MachineInstr *To) const {
  510. using Iterator = MachineBasicBlock::reverse_iterator;
  511. // Walk backwards until we find the instruction.
  512. for (auto I = Iterator(From), E = From->getParent()->rend(); I != E; ++I)
  513. if (&*I == To)
  514. return isSafeToMove<Iterator>(From, To);
  515. return false;
  516. }
  517. bool ReachingDefAnalysis::isSafeToRemove(MachineInstr *MI,
  518. InstSet &ToRemove) const {
  519. SmallPtrSet<MachineInstr*, 1> Ignore;
  520. SmallPtrSet<MachineInstr*, 2> Visited;
  521. return isSafeToRemove(MI, Visited, ToRemove, Ignore);
  522. }
  523. bool
  524. ReachingDefAnalysis::isSafeToRemove(MachineInstr *MI, InstSet &ToRemove,
  525. InstSet &Ignore) const {
  526. SmallPtrSet<MachineInstr*, 2> Visited;
  527. return isSafeToRemove(MI, Visited, ToRemove, Ignore);
  528. }
  529. bool
  530. ReachingDefAnalysis::isSafeToRemove(MachineInstr *MI, InstSet &Visited,
  531. InstSet &ToRemove, InstSet &Ignore) const {
  532. if (Visited.count(MI) || Ignore.count(MI))
  533. return true;
  534. else if (mayHaveSideEffects(*MI)) {
  535. // Unless told to ignore the instruction, don't remove anything which has
  536. // side effects.
  537. return false;
  538. }
  539. Visited.insert(MI);
  540. for (auto &MO : MI->operands()) {
  541. if (!isValidRegDef(MO))
  542. continue;
  543. SmallPtrSet<MachineInstr*, 4> Uses;
  544. getGlobalUses(MI, MO.getReg(), Uses);
  545. for (auto *I : Uses) {
  546. if (Ignore.count(I) || ToRemove.count(I))
  547. continue;
  548. if (!isSafeToRemove(I, Visited, ToRemove, Ignore))
  549. return false;
  550. }
  551. }
  552. ToRemove.insert(MI);
  553. return true;
  554. }
  555. void ReachingDefAnalysis::collectKilledOperands(MachineInstr *MI,
  556. InstSet &Dead) const {
  557. Dead.insert(MI);
  558. auto IsDead = [this, &Dead](MachineInstr *Def, MCRegister PhysReg) {
  559. if (mayHaveSideEffects(*Def))
  560. return false;
  561. unsigned LiveDefs = 0;
  562. for (auto &MO : Def->operands()) {
  563. if (!isValidRegDef(MO))
  564. continue;
  565. if (!MO.isDead())
  566. ++LiveDefs;
  567. }
  568. if (LiveDefs > 1)
  569. return false;
  570. SmallPtrSet<MachineInstr*, 4> Uses;
  571. getGlobalUses(Def, PhysReg, Uses);
  572. return llvm::set_is_subset(Uses, Dead);
  573. };
  574. for (auto &MO : MI->operands()) {
  575. if (!isValidRegUse(MO))
  576. continue;
  577. if (MachineInstr *Def = getMIOperand(MI, MO))
  578. if (IsDead(Def, MO.getReg()))
  579. collectKilledOperands(Def, Dead);
  580. }
  581. }
  582. bool ReachingDefAnalysis::isSafeToDefRegAt(MachineInstr *MI,
  583. MCRegister PhysReg) const {
  584. SmallPtrSet<MachineInstr*, 1> Ignore;
  585. return isSafeToDefRegAt(MI, PhysReg, Ignore);
  586. }
  587. bool ReachingDefAnalysis::isSafeToDefRegAt(MachineInstr *MI, MCRegister PhysReg,
  588. InstSet &Ignore) const {
  589. // Check for any uses of the register after MI.
  590. if (isRegUsedAfter(MI, PhysReg)) {
  591. if (auto *Def = getReachingLocalMIDef(MI, PhysReg)) {
  592. SmallPtrSet<MachineInstr*, 2> Uses;
  593. getGlobalUses(Def, PhysReg, Uses);
  594. if (!llvm::set_is_subset(Uses, Ignore))
  595. return false;
  596. } else
  597. return false;
  598. }
  599. MachineBasicBlock *MBB = MI->getParent();
  600. // Check for any defs after MI.
  601. if (isRegDefinedAfter(MI, PhysReg)) {
  602. auto I = MachineBasicBlock::iterator(MI);
  603. for (auto E = MBB->end(); I != E; ++I) {
  604. if (Ignore.count(&*I))
  605. continue;
  606. for (auto &MO : I->operands())
  607. if (isValidRegDefOf(MO, PhysReg, TRI))
  608. return false;
  609. }
  610. }
  611. return true;
  612. }