This is a general question regarding type conversion:
From what I understand, bitcast is wrong in this case because a GEP into a ** should be computed differently from a GEP into [ x ]*.
So, what is the correct way to perform this type conversion?
Bitcast, then use the correct form of GEP and other affected instructions.
What would the “correct form of GEP be”?
I don't think there is one. The types are not compatible. In your
situation i32** is an array of N pointers to i32 arrays. [4 x i32]* is
a contiguous array of 4N i32s.
If you really need to use a function that takes the second type then
copying the data is the only option I see.
Ah, right. I was assuming that OP wanted to load pointers instead of i32s.
Look at it from a “C” perspective.
If you have
int **, and want
intx4 *, what do you need to do?
You will need to load (copy, read) the content of the pointer.
But it’s the wrong type, you only get a single
int that way. So you need to cast the pointer to
intx4 ** first.
So, in essence:
auto tmp = (intx4**)p; // Bitcast
intx4 val = *tmp; // Load
In IR, that becomes a bitcast and load instruction.
If you also want to do tmp or some such, there would be a GEP instruction after the bitcast.