Distinguishing Pointer Variable and Ordinary Variable

C Code :-
int main()
{
int a=10,c;
int *b;
c=20;
*b=a;
return 0;
}

IR of above code :-
define i32 @main() #0 {
entry:
1. %retval = alloca i32, align 4
2. %a = alloca i32, align 4
3. %c = alloca i32, align 4
4. %b = alloca i32*, align 8
5. store i32 0, i32* %retval
6. store i32 10, i32* %a, align 4
7. store i32 20, i32* %c, align 4
8. %0 = load i32* %a, align 4
9. %1 = load i32** %b, align 8
10. store i32 %0, i32* %1, align 4
11. ret i32 0
}

Line 8,9,10 of IR represents *b=a;

Now I want to recognise whether i32* %1 on line 10 is a pointer variable or
ordinary variable through llvm pass.
So how to solve this issue ???

Check it’s type to see if it’s a pointer or not?

Sorry I have actually edited the post.

I did check its type by using
isa<PointerType>(cast<AllocaInst>(instr->getOperand(1))->getAllocatedType())
but it is only detecting i32** %b on line 8 of IR as a pointer type.

Whereas I also want to detect the i32* %1 on line 11 of IR as a pointer
type. So how can I do this??

Hi,

Sorry I have actually edited the post.

This is primarily an e-mail list; the vast majority of us won't see
any edits (on some web mirror?).

I did check its type by using
isa<PointerType>(cast<AllocaInst>(instr->getOperand(1))->getAllocatedType())
but it is only detecting i32** %b on line 8 of IR as a pointer type.

Not all pointers will come (directly or indirectly) from an
AllocaInst. You might just want
isa<PointerType>(instr->getOperand(1)->getType()), though of course
that'll be true for any memory operand of a store instruction.

Tim.

Not all pointers will come (directly or indirectly) from an
AllocaInst. You might just want
isa<PointerType>(instr->getOperand(1)->getType()), though of course
that'll be true for any memory operand of a store instruction.

isa<PointerType>(instr->getOperand(0)->getType()) will check if a pointer
is being stored.

Ciao, Duncan.