summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Analysis/LoopInfo.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2002-07-27 01:12:17 +0000
committerChris Lattner <sabre@nondot.org>2002-07-27 01:12:17 +0000
commit2675007573b820d1c084afe560105ab8a622d942 (patch)
treef1d936ba7cfe6eff56304634bbc16e760d71837c /llvm/lib/Analysis/LoopInfo.cpp
parent96a0dfa33e8469ef18866d1d89708af18929e38e (diff)
downloadbcm5719-llvm-2675007573b820d1c084afe560105ab8a622d942.tar.gz
bcm5719-llvm-2675007573b820d1c084afe560105ab8a622d942.zip
* Standardize how analysis results/passes as printed with the print() virtual
methods * Eliminate AnalysisID: Now it is just a typedef for const PassInfo* * Simplify how AnalysisID's are initialized * Eliminate Analysis/Writer.cpp/.h: incorporate printing functionality into the analyses themselves. llvm-svn: 3116
Diffstat (limited to 'llvm/lib/Analysis/LoopInfo.cpp')
-rw-r--r--llvm/lib/Analysis/LoopInfo.cpp35
1 files changed, 27 insertions, 8 deletions
diff --git a/llvm/lib/Analysis/LoopInfo.cpp b/llvm/lib/Analysis/LoopInfo.cpp
index c53cc9038c9..ff5e2fa9dc6 100644
--- a/llvm/lib/Analysis/LoopInfo.cpp
+++ b/llvm/lib/Analysis/LoopInfo.cpp
@@ -10,12 +10,13 @@
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/Analysis/Dominators.h"
#include "llvm/Support/CFG.h"
+#include "llvm/Assembly/Writer.h"
#include "Support/DepthFirstIterator.h"
#include <algorithm>
static RegisterAnalysis<LoopInfo>
X("loops", "Natural Loop Construction");
-AnalysisID LoopInfo::ID(AnalysisID::create<LoopInfo>(), true);
+AnalysisID LoopInfo::ID = X;
//===----------------------------------------------------------------------===//
// Loop implementation
@@ -24,25 +25,39 @@ bool Loop::contains(const BasicBlock *BB) const {
return find(Blocks.begin(), Blocks.end(), BB) != Blocks.end();
}
-void LoopInfo::releaseMemory() {
- for (std::vector<Loop*>::iterator I = TopLevelLoops.begin(),
- E = TopLevelLoops.end(); I != E; ++I)
- delete *I; // Delete all of the loops...
+void Loop::print(std::ostream &OS) const {
+ OS << std::string(getLoopDepth()*2, ' ') << "Loop Containing: ";
- BBMap.clear(); // Reset internal state of analysis
- TopLevelLoops.clear();
-}
+ for (unsigned i = 0; i < getBlocks().size(); ++i) {
+ if (i) OS << ",";
+ WriteAsOperand(OS, (const Value*)getBlocks()[i]);
+ }
+ OS << "\n";
+ std::copy(getSubLoops().begin(), getSubLoops().end(),
+ std::ostream_iterator<const Loop*>(OS, "\n"));
+}
//===----------------------------------------------------------------------===//
// LoopInfo implementation
//
+
bool LoopInfo::runOnFunction(Function &) {
releaseMemory();
Calculate(getAnalysis<DominatorSet>()); // Update
return false;
}
+void LoopInfo::releaseMemory() {
+ for (std::vector<Loop*>::iterator I = TopLevelLoops.begin(),
+ E = TopLevelLoops.end(); I != E; ++I)
+ delete *I; // Delete all of the loops...
+
+ BBMap.clear(); // Reset internal state of analysis
+ TopLevelLoops.clear();
+}
+
+
void LoopInfo::Calculate(const DominatorSet &DS) {
BasicBlock *RootNode = DS.getRoot();
@@ -61,6 +76,10 @@ void LoopInfo::getAnalysisUsage(AnalysisUsage &AU) const {
AU.addProvided(ID);
}
+void LoopInfo::print(std::ostream &OS) const {
+ std::copy(getTopLevelLoops().begin(), getTopLevelLoops().end(),
+ std::ostream_iterator<const Loop*>(OS, "\n"));
+}
Loop *LoopInfo::ConsiderForLoop(BasicBlock *BB, const DominatorSet &DS) {
if (BBMap.find(BB) != BBMap.end()) return 0; // Havn't processed this node?
OpenPOWER on IntegriCloud