[C++11] Add a basic block range view for RegionInfo
authorTobias Grosser <tobias@grosser.es>
Mon, 3 Mar 2014 13:00:39 +0000 (13:00 +0000)
committerTobias Grosser <tobias@grosser.es>
Mon, 3 Mar 2014 13:00:39 +0000 (13:00 +0000)
This also switches the users in LLVM to ensure this functionality is tested.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@202705 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Analysis/RegionInfo.h
lib/Analysis/RegionInfo.cpp
lib/Analysis/RegionPass.cpp
lib/Analysis/RegionPrinter.cpp
lib/Transforms/Scalar/StructurizeCFG.cpp

index 8af02e3efbdd60092697e5069183619df99e62df..a57b10088e18a800d7931392e9d38674f40a2abb 100644 (file)
@@ -27,6 +27,7 @@
 #ifndef LLVM_ANALYSIS_REGIONINFO_H
 #define LLVM_ANALYSIS_REGIONINFO_H
 
+#include "llvm/ADT/iterator_range.h"
 #include "llvm/ADT/PointerIntPair.h"
 #include "llvm/Analysis/DominanceFrontier.h"
 #include "llvm/Analysis/PostDominators.h"
@@ -545,6 +546,21 @@ public:
   const_block_iterator block_end() const {
     return const_block_iterator();
   }
+
+  typedef iterator_range<block_iterator> block_range;
+  typedef iterator_range<const_block_iterator> const_block_range;
+
+  /// @brief Returns a range view of the basic blocks in the region.
+  inline block_range blocks() {
+    return block_range(block_begin(), block_end());
+  }
+
+  /// @brief Returns a range view of the basic blocks in the region.
+  ///
+  /// This is the 'const' version of the range view.
+  inline const_block_range blocks() const {
+    return const_block_range(block_begin(), block_end());
+  }
   //@}
 
   /// @name Element Iterators
index 876d86b785b94c2f3f20007fe53cf71031a0ba34..f4da598d844480fc2cc9b3b38796f850be1bb969 100644 (file)
@@ -438,8 +438,8 @@ void Region::print(raw_ostream &OS, bool print_tree, unsigned level,
     OS.indent(level*2 + 2);
 
     if (Style == PrintBB) {
-      for (const_block_iterator I = block_begin(), E = block_end(); I != E; ++I)
-        OS << (*I)->getName() << ", "; // TODO: remove the last ","
+      for (const auto &BB : blocks())
+        OS << BB->getName() << ", "; // TODO: remove the last ","
     } else if (Style == PrintRN) {
       for (const_element_iterator I = element_begin(), E = element_end(); I!=E; ++I)
         OS << **I << ", "; // TODO: remove the last ",
index 9208fa21d7ecbe8b531070aabd5108b8771ad2dd..ac4e1149f086c51eb1a55bfa5dfa1d8c44a36821 100644 (file)
@@ -195,9 +195,8 @@ public:
 
   virtual bool runOnRegion(Region *R, RGPassManager &RGM) {
     Out << Banner;
-    for (Region::block_iterator I = R->block_begin(), E = R->block_end();
-         I != E; ++I)
-      (*I)->print(Out);
+    for (const auto &BB : R->blocks())
+      BB->print(Out);
 
     return false;
   }
index c5f1b925921b943e4ff700be79b8252861f5886c..6467f47cfbdb76c4a41dbf57505f11fb3f9e8fcd 100644 (file)
@@ -121,11 +121,10 @@ struct DOTGraphTraits<RegionInfo*> : public DOTGraphTraits<RegionNode*> {
 
     RegionInfo *RI = R->getRegionInfo();
 
-    for (Region::const_block_iterator BI = R->block_begin(),
-         BE = R->block_end(); BI != BE; ++BI)
-      if (RI->getRegionFor(*BI) == R)
+    for (const auto &BB : R->blocks())
+      if (RI->getRegionFor(BB) == R)
         O.indent(2 * (depth + 1)) << "Node"
-          << static_cast<const void*>(RI->getTopLevelRegion()->getBBNode(*BI))
+          << static_cast<const void*>(RI->getTopLevelRegion()->getBBNode(BB))
           << ";\n";
 
     O.indent(2 * depth) << "}\n";
index 60382889ef05e727dae95c1ec9fc6f8c8e78ccb2..6066727b3ac550654b403c33debb07bc8e92f80e 100644 (file)
@@ -829,11 +829,7 @@ void StructurizeCFG::createFlow() {
 /// no longer dominate all their uses. Not sure if this is really nessasary
 void StructurizeCFG::rebuildSSA() {
   SSAUpdater Updater;
-  for (Region::block_iterator I = ParentRegion->block_begin(),
-                              E = ParentRegion->block_end();
-       I != E; ++I) {
-
-    BasicBlock *BB = *I;
+  for (const auto &BB : ParentRegion->blocks())
     for (BasicBlock::iterator II = BB->begin(), IE = BB->end();
          II != IE; ++II) {
 
@@ -864,7 +860,6 @@ void StructurizeCFG::rebuildSSA() {
         Updater.RewriteUseAfterInsertions(*I);
       }
     }
-  }
 }
 
 /// \brief Run the transformation for each region found