mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +00:00 
			
		
		
		
	New file: Interval analysis support
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		
							
								
								
									
										112
									
								
								include/llvm/Analysis/Interval.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								include/llvm/Analysis/Interval.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,112 @@ | |||||||
|  | //===- llvm/Analysis/Intervals.h - Interval partition Calculation-*- C++ -*--=// | ||||||
|  | // | ||||||
|  | // This file contains the declaration of the cfg::IntervalPartition class, which | ||||||
|  | // calculates and represent the interval partition of a method. | ||||||
|  | // | ||||||
|  | //===----------------------------------------------------------------------===// | ||||||
|  |  | ||||||
|  | #ifndef LLVM_INTERVALS_H | ||||||
|  | #define LLVM_INTERVALS_H | ||||||
|  |  | ||||||
|  | #include <vector> | ||||||
|  | #include <map> | ||||||
|  | #include <algorithm> | ||||||
|  |  | ||||||
|  | class Method; | ||||||
|  | class BasicBlock; | ||||||
|  |  | ||||||
|  | namespace cfg { | ||||||
|  |  | ||||||
|  | class IntervalPartition; | ||||||
|  |  | ||||||
|  | // Interval Class - An Interval is a set of nodes defined such that every node | ||||||
|  | // in the interval has all of its predecessors in the interval (except for the | ||||||
|  | // header) | ||||||
|  | class Interval { | ||||||
|  |   friend class IntervalPartition; | ||||||
|  | public: | ||||||
|  |   typedef vector<BasicBlock*>::iterator succ_iterator; | ||||||
|  |   typedef vector<BasicBlock*>::iterator pred_iterator; | ||||||
|  |   typedef vector<BasicBlock*>::iterator node_iterator; | ||||||
|  |  | ||||||
|  |   // HeaderNode - The header BasicBlock, which dominates all BasicBlocks in this | ||||||
|  |   // interval.  Also, any loops in this interval must go through the HeaderNode. | ||||||
|  |   // | ||||||
|  |   BasicBlock *HeaderNode; | ||||||
|  |  | ||||||
|  |   // Nodes - The basic blocks in this interval. | ||||||
|  |   // | ||||||
|  |   vector<BasicBlock*> Nodes; | ||||||
|  |  | ||||||
|  |   // Successors - List of BasicBlocks that are reachable directly from nodes in | ||||||
|  |   // this interval, but are not in the interval themselves. | ||||||
|  |   // These nodes neccesarily must be header nodes for other intervals. | ||||||
|  |   // | ||||||
|  |   vector<BasicBlock*> Successors; | ||||||
|  |  | ||||||
|  |   // Predecessors - List of BasicBlocks that have this Interval's header block | ||||||
|  |   // as one of their successors. | ||||||
|  |   // | ||||||
|  |   vector<BasicBlock*> Predecessors; | ||||||
|  |  | ||||||
|  |   inline bool contains(BasicBlock *BB) { | ||||||
|  |     return find(Nodes.begin(), Nodes.end(), BB) != Nodes.end(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   inline bool isSuccessor(BasicBlock *BB) { | ||||||
|  |     return find(Successors.begin(), Successors.end(), BB) != Successors.end(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | private:           // Only accessable by IntervalPartition class | ||||||
|  |   inline Interval(BasicBlock *Header) : HeaderNode(Header) { | ||||||
|  |     Nodes.push_back(Header); | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // IntervalPartition - This class builds and holds an "interval partition" for | ||||||
|  | // a method.  This partition divides the control flow graph into a set of | ||||||
|  | // maximal intervals, as defined with the properties above.  Intuitively, a | ||||||
|  | // BasicBlock is a (possibly nonexistent) loop with a "tail" of non looping | ||||||
|  | // nodes following it. | ||||||
|  | // | ||||||
|  | class IntervalPartition { | ||||||
|  |   typedef map<BasicBlock*, Interval*> IntervalMapTy; | ||||||
|  |   IntervalMapTy IntervalMap; | ||||||
|  |  | ||||||
|  |   typedef vector<Interval*> IntervalListTy; | ||||||
|  |   IntervalListTy IntervalList; | ||||||
|  |   Interval *RootInterval; | ||||||
|  |  | ||||||
|  | public: | ||||||
|  |   typedef IntervalListTy::iterator iterator; | ||||||
|  |  | ||||||
|  | public: | ||||||
|  |   // IntervalPartition ctor - Build the partition for the specified method | ||||||
|  |   IntervalPartition(Method *M); | ||||||
|  |  | ||||||
|  |   // getRootInterval() - Return the root interval that contains the starting | ||||||
|  |   // block of the method | ||||||
|  |   inline Interval *getRootInterval() { return RootInterval; } | ||||||
|  |  | ||||||
|  |   inline Interval *getBlockInterval(BasicBlock *BB) { | ||||||
|  |     IntervalMapTy::iterator I = IntervalMap.find(BB); | ||||||
|  |     if (I != IntervalMap.end())  | ||||||
|  |       return I->second; | ||||||
|  |     else | ||||||
|  |       return 0; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // Iterators to iterate over all of the intervals in the method | ||||||
|  |   inline iterator begin() { return IntervalList.begin(); } | ||||||
|  |   inline iterator end()   { return IntervalList.end(); } | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |   void ProcessInterval(BasicBlock *Header); | ||||||
|  |   void ProcessBasicBlock(Interval *I, BasicBlock *BB); | ||||||
|  |   void UpdateSuccessors(Interval *Int); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | }    // End namespace cfg | ||||||
|  |  | ||||||
|  | #endif | ||||||
		Reference in New Issue
	
	Block a user