diff options
Diffstat (limited to 'llvm/lib/CodeGen/MIRCanonicalizerPass.cpp')
-rw-r--r-- | llvm/lib/CodeGen/MIRCanonicalizerPass.cpp | 63 |
1 files changed, 7 insertions, 56 deletions
diff --git a/llvm/lib/CodeGen/MIRCanonicalizerPass.cpp b/llvm/lib/CodeGen/MIRCanonicalizerPass.cpp index c9bb5461aa3c..5ef907b88315 100644 --- a/llvm/lib/CodeGen/MIRCanonicalizerPass.cpp +++ b/llvm/lib/CodeGen/MIRCanonicalizerPass.cpp @@ -30,6 +30,7 @@ #include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/CodeGen/Passes.h" +#include "llvm/InitializePasses.h" #include "llvm/Support/Debug.h" #include "llvm/Support/raw_ostream.h" @@ -48,10 +49,6 @@ static cl::opt<unsigned> cl::value_desc("N"), cl::desc("Function number to canonicalize.")); -static cl::opt<unsigned> CanonicalizeBasicBlockNumber( - "canon-nth-basicblock", cl::Hidden, cl::init(~0u), cl::value_desc("N"), - cl::desc("BasicBlock number to canonicalize.")); - namespace { class MIRCanonicalizer : public MachineFunctionPass { @@ -373,34 +370,14 @@ static bool doDefKillClear(MachineBasicBlock *MBB) { } static bool runOnBasicBlock(MachineBasicBlock *MBB, - std::vector<StringRef> &bbNames, - unsigned &basicBlockNum, NamedVRegCursor &NVC) { - - if (CanonicalizeBasicBlockNumber != ~0U) { - if (CanonicalizeBasicBlockNumber != basicBlockNum++) - return false; - LLVM_DEBUG(dbgs() << "\n Canonicalizing BasicBlock " << MBB->getName() - << "\n";); - } - - if (llvm::find(bbNames, MBB->getName()) != bbNames.end()) { - LLVM_DEBUG({ - dbgs() << "Found potentially duplicate BasicBlocks: " << MBB->getName() - << "\n"; - }); - return false; - } - + unsigned BasicBlockNum, VRegRenamer &Renamer) { LLVM_DEBUG({ dbgs() << "\n\n NEW BASIC BLOCK: " << MBB->getName() << " \n\n"; dbgs() << "\n\n================================================\n\n"; }); bool Changed = false; - MachineFunction &MF = *MBB->getParent(); - MachineRegisterInfo &MRI = MF.getRegInfo(); - bbNames.push_back(MBB->getName()); LLVM_DEBUG(dbgs() << "\n\n NEW BASIC BLOCK: " << MBB->getName() << "\n\n";); LLVM_DEBUG(dbgs() << "MBB Before Canonical Copy Propagation:\n"; @@ -413,32 +390,10 @@ static bool runOnBasicBlock(MachineBasicBlock *MBB, Changed |= rescheduleCanonically(IdempotentInstCount, MBB); LLVM_DEBUG(dbgs() << "MBB After Scheduling:\n"; MBB->dump();); - Changed |= NVC.renameVRegs(MBB); - - // Here we renumber the def vregs for the idempotent instructions from the top - // of the MachineBasicBlock so that they are named in the order that we sorted - // them alphabetically. Eventually we wont need SkipVRegs because we will use - // named vregs instead. - if (IdempotentInstCount) - NVC.skipVRegs(); - - auto MII = MBB->begin(); - for (unsigned i = 0; i < IdempotentInstCount && MII != MBB->end(); ++i) { - MachineInstr &MI = *MII++; - Changed = true; - Register vRegToRename = MI.getOperand(0).getReg(); - auto Rename = NVC.createVirtualRegister(vRegToRename); - - std::vector<MachineOperand *> RenameMOs; - for (auto &MO : MRI.reg_operands(vRegToRename)) { - RenameMOs.push_back(&MO); - } - - for (auto *MO : RenameMOs) { - MO->setReg(Rename); - } - } + Changed |= Renamer.renameVRegs(MBB, BasicBlockNum); + // TODO: Consider dropping this. Dropping kill defs is probably not + // semantically sound. Changed |= doDefKillClear(MBB); LLVM_DEBUG(dbgs() << "Updated MachineBasicBlock:\n"; MBB->dump(); @@ -470,16 +425,12 @@ bool MIRCanonicalizer::runOnMachineFunction(MachineFunction &MF) { : RPOList) { dbgs() << MBB->getName() << "\n"; } dbgs() << "\n\n================================================\n\n";); - std::vector<StringRef> BBNames; - unsigned BBNum = 0; - bool Changed = false; - MachineRegisterInfo &MRI = MF.getRegInfo(); - NamedVRegCursor NVC(MRI); + VRegRenamer Renamer(MRI); for (auto MBB : RPOList) - Changed |= runOnBasicBlock(MBB, BBNames, BBNum, NVC); + Changed |= runOnBasicBlock(MBB, BBNum++, Renamer); return Changed; } |