MachineLateInstrsCleanup.cpp 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. //==--- MachineLateInstrsCleanup.cpp - Late Instructions Cleanup Pass -----===//
  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. // This simple pass removes any identical and redundant immediate or address
  10. // loads to the same register. The immediate loads removed can originally be
  11. // the result of rematerialization, while the addresses are redundant frame
  12. // addressing anchor points created during Frame Indices elimination.
  13. //
  14. //===----------------------------------------------------------------------===//
  15. #include "llvm/ADT/BitVector.h"
  16. #include "llvm/ADT/PostOrderIterator.h"
  17. #include "llvm/ADT/SmallPtrSet.h"
  18. #include "llvm/ADT/Statistic.h"
  19. #include "llvm/CodeGen/MachineBasicBlock.h"
  20. #include "llvm/CodeGen/MachineFunction.h"
  21. #include "llvm/CodeGen/MachineFunctionPass.h"
  22. #include "llvm/CodeGen/MachineInstr.h"
  23. #include "llvm/CodeGen/MachineOperand.h"
  24. #include "llvm/CodeGen/MachineRegisterInfo.h"
  25. #include "llvm/CodeGen/TargetInstrInfo.h"
  26. #include "llvm/CodeGen/TargetRegisterInfo.h"
  27. #include "llvm/CodeGen/TargetSubtargetInfo.h"
  28. #include "llvm/InitializePasses.h"
  29. #include "llvm/Pass.h"
  30. #include "llvm/Support/Debug.h"
  31. using namespace llvm;
  32. #define DEBUG_TYPE "machine-latecleanup"
  33. STATISTIC(NumRemoved, "Number of redundant instructions removed.");
  34. namespace {
  35. class MachineLateInstrsCleanup : public MachineFunctionPass {
  36. const TargetRegisterInfo *TRI;
  37. const TargetInstrInfo *TII;
  38. // Data structures to map regs to their definitions per MBB.
  39. using Reg2DefMap = std::map<Register, MachineInstr*>;
  40. std::vector<Reg2DefMap> RegDefs;
  41. // Walk through the instructions in MBB and remove any redundant
  42. // instructions.
  43. bool processBlock(MachineBasicBlock *MBB);
  44. public:
  45. static char ID; // Pass identification, replacement for typeid
  46. MachineLateInstrsCleanup() : MachineFunctionPass(ID) {
  47. initializeMachineLateInstrsCleanupPass(*PassRegistry::getPassRegistry());
  48. }
  49. void getAnalysisUsage(AnalysisUsage &AU) const override {
  50. AU.setPreservesCFG();
  51. MachineFunctionPass::getAnalysisUsage(AU);
  52. }
  53. bool runOnMachineFunction(MachineFunction &MF) override;
  54. MachineFunctionProperties getRequiredProperties() const override {
  55. return MachineFunctionProperties().set(
  56. MachineFunctionProperties::Property::NoVRegs);
  57. }
  58. };
  59. } // end anonymous namespace
  60. char MachineLateInstrsCleanup::ID = 0;
  61. char &llvm::MachineLateInstrsCleanupID = MachineLateInstrsCleanup::ID;
  62. INITIALIZE_PASS(MachineLateInstrsCleanup, DEBUG_TYPE,
  63. "Machine Late Instructions Cleanup Pass", false, false)
  64. bool MachineLateInstrsCleanup::runOnMachineFunction(MachineFunction &MF) {
  65. if (skipFunction(MF.getFunction()))
  66. return false;
  67. TRI = MF.getSubtarget().getRegisterInfo();
  68. TII = MF.getSubtarget().getInstrInfo();
  69. RegDefs.clear();
  70. RegDefs.resize(MF.getNumBlockIDs());
  71. // Visit all MBBs in an order that maximises the reuse from predecessors.
  72. bool Changed = false;
  73. ReversePostOrderTraversal<MachineFunction *> RPOT(&MF);
  74. for (MachineBasicBlock *MBB : RPOT)
  75. Changed |= processBlock(MBB);
  76. return Changed;
  77. }
  78. // Clear any previous kill flag on Reg found before I in MBB. Walk backwards
  79. // in MBB and if needed continue in predecessors until a use/def of Reg is
  80. // encountered. This seems to be faster in practice than tracking kill flags
  81. // in a map.
  82. static void clearKillsForDef(Register Reg, MachineBasicBlock *MBB,
  83. MachineBasicBlock::iterator I,
  84. BitVector &VisitedPreds,
  85. const TargetRegisterInfo *TRI) {
  86. VisitedPreds.set(MBB->getNumber());
  87. while (I != MBB->begin()) {
  88. --I;
  89. bool Found = false;
  90. for (auto &MO : I->operands())
  91. if (MO.isReg() && TRI->regsOverlap(MO.getReg(), Reg)) {
  92. if (MO.isDef())
  93. return;
  94. if (MO.readsReg()) {
  95. MO.setIsKill(false);
  96. Found = true; // Keep going for an implicit kill of the super-reg.
  97. }
  98. }
  99. if (Found)
  100. return;
  101. }
  102. // If an earlier def is not in MBB, continue in predecessors.
  103. if (!MBB->isLiveIn(Reg))
  104. MBB->addLiveIn(Reg);
  105. assert(!MBB->pred_empty() && "Predecessor def not found!");
  106. for (MachineBasicBlock *Pred : MBB->predecessors())
  107. if (!VisitedPreds.test(Pred->getNumber()))
  108. clearKillsForDef(Reg, Pred, Pred->end(), VisitedPreds, TRI);
  109. }
  110. static void removeRedundantDef(MachineInstr *MI,
  111. const TargetRegisterInfo *TRI) {
  112. Register Reg = MI->getOperand(0).getReg();
  113. BitVector VisitedPreds(MI->getMF()->getNumBlockIDs());
  114. clearKillsForDef(Reg, MI->getParent(), MI->getIterator(), VisitedPreds, TRI);
  115. MI->eraseFromParent();
  116. ++NumRemoved;
  117. }
  118. // Return true if MI is a potential candidate for reuse/removal and if so
  119. // also the register it defines in DefedReg. A candidate is a simple
  120. // instruction that does not touch memory, has only one register definition
  121. // and the only reg it may use is FrameReg. Typically this is an immediate
  122. // load or a load-address instruction.
  123. static bool isCandidate(const MachineInstr *MI, Register &DefedReg,
  124. Register FrameReg) {
  125. DefedReg = MCRegister::NoRegister;
  126. bool SawStore = true;
  127. if (!MI->isSafeToMove(nullptr, SawStore) || MI->isImplicitDef() ||
  128. MI->isInlineAsm())
  129. return false;
  130. for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
  131. const MachineOperand &MO = MI->getOperand(i);
  132. if (MO.isReg()) {
  133. if (MO.isDef()) {
  134. if (i == 0 && !MO.isImplicit() && !MO.isDead())
  135. DefedReg = MO.getReg();
  136. else
  137. return false;
  138. } else if (MO.getReg() && MO.getReg() != FrameReg)
  139. return false;
  140. } else if (!(MO.isImm() || MO.isCImm() || MO.isFPImm() || MO.isCPI() ||
  141. MO.isGlobal() || MO.isSymbol()))
  142. return false;
  143. }
  144. return DefedReg.isValid();
  145. }
  146. bool MachineLateInstrsCleanup::processBlock(MachineBasicBlock *MBB) {
  147. bool Changed = false;
  148. Reg2DefMap &MBBDefs = RegDefs[MBB->getNumber()];
  149. // Find reusable definitions in the predecessor(s).
  150. if (!MBB->pred_empty() && !MBB->isEHPad()) {
  151. MachineBasicBlock *FirstPred = *MBB->pred_begin();
  152. for (auto [Reg, DefMI] : RegDefs[FirstPred->getNumber()])
  153. if (llvm::all_of(
  154. drop_begin(MBB->predecessors()),
  155. [&, &Reg = Reg, &DefMI = DefMI](const MachineBasicBlock *Pred) {
  156. auto PredDefI = RegDefs[Pred->getNumber()].find(Reg);
  157. return PredDefI != RegDefs[Pred->getNumber()].end() &&
  158. DefMI->isIdenticalTo(*PredDefI->second);
  159. })) {
  160. MBBDefs[Reg] = DefMI;
  161. LLVM_DEBUG(dbgs() << "Reusable instruction from pred(s): in "
  162. << printMBBReference(*MBB) << ": " << *DefMI;);
  163. }
  164. }
  165. // Process MBB.
  166. MachineFunction *MF = MBB->getParent();
  167. const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo();
  168. Register FrameReg = TRI->getFrameRegister(*MF);
  169. for (MachineInstr &MI : llvm::make_early_inc_range(*MBB)) {
  170. // If FrameReg is modified, no previous load-address instructions (using
  171. // it) are valid.
  172. if (MI.modifiesRegister(FrameReg, TRI)) {
  173. MBBDefs.clear();
  174. continue;
  175. }
  176. Register DefedReg;
  177. bool IsCandidate = isCandidate(&MI, DefedReg, FrameReg);
  178. // Check for an earlier identical and reusable instruction.
  179. if (IsCandidate) {
  180. auto DefI = MBBDefs.find(DefedReg);
  181. if (DefI != MBBDefs.end() && MI.isIdenticalTo(*DefI->second)) {
  182. LLVM_DEBUG(dbgs() << "Removing redundant instruction in "
  183. << printMBBReference(*MBB) << ": " << MI;);
  184. removeRedundantDef(&MI, TRI);
  185. Changed = true;
  186. continue;
  187. }
  188. }
  189. // Clear any entries in map that MI clobbers.
  190. for (auto DefI = MBBDefs.begin(); DefI != MBBDefs.end();) {
  191. Register Reg = DefI->first;
  192. if (MI.modifiesRegister(Reg, TRI))
  193. DefI = MBBDefs.erase(DefI);
  194. else
  195. ++DefI;
  196. }
  197. // Record this MI for potential later reuse.
  198. if (IsCandidate) {
  199. LLVM_DEBUG(dbgs() << "Found interesting instruction in "
  200. << printMBBReference(*MBB) << ": " << MI;);
  201. MBBDefs[DefedReg] = &MI;
  202. }
  203. }
  204. return Changed;
  205. }