mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-30 16:17:05 +00:00 
			
		
		
		
	The heuristics split around the largest loop where the current register may be allocated without interference. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122106 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			113 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //===- 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
 |