Check if value operand to store instruction is defined in this instruction

Hi all,

the store instruction allows to define values, e.g.:

%ptr = alloca i32 ; yields i32*:ptr
store i32 3, i32* %ptr

lets name this 'type1 store'; this is different from 'type2 store'

%val = load i32, i32* %someptr
%ptr = alloca i32 ; yields i32*:ptr
store %val, i32* %ptr ; yields void

When now later on manipulating the instructions of a function, can I
tell if I deal with type1 or type 2 store?

In case of type1 I could e.g. alter the value; in type 2 not.

My best guess is something like:
true: only used within this storeInstruction, else value is
introduced/used elsewhere.

Is this correct?




it's been a while since my last post to llvm-dev. Is this still the
place for such questions? If not, pleas point me where to ask this sort
of questions.

Hi Alex,
Can’t you just just if the first operand is a ConstantInt? If you need to differentiate only these 2 cases it should be fine.


Hi Alberto,

i need to check for the difference for all possible types being able to
get stored, so I need a general solution.

Do you think there might be problems with using

getValueOperand.hasOneUse() ?




sadly, getOperand(0).getNumUses() reports 1 in both cases.
When I have a look at the Value* retrievd from getOperand(0), I see a
field numUserOperands, which seems to discriminate the two cases, but I
can not manage to access it (there's no getNumUserOperands).

Any hints?

The HasOneUse or HasNUsaes does not work for discriminating the two
cases. I solved it via cast to Instruction or GlobalVariable; if both
result in nullptr, its an inline defined value.