2
0

OptimizePHIs.cpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. //===-- OptimizePHIs.cpp - Optimize machine instruction PHIs --------------===//
  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. //
  10. // This pass optimizes machine instruction PHIs to take advantage of
  11. // opportunities created during DAG legalization.
  12. //
  13. //===----------------------------------------------------------------------===//
  14. #include "llvm/CodeGen/Passes.h"
  15. #include "llvm/ADT/SmallPtrSet.h"
  16. #include "llvm/ADT/Statistic.h"
  17. #include "llvm/CodeGen/MachineFunctionPass.h"
  18. #include "llvm/CodeGen/MachineInstr.h"
  19. #include "llvm/CodeGen/MachineRegisterInfo.h"
  20. #include "llvm/IR/Function.h"
  21. #include "llvm/Target/TargetInstrInfo.h"
  22. #include "llvm/Target/TargetSubtargetInfo.h"
  23. using namespace llvm;
  24. #define DEBUG_TYPE "phi-opt"
  25. STATISTIC(NumPHICycles, "Number of PHI cycles replaced");
  26. STATISTIC(NumDeadPHICycles, "Number of dead PHI cycles");
  27. namespace {
  28. class OptimizePHIs : public MachineFunctionPass {
  29. MachineRegisterInfo *MRI;
  30. const TargetInstrInfo *TII;
  31. public:
  32. static char ID; // Pass identification
  33. OptimizePHIs() : MachineFunctionPass(ID) {
  34. initializeOptimizePHIsPass(*PassRegistry::getPassRegistry());
  35. }
  36. bool runOnMachineFunction(MachineFunction &MF) override;
  37. void getAnalysisUsage(AnalysisUsage &AU) const override {
  38. AU.setPreservesCFG();
  39. MachineFunctionPass::getAnalysisUsage(AU);
  40. }
  41. private:
  42. typedef SmallPtrSet<MachineInstr*, 16> InstrSet;
  43. typedef SmallPtrSetIterator<MachineInstr*> InstrSetIterator;
  44. bool IsSingleValuePHICycle(MachineInstr *MI, unsigned &SingleValReg,
  45. InstrSet &PHIsInCycle);
  46. bool IsDeadPHICycle(MachineInstr *MI, InstrSet &PHIsInCycle);
  47. bool OptimizeBB(MachineBasicBlock &MBB);
  48. };
  49. }
  50. char OptimizePHIs::ID = 0;
  51. char &llvm::OptimizePHIsID = OptimizePHIs::ID;
  52. INITIALIZE_PASS(OptimizePHIs, "opt-phis",
  53. "Optimize machine instruction PHIs", false, false)
  54. bool OptimizePHIs::runOnMachineFunction(MachineFunction &Fn) {
  55. if (skipOptnoneFunction(*Fn.getFunction()))
  56. return false;
  57. MRI = &Fn.getRegInfo();
  58. TII = Fn.getSubtarget().getInstrInfo();
  59. // Find dead PHI cycles and PHI cycles that can be replaced by a single
  60. // value. InstCombine does these optimizations, but DAG legalization may
  61. // introduce new opportunities, e.g., when i64 values are split up for
  62. // 32-bit targets.
  63. bool Changed = false;
  64. for (MachineFunction::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I)
  65. Changed |= OptimizeBB(*I);
  66. return Changed;
  67. }
  68. /// IsSingleValuePHICycle - Check if MI is a PHI where all the source operands
  69. /// are copies of SingleValReg, possibly via copies through other PHIs. If
  70. /// SingleValReg is zero on entry, it is set to the register with the single
  71. /// non-copy value. PHIsInCycle is a set used to keep track of the PHIs that
  72. /// have been scanned.
  73. bool OptimizePHIs::IsSingleValuePHICycle(MachineInstr *MI,
  74. unsigned &SingleValReg,
  75. InstrSet &PHIsInCycle) {
  76. assert(MI->isPHI() && "IsSingleValuePHICycle expects a PHI instruction");
  77. unsigned DstReg = MI->getOperand(0).getReg();
  78. // See if we already saw this register.
  79. if (!PHIsInCycle.insert(MI).second)
  80. return true;
  81. // Don't scan crazily complex things.
  82. if (PHIsInCycle.size() == 16)
  83. return false;
  84. // Scan the PHI operands.
  85. for (unsigned i = 1; i != MI->getNumOperands(); i += 2) {
  86. unsigned SrcReg = MI->getOperand(i).getReg();
  87. if (SrcReg == DstReg)
  88. continue;
  89. MachineInstr *SrcMI = MRI->getVRegDef(SrcReg);
  90. // Skip over register-to-register moves.
  91. if (SrcMI && SrcMI->isCopy() &&
  92. !SrcMI->getOperand(0).getSubReg() &&
  93. !SrcMI->getOperand(1).getSubReg() &&
  94. TargetRegisterInfo::isVirtualRegister(SrcMI->getOperand(1).getReg()))
  95. SrcMI = MRI->getVRegDef(SrcMI->getOperand(1).getReg());
  96. if (!SrcMI)
  97. return false;
  98. if (SrcMI->isPHI()) {
  99. if (!IsSingleValuePHICycle(SrcMI, SingleValReg, PHIsInCycle))
  100. return false;
  101. } else {
  102. // Fail if there is more than one non-phi/non-move register.
  103. if (SingleValReg != 0)
  104. return false;
  105. SingleValReg = SrcReg;
  106. }
  107. }
  108. return true;
  109. }
  110. /// IsDeadPHICycle - Check if the register defined by a PHI is only used by
  111. /// other PHIs in a cycle.
  112. bool OptimizePHIs::IsDeadPHICycle(MachineInstr *MI, InstrSet &PHIsInCycle) {
  113. assert(MI->isPHI() && "IsDeadPHICycle expects a PHI instruction");
  114. unsigned DstReg = MI->getOperand(0).getReg();
  115. assert(TargetRegisterInfo::isVirtualRegister(DstReg) &&
  116. "PHI destination is not a virtual register");
  117. // See if we already saw this register.
  118. if (!PHIsInCycle.insert(MI).second)
  119. return true;
  120. // Don't scan crazily complex things.
  121. if (PHIsInCycle.size() == 16)
  122. return false;
  123. for (MachineInstr &UseMI : MRI->use_instructions(DstReg)) {
  124. if (!UseMI.isPHI() || !IsDeadPHICycle(&UseMI, PHIsInCycle))
  125. return false;
  126. }
  127. return true;
  128. }
  129. /// OptimizeBB - Remove dead PHI cycles and PHI cycles that can be replaced by
  130. /// a single value.
  131. bool OptimizePHIs::OptimizeBB(MachineBasicBlock &MBB) {
  132. bool Changed = false;
  133. for (MachineBasicBlock::iterator
  134. MII = MBB.begin(), E = MBB.end(); MII != E; ) {
  135. MachineInstr *MI = &*MII++;
  136. if (!MI->isPHI())
  137. break;
  138. // Check for single-value PHI cycles.
  139. unsigned SingleValReg = 0;
  140. InstrSet PHIsInCycle;
  141. if (IsSingleValuePHICycle(MI, SingleValReg, PHIsInCycle) &&
  142. SingleValReg != 0) {
  143. unsigned OldReg = MI->getOperand(0).getReg();
  144. if (!MRI->constrainRegClass(SingleValReg, MRI->getRegClass(OldReg)))
  145. continue;
  146. MRI->replaceRegWith(OldReg, SingleValReg);
  147. MI->eraseFromParent();
  148. ++NumPHICycles;
  149. Changed = true;
  150. continue;
  151. }
  152. // Check for dead PHI cycles.
  153. PHIsInCycle.clear();
  154. if (IsDeadPHICycle(MI, PHIsInCycle)) {
  155. for (InstrSetIterator PI = PHIsInCycle.begin(), PE = PHIsInCycle.end();
  156. PI != PE; ++PI) {
  157. MachineInstr *PhiMI = *PI;
  158. if (&*MII == PhiMI)
  159. ++MII;
  160. PhiMI->eraseFromParent();
  161. }
  162. ++NumDeadPHICycles;
  163. Changed = true;
  164. }
  165. }
  166. return Changed;
  167. }