[Beignet] [PATCH] GBE/IR: add collectInsnNum to collect block instruction number.

xionghu.luo at intel.com xionghu.luo at intel.com
Tue Aug 4 22:13:24 PDT 2015


From: Luo Xionghu <xionghu.luo at intel.com>

if we are in if/endif fix mode, the long if/endif block need be
split to short ones, but we cannot do this in structuralized
blocks, so don't generated long if/endif structuralized blocks here.
the threshold is 1000 by estimate.

Signed-off-by: Luo Xionghu <xionghu.luo at intel.com>
---
 backend/src/ir/structurizer.cpp | 24 +++++++++++++++++++++---
 backend/src/ir/structurizer.hpp |  4 +++-
 2 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/backend/src/ir/structurizer.cpp b/backend/src/ir/structurizer.cpp
index 6c4e455..38d3dd1 100644
--- a/backend/src/ir/structurizer.cpp
+++ b/backend/src/ir/structurizer.cpp
@@ -458,6 +458,17 @@ namespace ir {
     return p_block;
   }
 
+  void CFGStructurizer::collectInsnNum(Block* block, const BasicBlock* bb)
+  {
+    BasicBlock::const_iterator iter = bb->begin();
+    BasicBlock::const_iterator iter_end = bb->end();
+    while(iter != iter_end)
+    {
+      block->insnNum++;
+      iter++;
+    }
+  }
+
   bool CFGStructurizer::checkForBarrier(const BasicBlock* bb)
   {
     BasicBlock::const_iterator iter = bb->begin();
@@ -600,6 +611,7 @@ namespace ir {
     loops = fn->getLoops();
     fn->foreachBlock([&](ir::BasicBlock &bb){
         orderedBlks.push_back(bbmap[&bb]);
+        collectInsnNum(bbmap[&bb], &bb);
         });
   }
 
@@ -721,6 +733,7 @@ namespace ir {
           p->canBeHandled = false;
           break;
         }
+        p->insnNum += (*iter)->insnNum;
         iter++;
       }
       return insertBlock(p);
@@ -770,6 +783,7 @@ namespace ir {
     if(loopSets.size() == 1)
     {
       Block* p = new SelfLoopBlock(*loopSets.begin());
+      p->insnNum = (*loopSets.begin())->insnNum;
       p->canBeHandled = true;
       (*loopSets.begin())->getExit()->isLoopExit = true;
       return insertBlock(p);
@@ -881,7 +895,8 @@ namespace ir {
     if (TrueBB->succ_size() == 1 && FalseBB->succ_size() == 1
         && TrueBB->pred_size() == 1 && FalseBB->pred_size() == 1
         && *TrueBB->succ_begin() == *FalseBB->succ_begin()
-        && !TrueBB->hasBarrier() && !FalseBB->hasBarrier() ) {
+        && !TrueBB->hasBarrier() && !FalseBB->hasBarrier()
+        && TrueBB->insnNum < 1000 && FalseBB->insnNum < 1000) {
       // if-else pattern
       ifSets.insert(block);
       if(block->fallthrough() == TrueBB) {
@@ -895,17 +910,19 @@ namespace ir {
       }else{
         GBE_ASSERT(0);
       }
+      mergedBB->insnNum = block->insnNum + TrueBB->insnNum + FalseBB->insnNum;
 
       if(block->canBeHandled == false || TrueBB->canBeHandled == false || FalseBB->canBeHandled == false)
         block->canBeHandled = false;
 
       insertBlock(mergedBB);
     } else if (TrueBB->succ_size() == 1 && TrueBB->pred_size() == 1 &&
-        *TrueBB->succ_begin() == FalseBB && !TrueBB->hasBarrier() ) {
+        *TrueBB->succ_begin() == FalseBB && !TrueBB->hasBarrier() && TrueBB->insnNum < 1000 ) {
       // if-then pattern, false is empty
       ifSets.insert(block);
       ifSets.insert(TrueBB);
       mergedBB = new IfThenBlock(block, TrueBB);
+      mergedBB->insnNum = block->insnNum + TrueBB->insnNum;
       if(block->fallthrough() == FalseBB)
         block->inversePredicate = false;
 
@@ -914,11 +931,12 @@ namespace ir {
 
       insertBlock(mergedBB);
     } else if (FalseBB->succ_size() == 1 && FalseBB->pred_size() == 1 &&
-        *FalseBB->succ_begin() == TrueBB && !FalseBB->hasBarrier() ) {
+        *FalseBB->succ_begin() == TrueBB && !FalseBB->hasBarrier() && FalseBB->insnNum < 1000 ) {
       // if-then pattern, true is empty
       ifSets.insert(block);
       ifSets.insert(FalseBB);
       mergedBB = new IfThenBlock(block, FalseBB);
+      mergedBB->insnNum = block->insnNum + FalseBB->insnNum;
       if(block->fallthrough() == TrueBB)
         block->inversePredicate = false;
 
diff --git a/backend/src/ir/structurizer.hpp b/backend/src/ir/structurizer.hpp
index 8207644..09b2a7f 100644
--- a/backend/src/ir/structurizer.hpp
+++ b/backend/src/ir/structurizer.hpp
@@ -53,7 +53,7 @@ namespace ir {
   class Block
   {
   public:
-    Block(BlockType type, const BlockList& children): has_barrier(false), mark(false), canBeHandled(true), inversePredicate(true)
+    Block(BlockType type, const BlockList& children): has_barrier(false), mark(false), canBeHandled(true), inversePredicate(true), insnNum(0)
     {
       this->btype = type;
       this->children = children;
@@ -105,6 +105,7 @@ namespace ir {
      * m-->n
      * */
     bool inversePredicate;
+    int insnNum;
   };
 
   /* represents basic block */
@@ -211,6 +212,7 @@ namespace ir {
       Block* mergeLoopBlock(BlockList& loopSets);
       int  ifPatternMatch(Block *block);
       int  patternMatch(Block *block);
+      void collectInsnNum(Block* block, const BasicBlock* bb);
 
     private:
       void handleSelfLoopBlock(Block *loopblock, LabelIndex& whileLabel);
-- 
1.9.1



More information about the Beignet mailing list