diff --git a/llvm/lib/CodeGen/MIRVRegNamerUtils.cpp b/llvm/lib/CodeGen/MIRVRegNamerUtils.cpp --- a/llvm/lib/CodeGen/MIRVRegNamerUtils.cpp +++ b/llvm/lib/CodeGen/MIRVRegNamerUtils.cpp @@ -13,23 +13,25 @@ #define DEBUG_TYPE "mir-vregnamer-utils" -bool VRegRenamer::doVRegRenaming( - const std::map &VRegRenameMap) { +using VRegRenameMap = std::map; + +bool VRegRenamer::doVRegRenaming(const VRegRenameMap &VRM) { bool Changed = false; - for (auto I = VRegRenameMap.begin(), E = VRegRenameMap.end(); I != E; ++I) { - auto VReg = I->first; - auto Rename = I->second; + for (auto &E : VRM) { + unsigned VReg = E.first; + unsigned Rename = E.second; std::vector RenameMOs; - for (auto &MO : MRI.reg_operands(VReg)) { - RenameMOs.push_back(&MO); - } + llvm::transform(MRI.reg_operands(VReg), std::back_inserter(RenameMOs), + [](MachineOperand &MO) { return &MO; }); + Changed = Changed || RenameMOs.size(); for (auto *MO : RenameMOs) { - Changed = true; MO->setReg(Rename); + // TODO: Not sure if this makes sense anymore. Do we really want to drop + // semantic information like def/kill? if (!MO->isDef()) MO->setIsKill(false); } @@ -40,32 +42,25 @@ std::map VRegRenamer::getVRegRenameMap(const std::vector &VRegs) { - std::map VRegRenameMap; std::map VRegNameCollisionMap; auto GetUniqueVRegName = [&VRegNameCollisionMap](const NamedVReg &Reg) -> std::string { auto It = VRegNameCollisionMap.find(Reg.getName()); - unsigned Counter = 0; - if (It != VRegNameCollisionMap.end()) { - Counter = It->second; - } + unsigned Counter = (It != VRegNameCollisionMap.end()) ? It->second : 0; ++Counter; VRegNameCollisionMap[Reg.getName()] = Counter; return Reg.getName() + "__" + std::to_string(Counter); }; + VRegRenameMap VRM; for (auto &Vreg : VRegs) { - auto Reg = Vreg.getReg(); - assert(Register::isVirtualRegister(Reg) && - "Expecting Virtual Registers Only"); - auto NewNameForReg = GetUniqueVRegName(Vreg); - auto Rename = createVirtualRegisterWithName(Reg, NewNameForReg); - - VRegRenameMap.insert(std::pair(Reg, Rename)); + unsigned Reg = Vreg.getReg(); + assert(Register::isVirtualRegister(Reg) && "Expected Virtual Registers"); + VRM[Reg] = createVirtualRegisterWithName(Reg, GetUniqueVRegName(Vreg)); } - return VRegRenameMap; + return VRM; } std::string VRegRenamer::getInstructionOpcodeHash(MachineInstr &MI) { @@ -90,9 +85,9 @@ }; SmallVector MIOperands; MIOperands.push_back(MI.getOpcode()); - for (auto &Op : MI.uses()) { - MIOperands.push_back(HashOperand(Op)); - } + llvm::transform( + MI.uses(), std::back_inserter(MIOperands), + [&HashOperand](const MachineOperand &MO) { return HashOperand(MO); }); auto HashMI = hash_combine_range(MIOperands.begin(), MIOperands.end()); return std::to_string(HashMI).substr(0, 5); } @@ -126,8 +121,8 @@ if (VRegs.size() == 0) return false; - auto VRegRenameMap = getVRegRenameMap(VRegs); - return doVRegRenaming(VRegRenameMap); + auto VRM = getVRegRenameMap(VRegs); + return doVRegRenaming(VRM); } bool VRegRenamer::renameVRegs(MachineBasicBlock *MBB, unsigned BBNum) {