ReduceInstructionsMIR.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. //===- ReduceInstructionsMIR.cpp - Specialized Delta 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 file implements a function which calls the Generic Delta pass in order
  10. // to reduce uninteresting MachineInstr from the MachineFunction.
  11. //
  12. //===----------------------------------------------------------------------===//
  13. #include "ReduceInstructionsMIR.h"
  14. #include "Delta.h"
  15. #include "llvm/ADT/SetVector.h"
  16. #include "llvm/CodeGen/MachineDominators.h"
  17. #include "llvm/CodeGen/MachineFunction.h"
  18. #include "llvm/CodeGen/MachineFunctionPass.h"
  19. #include "llvm/CodeGen/MachineModuleInfo.h"
  20. #include "llvm/CodeGen/MachineRegisterInfo.h"
  21. #include "llvm/CodeGen/TargetInstrInfo.h"
  22. using namespace llvm;
  23. static Register getPrevDefOfRCInMBB(MachineBasicBlock &MBB,
  24. MachineBasicBlock::reverse_iterator &RI,
  25. const RegClassOrRegBank &RC, LLT Ty,
  26. SetVector<MachineInstr *> &ExcludeMIs) {
  27. auto MRI = &MBB.getParent()->getRegInfo();
  28. for (MachineBasicBlock::reverse_instr_iterator E = MBB.instr_rend(); RI != E;
  29. ++RI) {
  30. auto &MI = *RI;
  31. // All Def operands explicit and implicit.
  32. for (auto &MO : MI.operands()) {
  33. if (!MO.isReg() || !MO.isDef() || MO.isDead())
  34. continue;
  35. auto Reg = MO.getReg();
  36. if (Reg.isPhysical())
  37. continue;
  38. if (MRI->getRegClassOrRegBank(Reg) == RC && MRI->getType(Reg) == Ty &&
  39. !ExcludeMIs.count(MO.getParent()))
  40. return Reg;
  41. }
  42. }
  43. return 0;
  44. }
  45. static bool shouldNotRemoveInstruction(const TargetInstrInfo &TII,
  46. const MachineInstr &MI) {
  47. if (MI.isTerminator())
  48. return true;
  49. // The MIR is almost certainly going to be invalid if frame instructions are
  50. // deleted individually since they need to come in balanced pairs, so don't
  51. // try to delete them.
  52. if (MI.getOpcode() == TII.getCallFrameSetupOpcode() ||
  53. MI.getOpcode() == TII.getCallFrameDestroyOpcode())
  54. return true;
  55. return false;
  56. }
  57. static void extractInstrFromFunction(Oracle &O, MachineFunction &MF) {
  58. MachineDominatorTree MDT;
  59. MDT.runOnMachineFunction(MF);
  60. auto MRI = &MF.getRegInfo();
  61. SetVector<MachineInstr *> ToDelete;
  62. const TargetSubtargetInfo &STI = MF.getSubtarget();
  63. const TargetInstrInfo *TII = STI.getInstrInfo();
  64. MachineBasicBlock *EntryMBB = &*MF.begin();
  65. MachineBasicBlock::iterator EntryInsPt =
  66. EntryMBB->SkipPHIsLabelsAndDebug(EntryMBB->begin());
  67. // Mark MIs for deletion according to some criteria.
  68. for (auto &MBB : MF) {
  69. for (auto &MI : MBB) {
  70. if (shouldNotRemoveInstruction(*TII, MI))
  71. continue;
  72. if (!O.shouldKeep())
  73. ToDelete.insert(&MI);
  74. }
  75. }
  76. // For each MI to be deleted update users of regs defined by that MI to use
  77. // some other dominating definition (that is not to be deleted).
  78. for (auto *MI : ToDelete) {
  79. for (auto &MO : MI->operands()) {
  80. if (!MO.isReg() || !MO.isDef() || MO.isDead())
  81. continue;
  82. auto Reg = MO.getReg();
  83. if (Reg.isPhysical())
  84. continue;
  85. auto UI = MRI->use_begin(Reg);
  86. auto UE = MRI->use_end();
  87. const auto &RegRC = MRI->getRegClassOrRegBank(Reg);
  88. LLT RegTy = MRI->getType(Reg);
  89. Register NewReg = 0;
  90. // If this is not a physical register and there are some uses.
  91. if (UI != UE) {
  92. MachineBasicBlock::reverse_iterator RI(*MI);
  93. MachineBasicBlock *BB = MI->getParent();
  94. ++RI;
  95. if (MDT.isReachableFromEntry(BB)) {
  96. while (NewReg == 0 && BB) {
  97. NewReg = getPrevDefOfRCInMBB(*BB, RI, RegRC, RegTy, ToDelete);
  98. // Prepare for idom(BB).
  99. if (auto *IDM = MDT.getNode(BB)->getIDom()) {
  100. BB = IDM->getBlock();
  101. RI = BB->rbegin();
  102. } else {
  103. BB = nullptr;
  104. }
  105. }
  106. }
  107. }
  108. // If no dominating definition was found then add an implicit def to the
  109. // top of the entry block.
  110. if (!NewReg) {
  111. NewReg = MRI->cloneVirtualRegister(Reg);
  112. bool IsGeneric = MRI->getRegClassOrNull(Reg) == nullptr;
  113. unsigned ImpDef = IsGeneric ? TargetOpcode::G_IMPLICIT_DEF
  114. : TargetOpcode::IMPLICIT_DEF;
  115. unsigned State = getRegState(MO);
  116. if (MO.getSubReg())
  117. State |= RegState::Undef;
  118. BuildMI(*EntryMBB, EntryInsPt, DebugLoc(), TII->get(ImpDef))
  119. .addReg(NewReg, State, MO.getSubReg());
  120. }
  121. // Update all uses.
  122. while (UI != UE) {
  123. auto &UMO = *UI++;
  124. UMO.setReg(NewReg);
  125. }
  126. }
  127. }
  128. // Finally delete the MIs.
  129. for (auto *MI : ToDelete)
  130. MI->eraseFromParent();
  131. }
  132. static void extractInstrFromModule(Oracle &O, ReducerWorkItem &WorkItem) {
  133. for (const Function &F : WorkItem.getModule()) {
  134. if (MachineFunction *MF = WorkItem.MMI->getMachineFunction(F))
  135. extractInstrFromFunction(O, *MF);
  136. }
  137. }
  138. void llvm::reduceInstructionsMIRDeltaPass(TestRunner &Test) {
  139. runDeltaPass(Test, extractInstrFromModule, "Reducing Instructions");
  140. }