16 #include "llvm/ADT/SmallVector.h"
20 using namespace clang;
23 : analyzed(cfg.getNumBlockIDs(),
false) {}
31 if (!analyzed[DstBlockID]) {
33 analyzed[DstBlockID] =
true;
37 return reachable[DstBlockID][Src->
getBlockID()];
42 void CFGReverseBlockReachabilityAnalysis::mapReachability(
const CFGBlock *Dst) {
44 llvm::BitVector visited(analyzed.size());
46 ReachableSet &DstReachability = reachable[Dst->
getBlockID()];
47 DstReachability.resize(analyzed.size(),
false);
51 worklist.push_back(Dst);
54 while (!worklist.empty()) {
55 const CFGBlock *block = worklist.pop_back_val();
71 e = block->
pred_end(); i != e; ++i) {
73 worklist.push_back(*i);
CFGBlock - Represents a single basic block in a source-level CFG.
CFG - Represents a source-level, intra-procedural CFG that represents the control-flow of a Stmt...
AdjacentBlocks::const_iterator const_pred_iterator
unsigned getBlockID() const
bool isReachable(const CFGBlock *Src, const CFGBlock *Dst)
Returns true if the block 'Dst' can be reached from block 'Src'.
CFGReverseBlockReachabilityAnalysis(const CFG &cfg)
pred_iterator pred_begin()