X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FAnalysis%2FIntervalPartition.h;h=274be2bdcfa9c20815066e7124d50720d736c995;hb=ada56848f5ff516cb5754215b265cd0ef78092b7;hp=281b32ed0e85c753140cafcbb82764755b1eed73;hpb=8fc2f2072de83665ae20e06929e28317f449bcdf;p=oota-llvm.git diff --git a/include/llvm/Analysis/IntervalPartition.h b/include/llvm/Analysis/IntervalPartition.h index 281b32ed0e8..274be2bdcfa 100644 --- a/include/llvm/Analysis/IntervalPartition.h +++ b/include/llvm/Analysis/IntervalPartition.h @@ -1,4 +1,11 @@ -//===- IntervalPartition.h - Interval partition Calculation ------*- C++ -*--=// +//===- IntervalPartition.h - Interval partition Calculation -----*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// // // This file contains the declaration of the IntervalPartition class, which // calculates and represents the interval partition of a function, or a @@ -13,34 +20,40 @@ // //===----------------------------------------------------------------------===// -#ifndef LLVM_INTERVAL_PARTITION_H -#define LLVM_INTERVAL_PARTITION_H +#ifndef LLVM_ANALYSIS_INTERVALPARTITION_H +#define LLVM_ANALYSIS_INTERVALPARTITION_H #include "llvm/Analysis/Interval.h" #include "llvm/Pass.h" +#include + +namespace llvm { //===----------------------------------------------------------------------===// // // IntervalPartition - This class builds and holds an "interval partition" for // a function. 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 +// maximal intervals, as defined with the properties above. Intuitively, an +// interval is a (possibly nonexistent) loop with a "tail" of non-looping // nodes following it. // -class IntervalPartition : public FunctionPass, public std::vector { +class IntervalPartition : public FunctionPass { typedef std::map IntervalMapTy; IntervalMapTy IntervalMap; typedef std::vector IntervalListTy; Interval *RootInterval; + std::vector Intervals; public: - static AnalysisID ID; // We are an analysis, we must have an ID + static char ID; // Pass identification, replacement for typeid - IntervalPartition(AnalysisID AID) : RootInterval(0) { assert(AID == ID); } + IntervalPartition() : FunctionPass(ID), RootInterval(nullptr) { + initializeIntervalPartitionPass(*PassRegistry::getPassRegistry()); + } // run - Calculate the interval partition for this function - virtual bool runOnFunction(Function *F); + bool runOnFunction(Function &F) override; // IntervalPartition ctor - Build a reduced interval partition from an // existing interval graph. This takes an additional boolean parameter to @@ -48,8 +61,8 @@ public: // IntervalPartition(IntervalPartition &I, bool); - // Destructor - Free memory - ~IntervalPartition() { destroy(); } + // print - Show contents in human readable format... + void print(raw_ostream &O, const Module* = nullptr) const override; // getRootInterval() - Return the root interval that contains the starting // block of the function. @@ -57,26 +70,28 @@ public: // isDegeneratePartition() - Returns true if the interval partition contains // a single interval, and thus cannot be simplified anymore. - bool isDegeneratePartition() { return size() == 1; } + bool isDegeneratePartition() { return Intervals.size() == 1; } // TODO: isIrreducible - look for triangle graph. // getBlockInterval - Return the interval that a basic block exists in. inline Interval *getBlockInterval(BasicBlock *BB) { IntervalMapTy::iterator I = IntervalMap.find(BB); - return I != IntervalMap.end() ? I->second : 0; + return I != IntervalMap.end() ? I->second : nullptr; } // getAnalysisUsage - Implement the Pass API - virtual void getAnalysisUsage(AnalysisUsage &AU) const { + void getAnalysisUsage(AnalysisUsage &AU) const override { AU.setPreservesAll(); - AU.addProvided(ID); } -private: - // destroy - Reset state back to before function was analyzed - void destroy(); + // Interface to Intervals vector... + const std::vector &getIntervals() const { return Intervals; } + + // releaseMemory - Reset state back to before function was analyzed + void releaseMemory() override; +private: // addIntervalToPartition - Add an interval to the internal list of intervals, // and then add mappings from all of the basic blocks in the interval to the // interval itself (in the IntervalMap). @@ -85,10 +100,12 @@ private: // updatePredecessors - Interval generation only sets the successor fields of // the interval data structures. After interval generation is complete, - // run through all of the intervals and propogate successor info as + // run through all of the intervals and propagate successor info as // predecessor info. // void updatePredecessors(Interval *Int); }; +} // End llvm namespace + #endif