Prabhat Kumar Saraswat
2008-Jan-22  14:11 UTC
[LLVMdev] Walking all the predecessors for a basic block
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
Ted Kremenek
2008-Jan-22  16:39 UTC
[LLVMdev] Walking all the predecessors for a basic block
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
Chris Lattner
2008-Jan-22  18:30 UTC
[LLVMdev] Walking all the predecessors for a basic block
On Tue, 22 Jan 2008, Ted Kremenek wrote:> 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;Yep, that's perfect. -Chris -- http://nondot.org/sabre/ http://llvm.org/
Prabhat Kumar Saraswat
2008-Jan-23  09:35 UTC
[LLVMdev] Walking all the predecessors for a basic block
Hi,
 Well, yes i did try your suggestion but i keep on running into a
compilation problem.
The error is:
llvm[0]: Compiling Hello.cpp for Release build  (PIC)
/home/saraswat/llvm/llvm-2.1/include/llvm/ADT/GraphTraits.h: In
instantiation of
`llvm::GraphTraits<llvm::ilist_iterator<llvm::BasicBlock> >':
Hello.cpp:59:   instantiated from here
/home/saraswat/llvm/llvm-2.1/include/llvm/ADT/GraphTraits.h:57: error:
no type named `UnknownGraphTypeError' in `class
llvm::ilist_iterator<llvm::BasicBlock>'
Hello.cpp: In member function `virtual bool
<unnamed>::Hello::runOnFunction(llvm::Function&)':
Hello.cpp:59: error: no matching function for call to
`idf_begin(llvm::ilist_iterator<llvm::BasicBlock>&)'
Hello.cpp:59: error: no matching function for call to
`idf_end(llvm::ilist_iterator<llvm::BasicBlock>&)'
My source code for this pass is below:
#include "llvm/Support/CFG.h"
#include "llvm/ADT/DepthFirstIterator.h"
#include "llvm/ADT/GraphTraits.h"
    virtual bool runOnFunction(Function& F) {
        //for each function iterating over the basic blocks
      for (Function::iterator b = F.begin(); b != F.end(); ++b) {
      for (idf_iterator<BasicBlock*> I=idf_begin(b); I!=idf_end(b);
++I) {   // for each basic block walking over the predecessors in the
graph
  BasicBlock* B = *I;
  }
 }
}
Am i doing something wrong ?,   I did verify template specialisation
of the GraphTrait class for the BasicBlock class from the CFG.h file.
Why this UnknownGraphTypeError ?
Thanks again for the help.
Regards
Prabhat
On Jan 22, 2008 5:39 PM, Ted Kremenek <kremenek at apple.com>
wrote:> 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
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>