[llvm-dev] [IR question] Switching on pointers

mats petersson via llvm-dev llvm-dev at lists.llvm.org
Tue May 16 09:32:40 PDT 2017


On 16 May 2017 at 17:20, Marcin Słowik <slowikmarcin1992 at gmail.com> wrote:

> I have a simple answer, why this should not be possible.
> If it were, you would be required to know the integral values of pointers
> at codegen, since switch lowering requires them, and you will not get them
> until linking. Thus, it is impossible to properly handle switch on
> pointers, at least with the same constructions.
>

Yes, like Daniel says, and I implied by saying that "address of a variable
isn't a true constant" (or words to that effect). I suspect you wanted to
post this to the list, so I copied the list in again, rather than keep this
as a private conversation between you and me.

--
Mats

> Cheers,
> Marcin
>
>
> On May 16, 2017 4:46 PM, "mats petersson via llvm-dev" <
> llvm-dev at lists.llvm.org> wrote:
>
>
>
> On 16 May 2017 at 12:48, 陳韋任 via llvm-dev <llvm-dev at lists.llvm.org> wrote:
>
>> Just a guess. Maybe you can write C code mimic what you want to achieve,
>> then compile it to LLVM IR.
>> See what LLVM IR generated by FE.
>>
>
> Probably won't work, since both the type of x in switch(x)  and
> case-labels must be integral types (not pointers).
>
>
>> Regards,
>> chenwj
>>
>> 2017-05-16 0:29 GMT+08:00 Benoit Vey via llvm-dev <
>> llvm-dev at lists.llvm.org>:
>>
>>> Hi.
>>>
>>> First of all, some context. I'm trying to implement a new functionality
>>> in an LLVM-based compiler and I need to take various actions based on the
>>> value of a given pointer, the possible values being the addresses of
>>> various global constants. I tried to use a `switch` instruction but I
>>> encountered several problems.
>>>
>>> The "ideal switch" I'd like to have would look something like this (with
>>> way more cases):
>>>
>>>     ; ModuleID = 'module'
>>>     source_filename = "module"
>>>
>>>     @var0 = global i32 0
>>>     @var1 = global i32 0
>>>
>>>     define i32 @func(i32*) {
>>>     entry:
>>>       switch i32* %0, label %unreachable [
>>>         i32* @var0, label %var0
>>>         i32* @var1, label %var1
>>>       ]
>>>
>>>     var0:                                             ; preds = %entry
>>>       br label %post
>>>
>>>     var1:                                             ; preds = %entry
>>>       br label %post
>>>
>>>     unreachable:                                      ; preds = %entry
>>>       unreachable
>>>
>>>     post:                                             ; preds = %var1,
>>> %var0
>>>       %1 = phi i32 [ 0, %var0 ], [ 1, %var1 ]
>>>       ret i32 %1
>>>     }
>>>
>>> This example is impossible because a `switch` cannot have pointer
>>> operands. So I tried with `ptrtoint`, turning the `switch` into this:
>>>
>>>       %1 = ptrtoint i32* %0 to i64
>>>       switch i64 %1, label %unreachable [
>>>         i64 ptrtoint (i32* @var0 to i64), label %var0
>>>         i64 ptrtoint (i32* @var1 to i64), label %var1
>>>       ]
>>>
>>> I'm a bit baffled by that one. According to the documentation the
>>> address of a global value is a constant, yet this `switch` is impossible
>>> because the result of the `ptrtoint` isn't a constant integer.
>>>
>>> At that point, I don't really know how to proceed. My questions are:
>>>
>>> - Why is `switch` restricted to integers?
>>>
>>
> Same reason C only supports it?
>
>> - What is the result of a constant `ptrtoint` and why isn't it a constant
>>> integer?
>>>
>>
> Well, a POINTER isn't a true constant either, so I'm not entirely sure
> your original value is indeed, truly, a constant. But perhaps splitting
> hairs.
>
>
>> - Is there a way to switch on pointers despite these restrictions?
>>>
>>
> I'm not sure what you are ACTUALLY trying to solve. The subject seems a
> bit XY-question - you want to achieve X, you think Y is the way to do that,
> so you ask how to do Y - if you explain "I want to do X, how should I do
> that?", maybe someone can come up with a good answer?
>
> --
> Mats
>
>>
>>> Thanks.
>>>
>>> ----------------------------------------------------------------
>>> This message was sent using IMP, the Internet Messaging Program.
>>>
>>>
>>> _______________________________________________
>>> LLVM Developers mailing list
>>> llvm-dev at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>>
>>
>>
>>
>> --
>> Wei-Ren Chen (陳韋任)
>> Homepage: https://people.cs.nctu.edu.tw/~chenwj
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>
>>
>
> _______________________________________________
> 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/20170516/abc2a962/attachment.html>


More information about the llvm-dev mailing list