[llvm-dev] Converting i32** to [4 x i32]* ?

mats petersson via llvm-dev llvm-dev at lists.llvm.org
Sun Aug 13 00:15:28 PDT 2017


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.

--
Mats

On 12 August 2017 at 15:40, Krzysztof Parzyszek via llvm-dev <
llvm-dev at lists.llvm.org> wrote:

> On 8/12/2017 9:32 AM, Tim Northover wrote:
>
>> On 12 August 2017 at 04:13, Siddharth Bhat via llvm-dev
>> <llvm-dev at lists.llvm.org> wrote:
>>
>>> 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.
>
> -Krzysztof
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170813/5854f713/attachment.html>


More information about the llvm-dev mailing list