[LLVMdev] How to break/iterate over nested instructions.

Nick Lewycky nicholas at mxc.ca
Sat Aug 27 14:04:24 PDT 2011


Manish Gupta wrote:
> Hi Duncan,
>
> Why to break?
> I wish to analyse all the operands of getelemetptr instructions.

The outer one is a getelementptr instruction. The inner one is not, as 
it is a constant expression, not an instruction. Why do you want to 
visit constant expressions? Constant expressions are known to be 
constant through the life of the program, but aren't known *yet* at 
compile time, for example the address of a function.

If you really want to visit instructions and constant expressions, you 
should:
   1. iterate over the BasicBlock to find all Instructions, cast them to 
llvm::Operator* and visit them
   2. the visitor receives Operator* O and checks O->getOpcode() to 
detect GEP instructions *and* constant expressions. Do your work on them.
   3. your visitor iterates over O's operands, dyn_casts them to 
Operator* and visit them if the cast succeeds.

But before you do that work, ask yourself whether visiting something 
that's fundamentally an integer number (merely one whose concrete value 
isn't known yet) is what your pass needs to do. Thus far, nothing in 
LLVM has needed to break apart constant expressions into instructions.

Nick

  For
> which I iterate over the code and get the instruction of interest by
> getopcode == getelementptr. But the getelementptrs in this form as in my
> last mail are getting away from my pass. So i wish to break it. I have a
> work around if breaking is not possible, but I think it may be a common
> requirement by other passes too.
>
> Thanks!
> Manish
>
> On Sat, Aug 27, 2011 at 12:41 AM, Duncan Sands <baldrick at free.fr
> <mailto:baldrick at free.fr>> wrote:
>
>     Hi Manish,
>
>      > I wish to iterate over all instructions (where opCode ==
>     desired_opCode). I
>      > could iterate over all the instruction expect the nested
>     instructions like:
>      >
>      >   %add.ptr229 = getelementptr inbounds i8* getelementptr inbounds
>     ([4096 x i8]*
>      > @_Func1, i32 0, i32 0), i64 %idx.ext228
>
>     this is not a nested instruction.  The inner getelementptr is a
>     ConstantExpr
>     (a constant) not an instruction.
>
>      > I wish to break this nested instruction in two instructions.
>
>     Why?
>
>     Ciao, Duncan.
>
>       Please let me know
>      > if there is already existing method in llvm to do the job.
>      >
>      > Thanks,
>      > Manish
>      >
>      >
>      > _______________________________________________
>      > LLVM Developers mailing list
>      > LLVMdev at cs.uiuc.edu <mailto: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 <mailto: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




More information about the llvm-dev mailing list