Loss of Type information

I have a struct node with three fields {size_t, size_t, struct node }. When I allocate such a node, malloc allocates [3 i64] i.e allocates an array of 3 i64’s but not a structure.
Thus any store to the pointer field in the structures involves a cast from a pointer to an integer.
So a pointer is cast to a integer and then stored into the third field of this structure.
This happens only when I use llvm-gcc -O3 to generate the bitcode? why does llvm-gcc do this with -O3?

Sample bitcode illustrating the same is shown below.

%2 = malloc [3 x i64] ; <[3 x i64]> [#uses=6]
%.sub = getelementptr [3 x i64]
%2, i64 0, i64 0 ; <i64*> [#uses=
1]
store i64 %i.0.reg2mem.0, i64* %.sub, align 8
%3 = getelementptr [3 x i64]* %2, i64 0, i64 1 ; <i64*> [#uses=1]
%.c = add i64 %i.0.reg2mem.0, 1 ; [#uses=3]
store i64 %.c, i64* %3
%4 = getelementptr [3 x i64]* %2, i64 0, i64 2 ; <i64*> [#uses=1]
%ptr.0.c = ptrtoint [3 x i64]* %ptr.0.in.in.reg2mem.0 to i64 ;
[#uses=1]
store i64 %ptr.0.c, i64* %4

Santosh