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