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.