diff --git a/lib/CodeGen/StrongPHIElimination.cpp b/lib/CodeGen/StrongPHIElimination.cpp index 3a7e1082925..dbf3d5c2706 100644 --- a/lib/CodeGen/StrongPHIElimination.cpp +++ b/lib/CodeGen/StrongPHIElimination.cpp @@ -25,6 +25,7 @@ #include "llvm/CodeGen/MachineDominators.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineInstr.h" +#include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/Target/TargetInstrInfo.h" #include "llvm/Target/TargetMachine.h" #include "llvm/ADT/DepthFirstIterator.h" @@ -47,11 +48,8 @@ namespace { bool runOnMachineFunction(MachineFunction &Fn); virtual void getAnalysisUsage(AnalysisUsage &AU) const { - AU.addPreserved(); - AU.addPreservedID(PHIEliminationID); AU.addRequired(); AU.addRequired(); - AU.setPreservesAll(); MachineFunctionPass::getAnalysisUsage(AU); } @@ -516,6 +514,7 @@ void StrongPHIElimination::processPHIUnion(MachineInstr* Inst, /// of Static Single Assignment Form" by Briggs, et al. void StrongPHIElimination::ScheduleCopies(MachineBasicBlock* MBB, std::set& pushed) { + // FIXME: This function needs to update LiveVariables std::map& copy_set= Waiting[MBB]; std::map worklist; @@ -540,6 +539,8 @@ void StrongPHIElimination::ScheduleCopies(MachineBasicBlock* MBB, } LiveVariables& LV = getAnalysis(); + MachineFunction* MF = MBB->getParent(); + const TargetInstrInfo *TII = MF->getTarget().getInstrInfo(); // Iterate over the worklist, inserting copies while (!worklist.empty() || !copy_set.empty()) { @@ -547,13 +548,29 @@ void StrongPHIElimination::ScheduleCopies(MachineBasicBlock* MBB, std::pair curr = *worklist.begin(); worklist.erase(curr.first); + const TargetRegisterClass *RC = MF->getRegInfo().getRegClass(curr.first); + if (isLiveOut(LV.getVarInfo(curr.second), MBB)) { - // Insert copy from curr.second to a temporary + // Create a temporary + unsigned t = MF->getRegInfo().createVirtualRegister(RC); + + // Insert copy from curr.second to a temporary at + // the Phi defining curr.second + LiveVariables::VarInfo VI = LV.getVarInfo(curr.second); + MachineBasicBlock::iterator PI = VI.DefInst; + TII->copyRegToReg(*VI.DefInst->getParent(), PI, t, + curr.second, RC, RC); + // Push temporary on Stacks - // Insert temporary in pushed + Stacks[curr.second].push_back(t); + + // Insert curr.second in pushed + pushed.insert(curr.second); } // Insert copy from map[curr.first] to curr.second + TII->copyRegToReg(*MBB, MBB->end(), curr.second, + map[curr.first], RC, RC); map[curr.first] = curr.second; // If curr.first is a destination in copy_set... @@ -577,8 +594,13 @@ void StrongPHIElimination::ScheduleCopies(MachineBasicBlock* MBB, std::pair curr = *copy_set.begin(); copy_set.erase(curr.first); + const TargetRegisterClass *RC = MF->getRegInfo().getRegClass(curr.first); + // Insert a copy from dest to a new temporary t at the end of b - // map[curr.second] = t; + unsigned t = MF->getRegInfo().createVirtualRegister(RC); + TII->copyRegToReg(*MBB, MBB->end(), t, + curr.second, RC, RC); + map[curr.second] = t; worklist.insert(curr); } @@ -628,6 +650,7 @@ bool StrongPHIElimination::runOnMachineFunction(MachineFunction &Fn) { InsertCopies(Fn.begin()); // FIXME: Perform renaming + // FIXME: Remove Phi instrs return false; }