<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On 16 May 2017 at 17:20, Marcin Słowik <span dir="ltr"><<a href="mailto:slowikmarcin1992@gmail.com" target="_blank">slowikmarcin1992@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto"><div>I have a simple answer, why this should not be possible.<div dir="auto">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. </div></div></div></blockquote><div><br></div>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.<br><br>--<br></div><div class="gmail_quote">Mats<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto"><div><div dir="auto">Cheers, </div><span class="HOEnZb"><font color="#888888"><div dir="auto">Marcin </div></font></span><div><div class="h5"><br><div class="gmail_extra"><br><div class="gmail_quote">On May 16, 2017 4:46 PM, "mats petersson via llvm-dev" <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br type="attribution"><blockquote class="m_7037060904153723188quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote"><div class="m_7037060904153723188quoted-text">On 16 May 2017 at 12:48, 陳韋任 via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div style="font-family:arial,helvetica,sans-serif">Just a guess. Maybe you can write C code mimic what you want to achieve, then compile it to LLVM IR.</div><div style="font-family:arial,helvetica,sans-serif">See what LLVM IR generated by FE.</div></div></blockquote><div><br></div></div><div>Probably won't work, since both the type of x in switch(x)  and case-labels must be integral types (not pointers).<br><br></div><div class="m_7037060904153723188elided-text"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div style="font-family:arial,helvetica,sans-serif"><br></div><div style="font-family:arial,helvetica,sans-serif">Regards,</div><div style="font-family:arial,helvetica,sans-serif">chenwj</div></div><div class="gmail_extra"><div><div class="m_7037060904153723188m_1618877094168381407h5"><br><div class="gmail_quote">2017-05-16 0:29 GMT+08:00 Benoit Vey via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi.<br>
<br>
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.<br>
<br>
The "ideal switch" I'd like to have would look something like this (with way more cases):<br>
<br>
    ; ModuleID = 'module'<br>
    source_filename = "module"<br>
<br>
    @var0 = global i32 0<br>
    @var1 = global i32 0<br>
<br>
    define i32 @func(i32*) {<br>
    entry:<br>
      switch i32* %0, label %unreachable [<br>
        i32* @var0, label %var0<br>
        i32* @var1, label %var1<br>
      ]<br>
<br>
    var0:                                             ; preds = %entry<br>
      br label %post<br>
<br>
    var1:                                             ; preds = %entry<br>
      br label %post<br>
<br>
    unreachable:                                      ; preds = %entry<br>
      unreachable<br>
<br>
    post:                                             ; preds = %var1, %var0<br>
      %1 = phi i32 [ 0, %var0 ], [ 1, %var1 ]<br>
      ret i32 %1<br>
    }<br>
<br>
This example is impossible because a `switch` cannot have pointer operands. So I tried with `ptrtoint`, turning the `switch` into this:<br>
<br>
      %1 = ptrtoint i32* %0 to i64<br>
      switch i64 %1, label %unreachable [<br>
        i64 ptrtoint (i32* @var0 to i64), label %var0<br>
        i64 ptrtoint (i32* @var1 to i64), label %var1<br>
      ]<br>
<br>
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.<br>
<br>
At that point, I don't really know how to proceed. My questions are:<br>
<br>
- Why is `switch` restricted to integers?<br></blockquote></div></div></div></div></blockquote><div><br></div></div><div>Same reason C only supports it? <br></div><div class="m_7037060904153723188quoted-text"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="gmail_extra"><div><div class="m_7037060904153723188m_1618877094168381407h5"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
- What is the result of a constant `ptrtoint` and why isn't it a constant integer?<br></blockquote></div></div></div></div></blockquote><div><br></div></div><div>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.<br> <br></div><div class="m_7037060904153723188quoted-text"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="gmail_extra"><div><div class="m_7037060904153723188m_1618877094168381407h5"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
- Is there a way to switch on pointers despite these restrictions?<br></blockquote></div></div></div></div></blockquote><div><br></div></div><div>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? <br><br>--<br></div><div>Mats<br></div><div class="m_7037060904153723188quoted-text"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="gmail_extra"><div><div class="m_7037060904153723188m_1618877094168381407h5"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Thanks.<br>
<br>
------------------------------<wbr>------------------------------<wbr>----<br>
This message was sent using IMP, the Internet Messaging Program.<br>
<br>
<br>
______________________________<wbr>_________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><br>
</blockquote></div><br><br clear="all"><div><br></div></div></div><span class="m_7037060904153723188m_1618877094168381407HOEnZb"><font color="#888888">-- <br><div class="m_7037060904153723188m_1618877094168381407m_-6588936642367253489gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div>Wei-Ren Chen (陳韋任)<br>Homepage: <a href="https://people.cs.nctu.edu.tw/~chenwj" target="_blank">https://people.cs.nctu.edu.tw/<wbr>~chenwj</a></div></div></div>
</font></span></div>
<br>______________________________<wbr>_________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><br>
<br></blockquote></div></div><br></div></div>
<br>______________________________<wbr>_________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><br>
<br></blockquote></div><br></div></div></div></div></div>
</blockquote></div><br></div></div>