Converting i32** to [4 x i32]* ?

Hello all,

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:

int **p;

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[3] or some such, there would be a GEP instruction after the bitcast.