[Mesa-dev] [PATCH 2/3] R600: optimize structurizer a bit

Christian König deathsimple at vodafone.de
Thu Jan 24 04:46:37 PST 2013


From: Christian König <christian.koenig at amd.com>

Signed-off-by: Christian König <christian.koenig at amd.com>
Tested-by: Michel Dänzer <michel.daenzer at amd.com>
---
 lib/Target/R600/AMDGPUStructurizeCFG.cpp |   71 +++++++++++++++---------------
 1 file changed, 36 insertions(+), 35 deletions(-)

diff --git a/lib/Target/R600/AMDGPUStructurizeCFG.cpp b/lib/Target/R600/AMDGPUStructurizeCFG.cpp
index 5be40de..70622e7 100644
--- a/lib/Target/R600/AMDGPUStructurizeCFG.cpp
+++ b/lib/Target/R600/AMDGPUStructurizeCFG.cpp
@@ -204,51 +204,33 @@ void AMDGPUStructurizeCFG::buildPredicate(BranchInst *Term, unsigned Idx,
   Value *True = Invert ? BoolFalse : BoolTrue;
   Value *False = Invert ? BoolTrue : BoolFalse;
 
-  RegionInfo *RI = ParentRegion->getRegionInfo();
-  BasicBlock *BB = Term->getParent();
-
-  // Handle the case where multiple regions start at the same block
-  Region *R = BB != ParentRegion->getEntry() ?
-              RI->getRegionFor(BB) : ParentRegion;
+  BasicBlock *Parent = Term->getParent();
 
-  if (R == ParentRegion) {
-    // It's a top level block in our region
-    Value *Cond = True;
-    if (Term->isConditional()) {
-      BasicBlock *Other = Term->getSuccessor(!Idx);
+  Value *Cond = True;
+  if (Term->isConditional()) {
+    BasicBlock *Other = Term->getSuccessor(!Idx);
 
-      if (Visited.count(Other)) {
-        if (!Pred.count(Other))
-          Pred[Other] = False;
-
-        if (!Pred.count(BB))
-          Pred[BB] = True;
-        return;
-      }
-      Cond = Term->getCondition();
+    if (Visited.count(Other)) {
+      if (!Pred.count(Other))
+        Pred[Other] = False;
 
-      if (Idx != Invert)
-        Cond = BinaryOperator::CreateNot(Cond, "", Term);
+      if (!Pred.count(Parent))
+        Pred[Parent] = True;
+      return;
     }
+    Cond = Term->getCondition();
 
-    Pred[BB] = Cond;
-
-  } else if (ParentRegion->contains(R)) {
-    // It's a block in a sub region
-    while(R->getParent() != ParentRegion)
-      R = R->getParent();
-
-    Pred[R->getEntry()] = True;
-
-  } else {
-    // It's a branch from outside into our parent region
-    Pred[BB] = True;
+    if (Idx != Invert)
+      Cond = BinaryOperator::CreateNot(Cond, "", Term);
   }
+
+  Pred[Parent] = Cond;
 }
 
 /// \brief Analyze the successors of each block and build up predicates
 void AMDGPUStructurizeCFG::analyzeBlock(BasicBlock *BB) {
   pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
+  RegionInfo *RI = ParentRegion->getRegionInfo();
   BBPredicates &Pred = Predicates[BB];
 
   for (; PI != PE; ++PI) {
@@ -263,7 +245,26 @@ void AMDGPUStructurizeCFG::analyzeBlock(BasicBlock *BB) {
       BasicBlock *Succ = Term->getSuccessor(i);
       if (Succ != BB)
         continue;
-      buildPredicate(Term, i, Pred, false);
+
+      // Handle the case where multiple regions start at the same block
+      Region *R = *PI != ParentRegion->getEntry() ?
+                  RI->getRegionFor(*PI) : ParentRegion;
+
+      if (R == ParentRegion) {
+        // It's a top level block in our region
+        buildPredicate(Term, i, Pred, false);
+
+      } else if (ParentRegion->contains(R)) {
+        // It's a block in a sub region
+        while(R->getParent() != ParentRegion)
+          R = R->getParent();
+
+        Pred[R->getEntry()] = BoolTrue;
+
+      } else {
+        // It's a branch from outside into our parent region
+        Pred[*PI] = BoolTrue;
+      }
     }
   }
 }
-- 
1.7.9.5



More information about the mesa-dev mailing list