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:
storeInstructionInstance.getValueOperand.hasOneUse()
true: only used within this storeInstruction, else value is
introduced/used elsewhere.

Is this correct?

Thanks!

Alex

p.s.:

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.
Thanks

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.

Thanks

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() ?

Thanks!

Alex

Hi,

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?
Alex

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.

Alex