【问题标题】:Check if a node is in the path of a node for a directed graph检查节点是否在有向图的节点路径中
【发布时间】:2012-08-30 09:34:09
【问题描述】:

我有一个有向图。我想知道节点 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);
    }
}

.

【问题讨论】:

  • 图表有点大,至少就我而言,我无法识别该图表中的任何东西,您介意缩放它以减少像素化吗?
  • 您是否认为它太大,每条路径都需要花费太多时间来计算
  • 第一次屏幕截图未能满足“最小、完整示例”的要求!
  • Kerrek SB:“不符合最小完整示例要求”是什么意思?
  • 不,我想说的是我很难识别积木的字符:)

标签: c++ c data-structures graph llvm


【解决方案1】:

检查图表中的反馈。然后检查代码中引用的功能块/状态机。 上图直到 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 的环回。

【讨论】:

  • 但我确定,我们不会返回。访问集就是为了这个目的。你觉得我还能有环回吗?
  • 基本上对于for.cond675,for.body688是后继。现在因为 for.body688 已经在访问集中(因为我们之前遇到过),所以算法不会再次访问它。这样就不会再解析回环了。
猜你喜欢
  • 2016-04-29
  • 1970-01-01
  • 2012-06-08
  • 2017-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-27
  • 2017-06-03
相关资源
最近更新 更多