15 #define DEBUG_TYPE "phi-opt"
26 STATISTIC(NumPHICycles,
"Number of PHI cycles replaced");
27 STATISTIC(NumDeadPHICycles,
"Number of dead PHI cycles");
51 bool IsSingleValuePHICycle(
MachineInstr *
MI,
unsigned &SingleValReg,
52 InstrSet &PHIsInCycle);
61 "Optimize machine instruction PHIs",
false,
false)
64 MRI = &Fn.getRegInfo();
65 TII = Fn.getTarget().getInstrInfo();
73 Changed |= OptimizeBB(*
I);
84 unsigned &SingleValReg,
85 InstrSet &PHIsInCycle) {
86 assert(MI->
isPHI() &&
"IsSingleValuePHICycle expects a PHI instruction");
90 if (!PHIsInCycle.insert(MI))
94 if (PHIsInCycle.size() == 16)
100 if (SrcReg == DstReg)
105 if (SrcMI && SrcMI->
isCopy() &&
113 if (SrcMI->
isPHI()) {
114 if (!IsSingleValuePHICycle(SrcMI, SingleValReg, PHIsInCycle))
118 if (SingleValReg != 0)
120 SingleValReg = SrcReg;
128 bool OptimizePHIs::IsDeadPHICycle(
MachineInstr *MI, InstrSet &PHIsInCycle) {
129 assert(MI->
isPHI() &&
"IsDeadPHICycle expects a PHI instruction");
132 "PHI destination is not a virtual register");
135 if (!PHIsInCycle.insert(MI))
139 if (PHIsInCycle.size() == 16)
143 E =
MRI->use_end();
I != E; ++
I) {
145 if (!UseMI->
isPHI() || !IsDeadPHICycle(UseMI, PHIsInCycle))
155 bool Changed =
false;
163 unsigned SingleValReg = 0;
164 InstrSet PHIsInCycle;
165 if (IsSingleValuePHICycle(MI, SingleValReg, PHIsInCycle) &&
171 MRI->replaceRegWith(OldReg, SingleValReg);
180 if (IsDeadPHICycle(MI, PHIsInCycle)) {
181 for (InstrSetIterator PI = PHIsInCycle.begin(), PE = PHIsInCycle.end();
static PassRegistry * getPassRegistry()
static bool isVirtualRegister(unsigned Reg)
void initializeOptimizePHIsPass(PassRegistry &)
STATISTIC(NumPHICycles,"Number of PHI cycles replaced")
const HexagonInstrInfo * TII
ID
LLVM Calling Convention Representation.
unsigned getNumOperands() const
bundle_iterator< MachineInstr, instr_iterator > iterator
const MCRegisterClass & getRegClass(unsigned i) const
Returns the register class associated with the enumeration value. See class MCOperandInfo.
const MachineOperand & getOperand(unsigned i) const
unsigned getSubReg() const
SmallPtrSetIterator - This implements a const_iterator for SmallPtrSet.
virtual void getAnalysisUsage(AnalysisUsage &AU) const
INITIALIZE_PASS(OptimizePHIs,"opt-phis","Optimize machine instruction PHIs", false, false) bool OptimizePHIs
unsigned getReg() const
getReg - Returns the register number.
BasicBlockListType::iterator iterator
const MCRegisterInfo & MRI