X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FCodeGen%2FMachineLoopRanges.cpp;h=17fe67f65045d0aea226ec6344ae9e5975112ae4;hb=fb9ebbf236974beac31705eaeb9f50ab585af6ab;hp=9ee6c5bd125889822d3c53ad40f864ff987e3f75;hpb=ff2e9b4225ab55ee049b33158a9cce1ef138c2f7;p=oota-llvm.git diff --git a/lib/CodeGen/MachineLoopRanges.cpp b/lib/CodeGen/MachineLoopRanges.cpp index 9ee6c5bd125..17fe67f6504 100644 --- a/lib/CodeGen/MachineLoopRanges.cpp +++ b/lib/CodeGen/MachineLoopRanges.cpp @@ -57,12 +57,13 @@ MachineLoopRange *MachineLoopRanges::getLoopRange(const MachineLoop *Loop) { MachineLoopRange::MachineLoopRange(const MachineLoop *loop, MachineLoopRange::Allocator &alloc, SlotIndexes &Indexes) - : Loop(loop), Intervals(alloc) { + : Loop(loop), Intervals(alloc), Area(0) { // Compute loop coverage. for (MachineLoop::block_iterator I = Loop->block_begin(), E = Loop->block_end(); I != E; ++I) { const std::pair &Range = Indexes.getMBBRange(*I); Intervals.insert(Range.first, Range.second, 1u); + Area += Range.first.distance(Range.second); } } @@ -73,8 +74,38 @@ bool MachineLoopRange::overlaps(SlotIndex Start, SlotIndex Stop) { return I.valid() && Stop > I.start(); } +unsigned MachineLoopRange::getNumber() const { + return Loop->getHeader()->getNumber(); +} + +/// byNumber - Comparator for array_pod_sort that sorts a list of +/// MachineLoopRange pointers by number. +int MachineLoopRange::byNumber(const void *pa, const void *pb) { + const MachineLoopRange *a = *static_cast(pa); + const MachineLoopRange *b = *static_cast(pb); + unsigned na = a->getNumber(); + unsigned nb = b->getNumber(); + if (na < nb) + return -1; + if (na > nb) + return 1; + return 0; +} + +/// byAreaDesc - Comparator for array_pod_sort that sorts a list of +/// MachineLoopRange pointers by: +/// 1. Descending area. +/// 2. Ascending number. +int MachineLoopRange::byAreaDesc(const void *pa, const void *pb) { + const MachineLoopRange *a = *static_cast(pa); + const MachineLoopRange *b = *static_cast(pb); + if (a->getArea() != b->getArea()) + return a->getArea() > b->getArea() ? -1 : 1; + return byNumber(pa, pb); +} + void MachineLoopRange::print(raw_ostream &OS) const { - OS << "Loop#" << Loop->getHeader()->getNumber() << " ="; + OS << "Loop#" << getNumber() << " ="; for (Map::const_iterator I = Intervals.begin(); I.valid(); ++I) OS << " [" << I.start() << ';' << I.stop() << ')'; }