[LLVMdev] LLVM Instruction Operands
Griffin Wright
grwright at umich.edu
Thu Jun 2 12:33:49 PDT 2011
That is very helpful, John, thank you. Reid as well, your response cleared
some things up :)
Part <n> of my question series:
Say I have a bunch of defs that I'm iterating through, and I want to find
the uses for each def. How should I have my parameters set up? Right now
I'm trying to use the following, where "defs" is defined in the header file
as "std::vector<Instruction*> defs":
for (std::vector<Instruction*>::iterator def_iter = defs.begin();
def_iter!= defs.end(); def_iter++) {
Instruction* defInsn = dyn_cast<Instruction>(*def_iter);
for (Instruction::use_iterator use_iter = defInsn->use_begin();
use_iter!= defInsn->use_end(); use_iter++) {
Instruction *pUseInstr = dyn_cast<Instruction>(*use_iter);
Do stuff with the newly found use instruction!
}
}
I feel like having the use_begin() based on defInsn is grossly incorrect
(and the rest of the code here might be as well), so I was hoping to run it
past someone with [much] more knowledge than I.
Thanks again for tolerating a poor newbie's questions.
-Griffin
On Thu, 02 Jun 2011 10:37:47 -0700, John McCall <rjmccall at apple.com> wrote:
> On Jun 2, 2011, at 9:46 AM, Griffin Wright wrote:
>
>>
>> Hello all:
>>
>> I apologize for what I imagine is a rather silly question, but I'm still
>> somewhat new to LLVM and am stuck. I am reworking some code that was
>> originally in the backend involving MachineInstructions and
>> MachineOperands, and I now need for it to function as an LLVM IR pass,
>> using just Instructions, etc, and nothing related to 'Machine'.
>>
>> However, I am not sure how to get the information I need at the IR
level.
>>
>> I need to iterate over all operands of an instruction, analyzing each
>> operand to get a register number (if available), see if the operand is a
>> register or an immediate, get the operand def, and some other stuff. I
>> also need to be able to do implicitDef/Use determination on
instructions.
>>
>> I don't see a way to do this at present.
>
> If your pass really needs to analyze the use of physical registers and
> whether individual machine instructions are using immediate operands
> or not, then it needs to stay at the machine level. If you only really
> care
> about higher-level things like (1) what operation is being performed,
> (2) whether particular operands are constant or not, and (3) if not, how
> and when they were produced, then it's far better to work on LLVM IR.
>
> On IR, you test for specific kinds of values using isa or dyn_cast.
> For example, I can check whether a value is a 'mul' instruction:
> if (BinaryOperator *op = dyn_cast<BinaryOperator>(val)) {
> if (op->getOpcode() == Instruction::Mul) {
> and now I can check whether the LHS is a call:
> if (isa<CallInst>(op->getOperand(0))) {
> etc.
>
> John.
More information about the llvm-dev
mailing list