<div dir="auto">+1 for operand bundles, I think they are what you are looking for.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Feb 12, 2020, 6:33 AM Johannes Doerfert 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:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 02/12, Simon Moll via llvm-dev wrote:<br>
> Hi,<br>
> <br>
> this is an RFC for optional, named parameter tuples for intrinsics. The proposed syntax is:<br>
> <br>
> %z = call @llvm.some.intrinsic(%a, %b) optional_tuple(%x, %y, %z)<br>
> <br>
> where from the perspective of the call site %x, %y and %z are simply additional parameters.<br>
> <br>
> Optional parameter tuples would be very useful for constrained fp intrinsics and vector predication. Some examples:<br>
> <br>
> ; Default fpenv fadd (isomorphic to the fadd instruction)<br>
> %z = call double @llvm.fadd(%a, %b)<br>
> <br>
> <br>
> ; Constrained fp add<br>
> %x = call double @llvm.fadd(%a, %b) fpenv(metadata !fpround.tonearest, metadata !fpexcept.strict)<br>
> <br>
> <br>
> ; Constrained fp add with vector predication (<a href="https://reviews.llvm.org/D57504" rel="noreferrer noreferrer" target="_blank">https://reviews.llvm.org/D57504</a>)<br>
> %x = call <256 x double> @llvm.fadd(%a, %b) mask(<256 x i1> %mask), evl(i32 %evl), fpenv(metadata !fpround.tozero, metadata !fpexcept.strict)<br>
> <br>
> For constrained fp and VP, we only require a very restricted form of this. That is:<br>
> <br>
> - Tuples are only allowed on intrinsic function calls.<br>
> <br>
> - There is a builtin list of allowed tuple types (eg tablegen file).<br>
> <br>
> - Tuple types are opt in: Intrinsics define a list of permissible tuple types.<br>
> <br>
> - Tuple parameters have default values when a tuple is absent at a call site. Eg, for `fpenv` the default fp environment `fpenv(fpround.tonearest, fpexcept.ignore)` is implied in the first example above.<br>
> <br>
> <br>
> Btw, different to operand bundles, optional parameter tuples are much more restricted and do not imply side effects of any kind. We might want to re-use the OpBundle logic for this though.<br>
<br>
I feel this would be the right way forward, especially since your "tuple names" are basically operand bundle tags.<br>
<br>
You could express<br>
   %z = call @llvm.some.intrinsic(%a, %b) optional_tuple(%x, %y, %z)<br>
as<br>
   %z = call @llvm.some.intrinsic(%a, %b) ["optional_tuple"(%x, %y, %z)]<br>
or<br>
   %x = call <256 x double> @llvm.fadd(%a, %b) mask(<256 x i1> %mask), evl(i32 %evl), fpenv(metadata !fpround.tozero, metadata !fpexcept.strict)<br>
as<br>
   %x = call <256 x double> @llvm.fadd(%a, %b) ["mask"(<256 x i1> %mask), "evl"(i32 %evl), "fpenv"(metadata !fpround.tozero, metadata !fpexcept.strict)]<br>
<br>
Operand bundles tags can come with special semantics so we can teach<br>
parts to not "assume the worst" for such uses. I say this also because<br>
we are already heading that way for `llvm.assume`:<br>
  <a href="https://reviews.llvm.org/D74209" rel="noreferrer noreferrer" target="_blank">https://reviews.llvm.org/D74209</a><br>
<br>
Cheers,<br>
  Johannes<br>
<br>
> There are probably more use cases for this and i'd like to hear about them.<br>
> <br>
> Looking forward to your feedback<br>
> <br>
> - Simon<br>
<br>
> _______________________________________________<br>
> LLVM Developers mailing list<br>
> <a href="mailto:llvm-dev@lists.llvm.org" target="_blank" rel="noreferrer">llvm-dev@lists.llvm.org</a><br>
> <a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
<br>
<br>
-- <br>
<br>
Johannes Doerfert<br>
Researcher<br>
<br>
Argonne National Laboratory<br>
Lemont, IL 60439, USA<br>
<br>
<a href="mailto:jdoerfert@anl.gov" target="_blank" rel="noreferrer">jdoerfert@anl.gov</a><br>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank" rel="noreferrer">llvm-dev@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div>