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