首页 > 解决方案 > LLVM 中的 BasicBlock::getSingleSuccessor() 和 BasicBlock::getUniqueSuccessor() 有什么区别?

问题描述

即使参考了doxygen 页面,我仍然不明白这些差异:

getSingleSuccessor()

如果它有一个后继者,则返回此块的后继者。

否则返回一个空指针。

getUniqueSuccessor()

如果该块有唯一的后继者,则返回该块的后继者。

否则返回一个空指针。

并查看源代码:

// BasicBlock.cpp
const BasicBlock *BasicBlock::getSingleSuccessor() const {
  const_succ_iterator SI = succ_begin(this), E = succ_end(this);
  if (SI == E) return nullptr; // no successors
  const BasicBlock *TheSucc = *SI;
  ++SI;
  return (SI == E) ? TheSucc : nullptr /* multiple successors */;
}

const BasicBlock *BasicBlock::getUniqueSuccessor() const {
  const_succ_iterator SI = succ_begin(this), E = succ_end(this);
  if (SI == E) return nullptr; // No successors
  const BasicBlock *SuccBB = *SI;
  ++SI;
  for (;SI != E; ++SI) {
    if (*SI != SuccBB)
      return nullptr;
    // The same successor appears multiple times in the successor list.
    // This is OK.
  }
  return SuccBB;
}

标签: llvm

解决方案


LLVM IR 代码通常对每个case标签或类似标签都有一个后继代码,因此对于像这个示例这样的代码,getUniqueSuccessor()getSingleSuccessor()提供不同的结果:

switch(foo) {
  case 0:
  case 1:
  case 2:
  default:
    printf("Hello, world\n";
}

第一个块有四个后继者,他们都是平等的。


推荐阅读