}
void BlockFrequencyInfoImplBase::clear() {
- *this = BlockFrequencyInfoImplBase();
+ // Swap with a default-constructed std::vector, since std::vector<>::clear()
+ // does not actually clear heap storage.
+ std::vector<FrequencyData>().swap(Freqs);
+ std::vector<WorkingData>().swap(Working);
+ std::vector<std::unique_ptr<LoopData>>().swap(Loops);
}
/// \brief Clear all memory not needed downstream.
static BlockNode getPackagedNode(const BlockFrequencyInfoImplBase &BFI,
const BlockNode &Node) {
assert(Node.isValid());
- if (!BFI.Working[Node.Index].IsPackaged)
+ if (!BFI.Working[Node.Index].isPackaged())
return Node;
- if (!BFI.Working[Node.Index].ContainingLoop.isValid())
+ if (!BFI.Working[Node.Index].isAPackage())
return Node;
- return getPackagedNode(BFI, BFI.Working[Node.Index].ContainingLoop);
+ return getPackagedNode(BFI, BFI.Working[Node.Index].getContainingHeader());
}
/// \brief Get the appropriate mass for a possible pseudo-node loop package.
static BlockMass &getPackageMass(BlockFrequencyInfoImplBase &BFI,
const BlockNode &Node) {
assert(Node.isValid());
- assert(!BFI.Working[Node.Index].IsPackaged);
- if (!BFI.Working[Node.Index].IsAPackage)
+ assert(!BFI.Working[Node.Index].isPackaged());
+ if (!BFI.Working[Node.Index].isAPackage())
return BFI.Working[Node.Index].Mass;
return BFI.getLoopPackage(Node).Mass;
BlockNode Resolved = getPackagedNode(*this, Succ);
assert(Resolved != LoopHead);
- if (Working[Resolved.Index].ContainingLoop != LoopHead) {
+ if (Working[Resolved.Index].getContainingHeader() != LoopHead) {
DEBUG(debugSuccessor(" exit ", Resolved));
Dist.addExit(Resolved, Weight);
return;
}
- if (!LoopHead.isValid() && Resolved < Pred) {
+ if (Resolved < Pred) {
// Irreducible backedge. Skip this edge in the distribution.
DEBUG(debugSuccessor("skipped ", Resolved));
return;
/// \brief Package up a loop.
void BlockFrequencyInfoImplBase::packageLoop(const BlockNode &LoopHead) {
DEBUG(dbgs() << "packaging-loop: " << getBlockName(LoopHead) << "\n");
- Working[LoopHead.Index].IsAPackage = true;
- for (const BlockNode &M : getLoopPackage(LoopHead).Members) {
- DEBUG(dbgs() << " - node: " << getBlockName(M.Index) << "\n");
- Working[M.Index].IsPackaged = true;
- }
+ auto &PackagedLoop = getLoopPackage(LoopHead);
+ PackagedLoop.IsPackaged = true;
+ DEBUG(for (const BlockNode &M
+ : PackagedLoop.Members) {
+ dbgs() << " - node: " << getBlockName(M.Index) << "\n";
+ });
}
void BlockFrequencyInfoImplBase::distributeMass(const BlockNode &Source,