繁体   English   中英

检查节点是否在有向图的节点路径中

[英]Check if a node is in the path of a node for a directed graph

我有一个有向图。 我想知道节点N是否始终在上层节点T的路径中。我检查它的方法是从入口节点开始并执行深度优先搜索。 如果在任何路径中看到节点N都在节点T之前遇到,则假定它并不总是在其路径中。

例如,在附加的图像中,入口节点是entry_0_CC_FC ,上层节点是if_end_0_CC_FC ,节点N是land.lhs.true26_0_CC_FC

但是我看到我的算法是停留在一个无限循环。 我不确定是花费太多时间还是卡住了。 顺便说一下,此图中有119个块。 这是代码。 您能看到任何可能使它陷入无限循环的问题吗?

void CheckIfNotAlwaysInPath(bool& violation, BasicBlock* BS, 
  BasicBlock* BT, BasicBlock* BN, set<BasicBlock*> visited)
{
    int i;

    // If already visited
    if ( visited.find( BS ) != visited.end() ) // If already had visited
        return;

    visited.insert(BS);

    if ( BS == BN )
    {
        if ( visited.find( BT ) == visited.end() )
            violation = true;
        return;
    }

    if ( isa<ReturnInst>(BS->getTerminator()) )
        return;
    if ( BS->getTerminator()->getNumSuccessors() == 0 )
        return;


    for( i = 0; i < BS->getTerminator()->getNumSuccessors(); i++ )
    {
        if ( visited.find( BS->getTerminator()->getSuccessor(i) ) == visited.end() )
            CheckIfNotAlwaysInPath(violation, BS->getTerminator()->getSuccessor(i), BT, BN, visited);
    }
}

在此处输入图片说明

检查图中的反馈。 然后检查代码中的引用功能块/状态机。 直到if.end531_0_CC_FC的图的上半部都应该没问题。 之后,for.body块或for.cond675.loopexit_0_cc_FC可能容易出错...或其他一些环回。

我的第一个猜测是从for.cond675.loopexit_0_cc_FC到for.body.688.lr.ph_0_CC_FC的环回。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM