get ref to parent instruction

Hi all,

How can I get a reference to an instruction if I have a reference to
an operand? For example, let suppose I have a reference to the
ConstantExpr "getelementptr inbounds" in the following instruction:

  %4 = getelementptr i32* getelementptr inbounds ([8 x i32]*
@__mem_grid_MOD_nnyp, i32 0, i32 0), i32 %3

then, how can I get a reference to the GetElementPtrInst object?

The reason I need that is because I want to change every instruction
that uses certain variables (in the example above the
__mem_grid_MOD_nnyp variable). The problem is that for the example I
showed the actual user of the variable is a ConstantExpr object and
not the GetElementPtrInst object.

Best regards,
Eduardo

You can use Value::use_begin()/use_end() recursively.

That said, have you looked at Value::replaceAllUsesWith()?

-Eli

Eduardo <erocha.ssa@gmail.com> writes:

How can I get a reference to an instruction if I have a reference to
an operand? For example, let suppose I have a reference to the
ConstantExpr "getelementptr inbounds" in the following instruction:

  %4 = getelementptr i32* getelementptr inbounds ([8 x i32]*
@__mem_grid_MOD_nnyp, i32 0, i32 0), i32 %3

then, how can I get a reference to the GetElementPtrInst object?

A given Value instance can be an operand of multiple instructions.

The reason I need that is because I want to change every instruction
that uses certain variables (in the example above the
__mem_grid_MOD_nnyp variable). The problem is that for the example I
showed the actual user of the variable is a ConstantExpr object and
not the GetElementPtrInst object.

You can traverse the User's of a Value with the iterators returned by
Value::use_begin and Value::use_end methods.

Hi Eli,
Thanks for your reply. I once tried to use Value::replaceAllUsesWith() but it’d break my code.
Eduardo

Hi Oscar:
In instructions like the one I showed can I expect that Value::use_begin and Value::use_end will return only the getelementptr or there is a chance I will get other users of that constant?
Thanks a lot,
Eduardo

Eduardo <erocha.ssa@gmail.com> writes:

In instructions like the one I showed can I expect that Value::use_begin
and Value::use_end will return only the getelementptr or there is a chance
I will get other users of that constant?

Those methods return iterators for traversing *all* User's of the Value.
Please note that a "variable" that appears on several places on the LLVM
assembly listing is actually represented by a single C++ object.

On your specific case, as Eli suggests, you may need to recursively
traverse the Use graph, because your "variable" is being used by a
ConstantExpr that in turn is being used by the instruction you intend to
work on.