|  | //===- 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 |