LLVM Pass to count reachable BB

Hello,
I have code containing conditions and loops. Hence some BB execution are determined at run time depending on condition. Now I want to count only those BB that are always executed irrespective of condition result means reachable. and their execution is evident at compile time.

How to do this?

Please help

Thank You

Regards

Hello Hameeza,

If you have access to the dominator analysis (and the data is up-to-date) you can query if each block is dominated by the entry block of a function. I used this method to locate (and avoid) unreachable blocks at the beginning of the JumpThreading pass:

https://github.com/llvm-mirror/llvm/blob/master/lib/Transforms/Scalar/JumpThreading.cpp#L362

// JumpThreading must not processes blocks unreachable from entry. It’s a
// waste of compute time and can potentially lead to hangs.
SmallPtrSet<BasicBlock *, 16> Unreachable;
assert(DTU && “DTU isn’t passed into JumpThreading before using it.”);
assert(DTU->hasDomTree() && “JumpThreading relies on DomTree to proceed.”);
DominatorTree &DT = DTU->getDomTree();
for (auto &BB : F)
if (!DT.isReachableFromEntry(&BB))
Unreachable.insert(&BB);

And later in the main for loop below (line 378):
if (Unreachable.count(&BB))
continue;

You can find the set of all dominators of the exit block. Would that give you what you want?

-Krzysztof

Thank You…
I want to implement following algorithm in LLVM pass…

  1. Scan BB of CFG
  2. If BB is not 1st entry block then
  3. If BB.predecessor block has instruction “conditional br” then
  4. dont print BB
  5. else
  6. print BB

Please help me…How to implement this algorithm in LLVM pass?

Thank You
Regards