First time!

Hi!

I want to know

How to count the number of predecessors for each basic
block?

Thank You

Hi aditya,
There are two ways to cound the number of predecessors for each basic block.
You can generate the control flow graph using the CallGraphScc pass with the granularity of basic block and can simply traverse the graph bottom up till the root. The number of nodes encountered would be the number of predecessors.

The second way would be to use the special ;preds marker in the llvm IR. Each basic block starts with this line which details the name of its predecessor blocks

for example

bb5: ; preds bb2, bb3

thus bb5 is preceeded by bb2 and bb3.

but, one word of caution, even bb2 and bb3 can be preceeded by some other basic blocks, thus the count for bb5 (number of predecessors) won’t be 2, but would be more (depends upon the predecessors of bb2 and bb3).

You can also try to utilize the branching info at the end of each basic block in llvmIR of the source.

I am working on something similar, do let me know if u need some specific information.

Regards
Prabhat

hi prabhat,
how to extract the arguements(number of arguements
also) of the remarks statement(regarding
predecessors)?
in your example i want to get my answer as 2!
thank you
aditya

--- Prabhat Kumar Saraswat

My obvious question is what are you trying to do ?

One way to count predecessor for a basic block BB is

  unsigned count = 0;
  for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI)
    ++count;

pred_iteraor, pred_begin, pred_end etc.. are available through llvm/Support/CFG.h

Use:

#include "llvm/Support/CFG.h"

   for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++I) {
     BasicBlock *PredBB = *PI;
     ..
   }

to walk basic block predecessors. Similarly, use succ_* for successors.

You might find this section useful:
http://llvm.org/docs/ProgrammersManual.html#common

-Chris