<div dir="ltr"><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jun 22, 2021 at 6:16 PM Kaylor, Andrew via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">





<div style="overflow-wrap: break-word;" lang="EN-US">
<div class="gmail-m_6098019412591949181WordSection1">
<p class="MsoNormal">Honestly, I didn’t (and still don’t) understand enough about the intrinsics Craig mentioned to even be sure they were analogous to the case I brought up. It seemed like they might be more interested in debug types than IR types and may
 or may not be going down the same paths of reasoning, but I just don’t understand what the intrinsics are doing.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">We’re scrambling to get our out-of-tree code caught up with the opaque pointer transition. I think the scatter/gather intrinsics are likely to be our first useful overlap with the in-tree work to be done, though now that I’ve thought about
 it a bit more, I think the type in that can just be inferred from non-pointer arguments. In any case, I guess talking about it and agreeing on an approach is a good first step.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">I started trying to mock up some IR for how this might work, but I wasn’t entirely happy with it. Specifically, how do you describe an IR type in metadata. We could use an undef value in the metadata, similar to what Arthur proposed as
 an argument, but that only moves the ugliness. This is kind of what I was thinking<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">define void @f() {<u></u><u></u></p>
<p class="MsoNormal">  ptr %p = <however we got %p><u></u><u></u></p>
<p class="MsoNormal">  call void @llvm.some.intrinsic(ptr %p, metadata !1)<u></u><u></u></p>
<p class="MsoNormal">  <…><u></u><u></u></p>
<p class="MsoNormal">  return void<u></u><u></u></p>
<p class="MsoNormal">}<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">define void @llvm.some.intrinsic(ptr, metadata)<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">%MyElementTy = type { <whatever> }<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">!1 = !{ %MyElementTy undef }<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">I guess that would work, but I don’t really like it. I looked at the way TBAA and debug info describe types, but that’s not describing the IR type and so it seems simultaneously fragile and too verbose. Is there a better way to do this?
 What about introducing a parameter attribute that would be considered required for the intrinsic? Something like this:<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">define void @f() {<u></u><u></u></p>
<p class="MsoNormal">  ptr %p = <however we got %p><u></u><u></u></p>
<p class="MsoNormal">  call void @llvm.some.intrinsic(ptr elementtype(%MyElementTy) %p)<u></u><u></u></p>
<p class="MsoNormal">  <…><u></u><u></u></p>
<p class="MsoNormal">  return void<u></u><u></u></p>
<p class="MsoNormal">}<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">; Requires ‘elementype’ parameter attribute<u></u><u></u></p>
<p class="MsoNormal">define void @llvm.some.intrinsic(ptr)<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">%MyElementTy = type { <whatever> }<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Does that feel like a step backward to you? I don’t know how hard it would be for front end’s to generate something like that, but it hasn’t the benefit that the elementtype would have intentional and well-defined semantic meaning.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Thanks,<u></u><u></u></p>
<p class="MsoNormal">Andy</p></div></div></blockquote><div><br></div><div>For the record, we did end up adding the elementtype() attribute for use by intrinsics in <a href="https://reviews.llvm.org/D105407">https://reviews.llvm.org/D105407</a> / <a href="https://reviews.llvm.org/D106008">https://reviews.llvm.org/D106008</a> and a sample usage for BPF intrinsics in <a href="https://reviews.llvm.org/D106184">https://reviews.llvm.org/D106184</a>.</div><div><br></div><div>Would be great if you can confirm whether this works for your use-case as well!<br></div><div><br></div><div>Regards,</div><div>Nikita<br> </div></div></div>