GBE/IR: add collectInsnNum to collect block instruction number.

Submitted by Luo, Xionghu on Aug. 5, 2015, 5:13 a.m.

Details

Message ID 1438751604-2513-1-git-send-email-xionghu.luo@intel.com
State New
Headers show

Not browsing as part of any series.

Commit Message

Luo, Xionghu Aug. 5, 2015, 5:13 a.m.
From: Luo Xionghu <xionghu.luo@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@intel.com>
---
 backend/src/ir/structurizer.cpp | 24 +++++++++++++++++++++---
 backend/src/ir/structurizer.hpp |  4 +++-
 2 files changed, 24 insertions(+), 4 deletions(-)

Patch hide | download patch | download mbox

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);

Comments

LGTM, thanks.

> -----Original Message-----

> From: Beignet [mailto:beignet-bounces@lists.freedesktop.org] On Behalf Of

> xionghu.luo@intel.com

> Sent: Wednesday, August 5, 2015 13:13

> To: beignet@lists.freedesktop.org

> Cc: Luo, Xionghu

> Subject: [Beignet] [PATCH] GBE/IR: add collectInsnNum to collect block

> instruction number.

> 

> From: Luo Xionghu <xionghu.luo@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@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

> 

> _______________________________________________

> Beignet mailing list

> Beignet@lists.freedesktop.org

> http://lists.freedesktop.org/mailman/listinfo/beignet