[A57LoadBalancing] unique_ptr-ify.

Thanks to David Blakie for the in-depth review!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@217682 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
James Molloy 2014-09-12 14:35:17 +00:00
parent 614d8681e0
commit 9204ab0456

View File

@ -141,8 +141,8 @@ private:
bool colorChain(Chain *G, Color C, MachineBasicBlock &MBB); bool colorChain(Chain *G, Color C, MachineBasicBlock &MBB);
int scavengeRegister(Chain *G, Color C, MachineBasicBlock &MBB); int scavengeRegister(Chain *G, Color C, MachineBasicBlock &MBB);
void scanInstruction(MachineInstr *MI, unsigned Idx, void scanInstruction(MachineInstr *MI, unsigned Idx,
std::map<unsigned, Chain*> &Chains, std::map<unsigned, Chain*> &Active,
std::set<Chain*> &ChainSet); std::set<std::unique_ptr<Chain>> &AllChains);
void maybeKillChain(MachineOperand &MO, unsigned Idx, void maybeKillChain(MachineOperand &MO, unsigned Idx,
std::map<unsigned, Chain*> &RegChains); std::map<unsigned, Chain*> &RegChains);
Color getColor(unsigned Register); Color getColor(unsigned Register);
@ -255,12 +255,12 @@ public:
} }
/// Return true if this chain (StartInst..KillInst) overlaps with Other. /// Return true if this chain (StartInst..KillInst) overlaps with Other.
bool rangeOverlapsWith(Chain *Other) { bool rangeOverlapsWith(const Chain &Other) const {
unsigned End = KillInst ? KillInstIdx : LastInstIdx; unsigned End = KillInst ? KillInstIdx : LastInstIdx;
unsigned OtherEnd = Other->KillInst ? unsigned OtherEnd = Other.KillInst ?
Other->KillInstIdx : Other->LastInstIdx; Other.KillInstIdx : Other.LastInstIdx;
return StartInstIdx <= OtherEnd && Other->StartInstIdx <= End; return StartInstIdx <= OtherEnd && Other.StartInstIdx <= End;
} }
/// Return true if this chain starts before Other. /// Return true if this chain starts before Other.
@ -325,7 +325,7 @@ bool AArch64A57FPLoadBalancing::runOnBasicBlock(MachineBasicBlock &MBB) {
// been killed yet. This is keyed by register - all chains can only have one // been killed yet. This is keyed by register - all chains can only have one
// "link" register between each inst in the chain. // "link" register between each inst in the chain.
std::map<unsigned, Chain*> ActiveChains; std::map<unsigned, Chain*> ActiveChains;
std::set<Chain*> AllChains; std::set<std::unique_ptr<Chain>> AllChains;
unsigned Idx = 0; unsigned Idx = 0;
for (auto &MI : MBB) for (auto &MI : MBB)
scanInstruction(&MI, Idx++, ActiveChains, AllChains); scanInstruction(&MI, Idx++, ActiveChains, AllChains);
@ -340,15 +340,13 @@ bool AArch64A57FPLoadBalancing::runOnBasicBlock(MachineBasicBlock &MBB) {
// range of chains is quite small and they are clustered between loads // range of chains is quite small and they are clustered between loads
// and stores. // and stores.
EquivalenceClasses<Chain*> EC; EquivalenceClasses<Chain*> EC;
for (auto *I : AllChains) for (auto &I : AllChains)
EC.insert(I); EC.insert(I.get());
for (auto *I : AllChains) { for (auto &I : AllChains)
for (auto *J : AllChains) { for (auto &J : AllChains)
if (I != J && I->rangeOverlapsWith(J)) if (I != J && I->rangeOverlapsWith(*J))
EC.unionSets(I, J); EC.unionSets(I.get(), J.get());
}
}
DEBUG(dbgs() << "Created " << EC.getNumClasses() << " disjoint sets.\n"); DEBUG(dbgs() << "Created " << EC.getNumClasses() << " disjoint sets.\n");
// Now we assume that every member of an equivalence class interferes // Now we assume that every member of an equivalence class interferes
@ -386,9 +384,6 @@ bool AArch64A57FPLoadBalancing::runOnBasicBlock(MachineBasicBlock &MBB) {
for (auto &I : V) for (auto &I : V)
Changed |= colorChainSet(I, MBB, Parity); Changed |= colorChainSet(I, MBB, Parity);
for (auto *C : AllChains)
delete C;
return Changed; return Changed;
} }
@ -587,7 +582,7 @@ bool AArch64A57FPLoadBalancing::colorChain(Chain *G, Color C,
void AArch64A57FPLoadBalancing:: void AArch64A57FPLoadBalancing::
scanInstruction(MachineInstr *MI, unsigned Idx, scanInstruction(MachineInstr *MI, unsigned Idx,
std::map<unsigned, Chain*> &ActiveChains, std::map<unsigned, Chain*> &ActiveChains,
std::set<Chain*> &AllChains) { std::set<std::unique_ptr<Chain>> &AllChains) {
// Inspect "MI", updating ActiveChains and AllChains. // Inspect "MI", updating ActiveChains and AllChains.
if (isMul(MI)) { if (isMul(MI)) {
@ -602,9 +597,9 @@ scanInstruction(MachineInstr *MI, unsigned Idx,
DEBUG(dbgs() << "New chain started for register " DEBUG(dbgs() << "New chain started for register "
<< TRI->getName(DestReg) << " at " << *MI); << TRI->getName(DestReg) << " at " << *MI);
Chain *G = new Chain(MI, Idx, getColor(DestReg)); auto G = llvm::make_unique<Chain>(MI, Idx, getColor(DestReg));
ActiveChains[DestReg] = G; ActiveChains[DestReg] = G.get();
AllChains.insert(G); AllChains.insert(std::move(G));
} else if (isMla(MI)) { } else if (isMla(MI)) {
@ -646,9 +641,9 @@ scanInstruction(MachineInstr *MI, unsigned Idx,
DEBUG(dbgs() << "Creating new chain for dest register " DEBUG(dbgs() << "Creating new chain for dest register "
<< TRI->getName(DestReg) << "\n"); << TRI->getName(DestReg) << "\n");
Chain *G = new Chain(MI, Idx, getColor(DestReg)); auto G = llvm::make_unique<Chain>(MI, Idx, getColor(DestReg));
ActiveChains[DestReg] = G; ActiveChains[DestReg] = G.get();
AllChains.insert(G); AllChains.insert(std::move(G));
} else { } else {