llvm - 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 IR 代码通常对每个case
标签或类似标签都有一个后继代码,因此对于像这个示例这样的代码,getUniqueSuccessor()
并getSingleSuccessor()
提供不同的结果:
switch(foo) {
case 0:
case 1:
case 2:
default:
printf("Hello, world\n";
}
第一个块有四个后继者,他们都是平等的。
推荐阅读
- angular - Angular Material 7 Datepicker:禁用多年视图
- excel - 用于重复条件合并和求和的 Excel VBA
- react-native - React Native / 使用字符串作为 FlatList 中的数据?
- javascript - How to wait untill for (append) finished and then show result javascirpt / jquery
- java - 如何将 JTextField 中的输入转换为日期?
- python - 如何在 django 中显示来自 2 个模型的数据,并在模板中使用一对多的关系
- view - Layout inflater with DialogFragment
- c++ - Counting and retrieving repetition using algorithm and lambda
- python - np.transpose() and np.reshape() combination gives different results in pure numpy and in numba
- java - use Lombok @Builder @Default @Singular to initialise List<>