[LLVMdev] Walking all the predecessors for a basic block
Ted Kremenek
kremenek at apple.com
Tue Jan 22 08:39:38 PST 2008
Hi Pabhat,
Have you checked out DepthFirstIterator? (include/llvm/ADT/
DepthFirstIterator.h). It provides an iterator abstraction to perform
a forward/reverse DFS traversal of a graph.
Many of the LLVM datatypes that represent graphs have a template
specialization of the GraphTraits<> class which allows separate
algorithms to treat them as graphs, walk them, etc. (Both BasicBlock
and MachineBlock have such template specializations; e.g. include/llvm/
Support/CFG.h for the specialization for BasicBlock).
DepthFirstIterator works on any datatype that has a specialization of
GraphTrait.
For your particular task, I *think* you would do the following
(someone else please correct me if I am wrong):
#include "llvm/Support/CFG.h"
#include "llvm/ADT/DepthFirstIterator.h"
for (idf_iterator<BasicBlock*> I=idf_begin(BB), E=idf_end(BB); I != E;
++I) {
BasicBlock* B = *I;
On Jan 22, 2008, at 6:11 AM, Prabhat Kumar Saraswat wrote:
> Hi all,
>
> Is there a way to walk through ALL the predecessors of a basic block
> in a CFG. I tried to iterate over the preds using this method
>
> for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; +
> +I) {
> BasicBlock *PredBB = *PI;
> }
>
> but this only gives the immediate predecessors for a basic block.
>
> For example, in this sample control flow graph.
>
> entry -> bb1 -> bb2 -> bb4 -> return
> | |
> bb3 <-|
>
>
> walking over the predecessors for bb2 only gives bb3 and bb1.. while i
> need something like bb3 bb1 and return (i.e. walking till the root of
> the CFG)
>
> Any Ideas ?
>
>
> Regards
> Prabhat
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
More information about the llvm-dev
mailing list