Index: lib/Analysis/PostOrderCFGView.cpp
===================================================================
--- lib/Analysis/PostOrderCFGView.cpp	(revision 218294)
+++ lib/Analysis/PostOrderCFGView.cpp	(working copy)
@@ -17,17 +17,15 @@
 
 void PostOrderCFGView::anchor() { }
 
-ReversePostOrderCFGView::ReversePostOrderCFGView(const CFG *cfg) {
+PostOrderCFGView::PostOrderCFGView(const CFG *cfg) {
   Blocks.reserve(cfg->getNumBlockIDs());
   CFGBlockSet BSet(cfg);
 
   typedef llvm::po_iterator<const CFG*, CFGBlockSet, true> po_iterator;
 
   for (po_iterator I = po_iterator::begin(cfg, BSet),
-                   E = po_iterator::end(cfg, BSet); I != E; ++I) {
+                   E = po_iterator::end(cfg, BSet); I != E; ++I)
     Blocks.push_back(*I);      
-    BlockOrder[*I] = Blocks.size();
-  }
 }
 
 PostOrderCFGView *PostOrderCFGView::create(AnalysisDeclContext &ctx) {
@@ -39,55 +37,6 @@
 
 const void *PostOrderCFGView::getTag() { static int x; return &x; }
 
-bool PostOrderCFGView::BlockOrderCompare::operator()(const CFGBlock *b1,
-                                                     const CFGBlock *b2) const {
-  PostOrderCFGView::BlockOrderTy::const_iterator b1It = POV.BlockOrder.find(b1);
-  PostOrderCFGView::BlockOrderTy::const_iterator b2It = POV.BlockOrder.find(b2);
-    
-  unsigned b1V = (b1It == POV.BlockOrder.end()) ? 0 : b1It->second;
-  unsigned b2V = (b2It == POV.BlockOrder.end()) ? 0 : b2It->second;
-  return b1V > b2V;
-}
-
-PostOrderCFGView::PostOrderCFGView(const CFG *cfg) {
-  unsigned size = cfg->getNumBlockIDs();
-  Blocks.reserve(size);
-  CFGBlockSet BSet(cfg);
-
-  typedef llvm::po_iterator<const CFG*, CFGBlockSet, true,
-                            llvm::GraphTraits<llvm::Inverse<const CFG*> >
-                           > po_iterator;
-
-  for (po_iterator I = po_iterator::begin(cfg, BSet),
-                   E = po_iterator::end(cfg, BSet); I != E; ++I) {
-    Blocks.push_back(*I);      
-    BlockOrder[*I] = Blocks.size();
-  }
-
-  // It may be that some blocks are inaccessible going from the CFG exit upwards
-  // (e.g. infinite loops); we still need to add them.
-  for (CFG::const_iterator I = cfg->begin(), E = cfg->end();
-       (Blocks.size() < size) && (I != E); ++I) {
-    const CFGBlock* block = *I;
-    // Add a chain going upwards.
-    while (!BlockOrder.count(block)) {
-      Blocks.push_back(block);
-      BlockOrder[block] = Blocks.size();
-      CFGBlock::const_pred_iterator PI = block->pred_begin(),
-                                    PE = block->pred_end();
-      for (; PI != PE; ++PI) {
-        const CFGBlock* pred = *PI;
-        if (pred && !BlockOrder.count(pred)) {
-          block = pred;
-          break;
-        }
-      }
-      // Chain ends when we couldn't find an unmapped pred.
-      if (PI == PE) break;
-    }
-  }
-}
-
 ReversePostOrderCFGView *
 ReversePostOrderCFGView::create(AnalysisDeclContext &ctx) {
   const CFG *cfg = ctx.getCFG();
Index: include/clang/Analysis/Analyses/PostOrderCFGView.h
===================================================================
--- include/clang/Analysis/Analyses/PostOrderCFGView.h	(revision 218294)
+++ include/clang/Analysis/Analyses/PostOrderCFGView.h	(working copy)
@@ -15,7 +15,7 @@
 #define LLVM_CLANG_ANALYSIS_ANALYSES_POSTORDERCFGVIEW_H
 
 #include <vector>
-//#include <algorithm>
+#include <algorithm>
 
 #include "llvm/ADT/PostOrderIterator.h"
 #include "llvm/ADT/DenseMap.h"
@@ -71,37 +71,20 @@
 protected:
   std::vector<const CFGBlock*> Blocks;
 
-  typedef llvm::DenseMap<const CFGBlock *, unsigned> BlockOrderTy;
-  BlockOrderTy BlockOrder;
-
 public:
-  typedef std::vector<const CFGBlock *>::reverse_iterator iterator;
-  typedef std::vector<const CFGBlock *>::const_reverse_iterator const_iterator;
+  typedef std::vector<const CFGBlock *>::iterator iterator;
+  typedef std::vector<const CFGBlock *>::const_iterator const_iterator;
 
   PostOrderCFGView(const CFG *cfg);
 
-  iterator begin() { return Blocks.rbegin(); }
-  iterator end()   { return Blocks.rend(); }
+  iterator begin() { return Blocks.begin(); }
+  iterator end()   { return Blocks.end(); }
 
-  const_iterator begin() const { return Blocks.rbegin(); }
-  const_iterator end() const { return Blocks.rend(); }
+  const_iterator begin() const { return Blocks.begin(); }
+  const_iterator end() const { return Blocks.end(); }
 
   bool empty() const { return begin() == end(); }
 
-  struct BlockOrderCompare;
-  friend struct BlockOrderCompare;
-
-  struct BlockOrderCompare {
-    const PostOrderCFGView &POV;
-  public:
-    BlockOrderCompare(const PostOrderCFGView &pov) : POV(pov) {}
-    bool operator()(const CFGBlock *b1, const CFGBlock *b2) const;
-  };
-
-  BlockOrderCompare getComparator() const {
-    return BlockOrderCompare(*this);
-  }
-
   // Used by AnalyisContext to construct this object.
   static const void *getTag();
 
@@ -113,7 +96,10 @@
 
 class ReversePostOrderCFGView : public PostOrderCFGView {
 public:
-  ReversePostOrderCFGView(const CFG *cfg);
+  ReversePostOrderCFGView(const CFG *cfg) : PostOrderCFGView(cfg) {
+    std::reverse(Blocks.begin(), Blocks.end());
+  }
+
   static ReversePostOrderCFGView *create(AnalysisDeclContext &analysisContext);
 };
 
