ProcessImplicitDefs.cpp 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. //===---------------------- ProcessImplicitDefs.cpp -----------------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #define DEBUG_TYPE "processimplicitdefs"
  10. #include "llvm/CodeGen/ProcessImplicitDefs.h"
  11. #include "llvm/ADT/DepthFirstIterator.h"
  12. #include "llvm/ADT/SmallSet.h"
  13. #include "llvm/Analysis/AliasAnalysis.h"
  14. #include "llvm/CodeGen/LiveVariables.h"
  15. #include "llvm/CodeGen/MachineInstr.h"
  16. #include "llvm/CodeGen/MachineRegisterInfo.h"
  17. #include "llvm/CodeGen/Passes.h"
  18. #include "llvm/Support/Debug.h"
  19. #include "llvm/Target/TargetInstrInfo.h"
  20. #include "llvm/Target/TargetRegisterInfo.h"
  21. using namespace llvm;
  22. char ProcessImplicitDefs::ID = 0;
  23. static RegisterPass<ProcessImplicitDefs> X("processimpdefs",
  24. "Process Implicit Definitions.");
  25. void ProcessImplicitDefs::getAnalysisUsage(AnalysisUsage &AU) const {
  26. AU.setPreservesCFG();
  27. AU.addPreserved<AliasAnalysis>();
  28. AU.addPreserved<LiveVariables>();
  29. AU.addRequired<LiveVariables>();
  30. AU.addPreservedID(MachineLoopInfoID);
  31. AU.addPreservedID(MachineDominatorsID);
  32. AU.addPreservedID(TwoAddressInstructionPassID);
  33. AU.addPreservedID(PHIEliminationID);
  34. MachineFunctionPass::getAnalysisUsage(AU);
  35. }
  36. bool ProcessImplicitDefs::CanTurnIntoImplicitDef(MachineInstr *MI,
  37. unsigned Reg, unsigned OpIdx,
  38. const TargetInstrInfo *tii_) {
  39. unsigned SrcReg, DstReg, SrcSubReg, DstSubReg;
  40. if (tii_->isMoveInstr(*MI, SrcReg, DstReg, SrcSubReg, DstSubReg) &&
  41. Reg == SrcReg)
  42. return true;
  43. if (OpIdx == 2 && MI->getOpcode() == TargetInstrInfo::SUBREG_TO_REG)
  44. return true;
  45. if (OpIdx == 1 && MI->getOpcode() == TargetInstrInfo::EXTRACT_SUBREG)
  46. return true;
  47. return false;
  48. }
  49. /// processImplicitDefs - Process IMPLICIT_DEF instructions and make sure
  50. /// there is one implicit_def for each use. Add isUndef marker to
  51. /// implicit_def defs and their uses.
  52. bool ProcessImplicitDefs::runOnMachineFunction(MachineFunction &fn) {
  53. DEBUG(errs() << "********** PROCESS IMPLICIT DEFS **********\n"
  54. << "********** Function: "
  55. << ((Value*)fn.getFunction())->getName() << '\n');
  56. bool Changed = false;
  57. const TargetInstrInfo *tii_ = fn.getTarget().getInstrInfo();
  58. const TargetRegisterInfo *tri_ = fn.getTarget().getRegisterInfo();
  59. MachineRegisterInfo *mri_ = &fn.getRegInfo();
  60. LiveVariables *lv_ = &getAnalysis<LiveVariables>();
  61. SmallSet<unsigned, 8> ImpDefRegs;
  62. SmallVector<MachineInstr*, 8> ImpDefMIs;
  63. MachineBasicBlock *Entry = fn.begin();
  64. SmallPtrSet<MachineBasicBlock*,16> Visited;
  65. for (df_ext_iterator<MachineBasicBlock*, SmallPtrSet<MachineBasicBlock*,16> >
  66. DFI = df_ext_begin(Entry, Visited), E = df_ext_end(Entry, Visited);
  67. DFI != E; ++DFI) {
  68. MachineBasicBlock *MBB = *DFI;
  69. for (MachineBasicBlock::iterator I = MBB->begin(), E = MBB->end();
  70. I != E; ) {
  71. MachineInstr *MI = &*I;
  72. ++I;
  73. if (MI->getOpcode() == TargetInstrInfo::IMPLICIT_DEF) {
  74. unsigned Reg = MI->getOperand(0).getReg();
  75. ImpDefRegs.insert(Reg);
  76. if (TargetRegisterInfo::isPhysicalRegister(Reg)) {
  77. for (const unsigned *SS = tri_->getSubRegisters(Reg); *SS; ++SS)
  78. ImpDefRegs.insert(*SS);
  79. }
  80. ImpDefMIs.push_back(MI);
  81. continue;
  82. }
  83. if (MI->getOpcode() == TargetInstrInfo::INSERT_SUBREG) {
  84. MachineOperand &MO = MI->getOperand(2);
  85. if (ImpDefRegs.count(MO.getReg())) {
  86. // %reg1032<def> = INSERT_SUBREG %reg1032, undef, 2
  87. // This is an identity copy, eliminate it now.
  88. if (MO.isKill()) {
  89. LiveVariables::VarInfo& vi = lv_->getVarInfo(MO.getReg());
  90. vi.removeKill(MI);
  91. }
  92. MI->eraseFromParent();
  93. Changed = true;
  94. continue;
  95. }
  96. }
  97. bool ChangedToImpDef = false;
  98. for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
  99. MachineOperand& MO = MI->getOperand(i);
  100. if (!MO.isReg() || !MO.isUse() || MO.isUndef())
  101. continue;
  102. unsigned Reg = MO.getReg();
  103. if (!Reg)
  104. continue;
  105. if (!ImpDefRegs.count(Reg))
  106. continue;
  107. // Use is a copy, just turn it into an implicit_def.
  108. if (CanTurnIntoImplicitDef(MI, Reg, i, tii_)) {
  109. bool isKill = MO.isKill();
  110. MI->setDesc(tii_->get(TargetInstrInfo::IMPLICIT_DEF));
  111. for (int j = MI->getNumOperands() - 1, ee = 0; j > ee; --j)
  112. MI->RemoveOperand(j);
  113. if (isKill) {
  114. ImpDefRegs.erase(Reg);
  115. LiveVariables::VarInfo& vi = lv_->getVarInfo(Reg);
  116. vi.removeKill(MI);
  117. }
  118. ChangedToImpDef = true;
  119. Changed = true;
  120. break;
  121. }
  122. Changed = true;
  123. MO.setIsUndef();
  124. if (MO.isKill() || MI->isRegTiedToDefOperand(i)) {
  125. // Make sure other uses of
  126. for (unsigned j = i+1; j != e; ++j) {
  127. MachineOperand &MOJ = MI->getOperand(j);
  128. if (MOJ.isReg() && MOJ.isUse() && MOJ.getReg() == Reg)
  129. MOJ.setIsUndef();
  130. }
  131. ImpDefRegs.erase(Reg);
  132. }
  133. }
  134. if (ChangedToImpDef) {
  135. // Backtrack to process this new implicit_def.
  136. --I;
  137. } else {
  138. for (unsigned i = 0; i != MI->getNumOperands(); ++i) {
  139. MachineOperand& MO = MI->getOperand(i);
  140. if (!MO.isReg() || !MO.isDef())
  141. continue;
  142. ImpDefRegs.erase(MO.getReg());
  143. }
  144. }
  145. }
  146. // Any outstanding liveout implicit_def's?
  147. for (unsigned i = 0, e = ImpDefMIs.size(); i != e; ++i) {
  148. MachineInstr *MI = ImpDefMIs[i];
  149. unsigned Reg = MI->getOperand(0).getReg();
  150. if (TargetRegisterInfo::isPhysicalRegister(Reg) ||
  151. !ImpDefRegs.count(Reg)) {
  152. // Delete all "local" implicit_def's. That include those which define
  153. // physical registers since they cannot be liveout.
  154. MI->eraseFromParent();
  155. Changed = true;
  156. continue;
  157. }
  158. // If there are multiple defs of the same register and at least one
  159. // is not an implicit_def, do not insert implicit_def's before the
  160. // uses.
  161. bool Skip = false;
  162. for (MachineRegisterInfo::def_iterator DI = mri_->def_begin(Reg),
  163. DE = mri_->def_end(); DI != DE; ++DI) {
  164. if (DI->getOpcode() != TargetInstrInfo::IMPLICIT_DEF) {
  165. Skip = true;
  166. break;
  167. }
  168. }
  169. if (Skip)
  170. continue;
  171. // The only implicit_def which we want to keep are those that are live
  172. // out of its block.
  173. MI->eraseFromParent();
  174. Changed = true;
  175. for (MachineRegisterInfo::use_iterator UI = mri_->use_begin(Reg),
  176. UE = mri_->use_end(); UI != UE; ) {
  177. MachineOperand &RMO = UI.getOperand();
  178. MachineInstr *RMI = &*UI;
  179. ++UI;
  180. MachineBasicBlock *RMBB = RMI->getParent();
  181. if (RMBB == MBB)
  182. continue;
  183. // Turn a copy use into an implicit_def.
  184. unsigned SrcReg, DstReg, SrcSubReg, DstSubReg;
  185. if (tii_->isMoveInstr(*RMI, SrcReg, DstReg, SrcSubReg, DstSubReg) &&
  186. Reg == SrcReg) {
  187. RMI->setDesc(tii_->get(TargetInstrInfo::IMPLICIT_DEF));
  188. for (int j = RMI->getNumOperands() - 1, ee = 0; j > ee; --j)
  189. RMI->RemoveOperand(j);
  190. continue;
  191. }
  192. const TargetRegisterClass* RC = mri_->getRegClass(Reg);
  193. unsigned NewVReg = mri_->createVirtualRegister(RC);
  194. RMO.setReg(NewVReg);
  195. RMO.setIsUndef();
  196. RMO.setIsKill();
  197. }
  198. }
  199. ImpDefRegs.clear();
  200. ImpDefMIs.clear();
  201. }
  202. return Changed;
  203. }