| //===- MachineLoopRanges.h - Ranges of machine loops -----------*- c++ -*--===// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // This file provides the interface to the MachineLoopRanges analysis. | |
| // | |
| // Provide on-demand information about the ranges of machine instructions | |
| // covered by a loop. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_CODEGEN_MACHINELOOPRANGES_H | |
| #define LLVM_CODEGEN_MACHINELOOPRANGES_H | |
| #include "llvm/ADT/IntervalMap.h" | |
| #include "llvm/CodeGen/SlotIndexes.h" | |
| namespace llvm { | |
| class MachineLoop; | |
| class MachineLoopInfo; | |
| class raw_ostream; | |
| /// MachineLoopRange - Range information for a single loop. | |
| class MachineLoopRange { | |
| friend class MachineLoopRanges; | |
| public: | |
| typedef IntervalMap<SlotIndex, unsigned, 4> Map; | |
| typedef Map::Allocator Allocator; | |
| private: | |
| /// The mapped loop. | |
| const MachineLoop *const Loop; | |
| /// Map intervals to a bit mask. | |
| /// Bit 0 = inside loop block. | |
| Map Intervals; | |
| /// Loop area as measured by SlotIndex::distance. | |
| unsigned Area; | |
| /// Create a MachineLoopRange, only accessible to MachineLoopRanges. | |
| MachineLoopRange(const MachineLoop*, Allocator&, SlotIndexes&); | |
| public: | |
| /// getLoop - Return the mapped machine loop. | |
| const MachineLoop *getLoop() const { return Loop; } | |
| /// overlaps - Return true if this loop overlaps the given range of machine | |
| /// inteructions. | |
| bool overlaps(SlotIndex Start, SlotIndex Stop); | |
| /// getNumber - Return the loop number. This is the same as the number of the | |
| /// header block. | |
| unsigned getNumber() const; | |
| /// getArea - Return the loop area. This number is approximately proportional | |
| /// to the number of instructions in the loop. | |
| unsigned getArea() const { return Area; } | |
| /// getMap - Allow public read-only access for IntervalMapOverlaps. | |
| const Map &getMap() { return Intervals; } | |
| /// print - Print loop ranges on OS. | |
| void print(raw_ostream&) const; | |
| /// byNumber - Comparator for array_pod_sort that sorts a list of | |
| /// MachineLoopRange pointers by number. | |
| static int byNumber(const void*, const void*); | |
| /// byAreaDesc - Comparator for array_pod_sort that sorts a list of | |
| /// MachineLoopRange pointers by descending area, then by number. | |
| static int byAreaDesc(const void*, const void*); | |
| }; | |
| raw_ostream &operator<<(raw_ostream&, const MachineLoopRange&); | |
| /// MachineLoopRanges - Analysis pass that provides on-demand per-loop range | |
| /// information. | |
| class MachineLoopRanges : public MachineFunctionPass { | |
| typedef DenseMap<const MachineLoop*, MachineLoopRange*> CacheMap; | |
| typedef MachineLoopRange::Allocator MapAllocator; | |
| MapAllocator Allocator; | |
| SlotIndexes *Indexes; | |
| CacheMap Cache; | |
| public: | |
| static char ID; // Pass identification, replacement for typeid | |
| MachineLoopRanges() : MachineFunctionPass(ID), Indexes(0) {} | |
| ~MachineLoopRanges() { releaseMemory(); } | |
| /// getLoopRange - Return the range of loop. | |
| MachineLoopRange *getLoopRange(const MachineLoop *Loop); | |
| private: | |
| virtual bool runOnMachineFunction(MachineFunction&); | |
| virtual void releaseMemory(); | |
| virtual void getAnalysisUsage(AnalysisUsage&) const; | |
| }; | |
| } // end namespace llvm | |
| #endif // LLVM_CODEGEN_MACHINELOOPRANGES_H |