ProcessImplicitDefs.cpp 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  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(dbgs() << "********** 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. SmallVector<MachineInstr*, 4> RUses;
  64. SmallPtrSet<MachineBasicBlock*,16> Visited;
  65. SmallPtrSet<MachineInstr*, 8> ModInsts;
  66. MachineBasicBlock *Entry = fn.begin();
  67. for (df_ext_iterator<MachineBasicBlock*, SmallPtrSet<MachineBasicBlock*,16> >
  68. DFI = df_ext_begin(Entry, Visited), E = df_ext_end(Entry, Visited);
  69. DFI != E; ++DFI) {
  70. MachineBasicBlock *MBB = *DFI;
  71. for (MachineBasicBlock::iterator I = MBB->begin(), E = MBB->end();
  72. I != E; ) {
  73. MachineInstr *MI = &*I;
  74. ++I;
  75. if (MI->getOpcode() == TargetInstrInfo::IMPLICIT_DEF) {
  76. unsigned Reg = MI->getOperand(0).getReg();
  77. ImpDefRegs.insert(Reg);
  78. if (TargetRegisterInfo::isPhysicalRegister(Reg)) {
  79. for (const unsigned *SS = tri_->getSubRegisters(Reg); *SS; ++SS)
  80. ImpDefRegs.insert(*SS);
  81. }
  82. ImpDefMIs.push_back(MI);
  83. continue;
  84. }
  85. if (MI->getOpcode() == TargetInstrInfo::INSERT_SUBREG) {
  86. MachineOperand &MO = MI->getOperand(2);
  87. if (ImpDefRegs.count(MO.getReg())) {
  88. // %reg1032<def> = INSERT_SUBREG %reg1032, undef, 2
  89. // This is an identity copy, eliminate it now.
  90. if (MO.isKill()) {
  91. LiveVariables::VarInfo& vi = lv_->getVarInfo(MO.getReg());
  92. vi.removeKill(MI);
  93. }
  94. MI->eraseFromParent();
  95. Changed = true;
  96. continue;
  97. }
  98. }
  99. bool ChangedToImpDef = false;
  100. for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
  101. MachineOperand& MO = MI->getOperand(i);
  102. if (!MO.isReg() || !MO.isUse() || MO.isUndef())
  103. continue;
  104. unsigned Reg = MO.getReg();
  105. if (!Reg)
  106. continue;
  107. if (!ImpDefRegs.count(Reg))
  108. continue;
  109. // Use is a copy, just turn it into an implicit_def.
  110. if (CanTurnIntoImplicitDef(MI, Reg, i, tii_)) {
  111. bool isKill = MO.isKill();
  112. MI->setDesc(tii_->get(TargetInstrInfo::IMPLICIT_DEF));
  113. for (int j = MI->getNumOperands() - 1, ee = 0; j > ee; --j)
  114. MI->RemoveOperand(j);
  115. if (isKill) {
  116. ImpDefRegs.erase(Reg);
  117. LiveVariables::VarInfo& vi = lv_->getVarInfo(Reg);
  118. vi.removeKill(MI);
  119. }
  120. ChangedToImpDef = true;
  121. Changed = true;
  122. break;
  123. }
  124. Changed = true;
  125. MO.setIsUndef();
  126. if (MO.isKill() || MI->isRegTiedToDefOperand(i)) {
  127. // Make sure other uses of
  128. for (unsigned j = i+1; j != e; ++j) {
  129. MachineOperand &MOJ = MI->getOperand(j);
  130. if (MOJ.isReg() && MOJ.isUse() && MOJ.getReg() == Reg)
  131. MOJ.setIsUndef();
  132. }
  133. ImpDefRegs.erase(Reg);
  134. }
  135. }
  136. if (ChangedToImpDef) {
  137. // Backtrack to process this new implicit_def.
  138. --I;
  139. } else {
  140. for (unsigned i = 0; i != MI->getNumOperands(); ++i) {
  141. MachineOperand& MO = MI->getOperand(i);
  142. if (!MO.isReg() || !MO.isDef())
  143. continue;
  144. ImpDefRegs.erase(MO.getReg());
  145. }
  146. }
  147. }
  148. // Any outstanding liveout implicit_def's?
  149. for (unsigned i = 0, e = ImpDefMIs.size(); i != e; ++i) {
  150. MachineInstr *MI = ImpDefMIs[i];
  151. unsigned Reg = MI->getOperand(0).getReg();
  152. if (TargetRegisterInfo::isPhysicalRegister(Reg) ||
  153. !ImpDefRegs.count(Reg)) {
  154. // Delete all "local" implicit_def's. That include those which define
  155. // physical registers since they cannot be liveout.
  156. MI->eraseFromParent();
  157. Changed = true;
  158. continue;
  159. }
  160. // If there are multiple defs of the same register and at least one
  161. // is not an implicit_def, do not insert implicit_def's before the
  162. // uses.
  163. bool Skip = false;
  164. SmallVector<MachineInstr*, 4> DeadImpDefs;
  165. for (MachineRegisterInfo::def_iterator DI = mri_->def_begin(Reg),
  166. DE = mri_->def_end(); DI != DE; ++DI) {
  167. MachineInstr *DeadImpDef = &*DI;
  168. if (DeadImpDef->getOpcode() != TargetInstrInfo::IMPLICIT_DEF) {
  169. Skip = true;
  170. break;
  171. }
  172. DeadImpDefs.push_back(DeadImpDef);
  173. }
  174. if (Skip)
  175. continue;
  176. // The only implicit_def which we want to keep are those that are live
  177. // out of its block.
  178. for (unsigned j = 0, ee = DeadImpDefs.size(); j != ee; ++j)
  179. DeadImpDefs[j]->eraseFromParent();
  180. Changed = true;
  181. // Process each use instruction once.
  182. for (MachineRegisterInfo::use_iterator UI = mri_->use_begin(Reg),
  183. UE = mri_->use_end(); UI != UE; ++UI) {
  184. MachineInstr *RMI = &*UI;
  185. MachineBasicBlock *RMBB = RMI->getParent();
  186. if (RMBB == MBB)
  187. continue;
  188. if (ModInsts.insert(RMI))
  189. RUses.push_back(RMI);
  190. }
  191. for (unsigned i = 0, e = RUses.size(); i != e; ++i) {
  192. MachineInstr *RMI = RUses[i];
  193. // Turn a copy use into an implicit_def.
  194. unsigned SrcReg, DstReg, SrcSubReg, DstSubReg;
  195. if (tii_->isMoveInstr(*RMI, SrcReg, DstReg, SrcSubReg, DstSubReg) &&
  196. Reg == SrcReg) {
  197. RMI->setDesc(tii_->get(TargetInstrInfo::IMPLICIT_DEF));
  198. bool isKill = false;
  199. SmallVector<unsigned, 4> Ops;
  200. for (unsigned j = 0, ee = RMI->getNumOperands(); j != ee; ++j) {
  201. MachineOperand &RRMO = RMI->getOperand(j);
  202. if (RRMO.isReg() && RRMO.getReg() == Reg) {
  203. Ops.push_back(j);
  204. if (RRMO.isKill())
  205. isKill = true;
  206. }
  207. }
  208. // Leave the other operands along.
  209. for (unsigned j = 0, ee = Ops.size(); j != ee; ++j) {
  210. unsigned OpIdx = Ops[j];
  211. RMI->RemoveOperand(OpIdx-j);
  212. }
  213. // Update LiveVariables varinfo if the instruction is a kill.
  214. if (isKill) {
  215. LiveVariables::VarInfo& vi = lv_->getVarInfo(Reg);
  216. vi.removeKill(RMI);
  217. }
  218. continue;
  219. }
  220. // Replace Reg with a new vreg that's marked implicit.
  221. const TargetRegisterClass* RC = mri_->getRegClass(Reg);
  222. unsigned NewVReg = mri_->createVirtualRegister(RC);
  223. bool isKill = true;
  224. for (unsigned j = 0, ee = RMI->getNumOperands(); j != ee; ++j) {
  225. MachineOperand &RRMO = RMI->getOperand(j);
  226. if (RRMO.isReg() && RRMO.getReg() == Reg) {
  227. RRMO.setReg(NewVReg);
  228. RRMO.setIsUndef();
  229. if (isKill) {
  230. // Only the first operand of NewVReg is marked kill.
  231. RRMO.setIsKill();
  232. isKill = false;
  233. }
  234. }
  235. }
  236. }
  237. RUses.clear();
  238. }
  239. ModInsts.clear();
  240. ImpDefRegs.clear();
  241. ImpDefMIs.clear();
  242. }
  243. return Changed;
  244. }