* 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.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3116 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/LoopInfo.cpp b/lib/Analysis/LoopInfo.cpp
index c53cc90..ff5e2fa 100644
--- a/lib/Analysis/LoopInfo.cpp
+++ b/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,6 +25,29 @@
return find(Blocks.begin(), Blocks.end(), BB) != Blocks.end();
}
+void Loop::print(std::ostream &OS) const {
+ OS << std::string(getLoopDepth()*2, ' ') << "Loop Containing: ";
+
+ 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)
@@ -34,15 +58,6 @@
}
-//===----------------------------------------------------------------------===//
-// LoopInfo implementation
-//
-bool LoopInfo::runOnFunction(Function &) {
- releaseMemory();
- Calculate(getAnalysis<DominatorSet>()); // Update
- return false;
-}
-
void LoopInfo::Calculate(const DominatorSet &DS) {
BasicBlock *RootNode = DS.getRoot();
@@ -61,6 +76,10 @@
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?