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

mats petersson via llvm-dev llvm-dev at lists.llvm.org
Tue May 16 07:46:39 PDT 2017


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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170516/9a8fee1c/attachment.html>


More information about the llvm-dev mailing list