<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
</head>
<body>
<p>Hi,</p>
<p>this is an RFC for optional, named parameter tuples for intrinsics. The proposed syntax is:</p>
<p><tt>%z = call @llvm.some.intrinsic(%a, %b) optional_tuple(%x, %y, %z)</tt></p>
<p>where from the perspective of the call site %x, %y and %z are simply additional parameters.<br>
</p>
<p>Optional parameter tuples would be very useful for constrained fp intrinsics and vector predication. Some examples:</p>
<p><span class="transaction-comment" data-sigil="transaction-comment" data-meta="0_125"></p>
<pre class="remarkup-code">; Default fpenv fadd (isomorphic to the fadd instruction)
%z = call double @llvm.fadd(%a, %b)
<span class="transaction-comment" data-sigil="transaction-comment" data-meta="0_125"><pre class="remarkup-code">; Constrained fp add
%x = call double @llvm.fadd(%a, %b) fpenv(metadata !fpround.tonearest, metadata !fpexcept.strict)
</pre></span></pre>
</span>
<p></p>
<pre><span class="transaction-comment" data-sigil="transaction-comment" data-meta="0_125"><pre class="remarkup-code">; Constrained fp add with vector predication (<a class="moz-txt-link-freetext" href="https://reviews.llvm.org/D57504">https://reviews.llvm.org/D57504</a>)
%x = call <256 x double> @llvm.fadd(%a, %b) mask(<256 x i1> %mask), evl(i32 %evl), fpenv(metadata !fpround.tozero, metadata !fpexcept.strict)<span class="transaction-comment" data-sigil="transaction-comment" data-meta="0_125"></span></pre></span></pre>
<p>For constrained fp and VP, we only require a very restricted form of this. That is:</p>
<p>- Tuples are only allowed on intrinsic function calls.<br>
</p>
<p>- There is a builtin list of allowed tuple types (eg tablegen file).<br>
</p>
<p>- Tuple types are opt in: Intrinsics define a list of permissible tuple types.<br>
</p>
<p>- Tuple parameters have default values when a tuple is absent at a call site. Eg, for `<tt>fpenv</tt>` the default fp environment `<tt>fpenv(fpround.tonearest, fpexcept.ignore)</tt>` is implied in the first example above.<br>
</p>
<p><br>
</p>
<p>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>
</p>
<p>There are probably more use cases for this and i'd like to hear about them.<br>
</p>
<p>Looking forward to your feedback</p>
<p>- Simon<br>
</p>
</body>
</html>