Why does llvm bitcast a struct pointer to an integer pointer?

I have some C code that does a memcpy (though it doesn’t use the memcpy instrinsic at all) on structure like:

x = y;

Where x and y are of the same structure type. My question is in the LLVM code, it firsts get the address from the GEP using the struct type but then before the load and store, it bitcasts this to i64 for some reason?

Why does this occur in the IR? Doesn’t seem like the IR would care either way.

Just to clarify any confusion, I’m not talking about the pointer width, I’m talking about the type that the pointer is pointing to.


Also, is there anyway to make LLVM do an element by element copy in this case?

Would it be possible to replace all uses of the i64 (bitcast Instruction) with bitcast operand?

So for something like: tmp = bitcast %struct.MyStruct* %arrayidx to i64*

I would like to replace all uses of tmp with arrayidx. It doesn’t look like LLVM has a way to setType() so I guess I would have to check uses, and create new instructions of the StructTy and replace those uses with the new Instruction?