[Beignet] [PATCH v2] add the reduced self loop node detection.
Zhigang Gong
zhigang.gong at linux.intel.com
Tue Nov 18 21:15:41 PST 2014
This version LGTM, pushed, thanks.
On Wed, Nov 19, 2014 at 01:38:30PM +0800, xionghu.luo at intel.com wrote:
> From: Luo Xionghu <xionghu.luo at 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.luo at 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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet
More information about the Beignet
mailing list