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