This version LGTM, pushed, thanks.
On Wed, Nov 19, 2014 at 01:38:30PM +0800, xionghu....@intel.com wrote: > From: Luo Xionghu <xionghu....@intel.com> > > if the self loop node is reduced, the llvm loop info couldn't detect > such kind of self loops, handle it by checking whether the compacted > node has a successor pointed to itself. > > v2: differentiate the compacted node from basic node to make the logic > clearer, comments the while node as it is not enabled now. > > Signed-off-by: Luo Xionghu <xionghu....@intel.com> > --- > backend/src/ir/structural_analysis.cpp | 37 > ++++++++++++++++++++++---------- > 1 file changed, 26 insertions(+), 11 deletions(-) > > diff --git a/backend/src/ir/structural_analysis.cpp > b/backend/src/ir/structural_analysis.cpp > index 21c04f3..4c7e3d2 100644 > --- a/backend/src/ir/structural_analysis.cpp > +++ b/backend/src/ir/structural_analysis.cpp > @@ -864,6 +864,9 @@ namespace analysis > return NULL; > } > > + //FIXME: as our IR could only handle self loop, the while loop node > + //is disabled to avoid performace regression by the path function. > +#if 0 > /* check for improper region */ > for(NodeList::const_iterator m = nset.begin(); m != nset.end(); m++) > { > @@ -888,6 +891,8 @@ namespace analysis > return insertNode(p); > } > } > +#endif > + > return NULL; > } > > @@ -1023,18 +1028,28 @@ namespace analysis > } > > Node* loop_header = NULL; > - for (auto l : loops) { > - ir::BasicBlock &a = fn->getBlock(l->bbs[0]); > - loop_header = bbmap.find(&a)->second; > - > - if(loop_header == n){ > - for (auto bb : l->bbs) { > - ir::BasicBlock &tmp = fn->getBlock(bb); > - Node* node_ = bbmap.find(&tmp)->second; > - reachUnder.push_front(node_); > - nset.insert(node_); > + //if n is basic block node, query the llvm loop info to find the > loop whoose loop header is n; > + if(n->type() == BasicBlock){ > + for (auto l : loops) { > + ir::BasicBlock &a = fn->getBlock(l->bbs[0]); > + loop_header = bbmap.find(&a)->second; > + > + if(loop_header == n){ > + for (auto bb : l->bbs) { > + ir::BasicBlock &tmp = fn->getBlock(bb); > + Node* node_ = bbmap.find(&tmp)->second; > + reachUnder.push_front(node_); > + nset.insert(node_); > + } > + break; > } > - break; > + } > + }else{ > + //n is compacted node, it would have a successor pointed to itself > for self loop. > + if(n->succs().find(n) != n->succs().end()) > + { > + reachUnder.push_front(n); > + nset.insert(n); > } > } > > -- > 1.7.9.5 > > _______________________________________________ > Beignet mailing list > Beignet@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/beignet _______________________________________________ Beignet mailing list Beignet@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/beignet