[llvm-dev] RFC: token arguments and operand bundles

Philip Reames via llvm-dev llvm-dev at lists.llvm.org
Mon Nov 18 13:52:44 PST 2019

I'm going to mostly stay out of the floating point specifics, but I want 
to point out a few alternative approaches which have been used elsewhere 
in the past.

We have the ability to require a intrinsic function argument to be a 
constant.  We have support for annotations printed during IR 
serialization.  Putting those together, we could use an argument 
encoding + annotation printer to field something like:

%sum = call double @llvm.experimental.constrained.fadd(double %x,
                                                        double %y, int 
0, int 1) ;; fpround.dynamic + fpexcept.strict

If we didn't want to have token types involved, we could use operand 
bundles and a custom annotator.  We'd get something like:

  %sum = call double @llvm.experimental2.constrained.fadd(double %x,
                                                         double %y) [ 
“fenv”(i32 0, i32 1)] ;; fpround.dynamic + fpexcept.strict

</end alternatives>

Personally, I'd try to avoid token types here.  Token types are 
relatively ill defined, and most of the cases we've used them have been 
a proxy for multiple variable return.  In retrospect, I wish we'd done 
multiple variable return e.g. statepoints.


On 11/14/19 11:39 AM, Kaylor, Andrew via llvm-dev wrote:
> Hello everyone,
> I’ve just uploaded a patch (https://reviews.llvm.org/D70261) to 
> introduce a could of new token types to be used with constrained 
> floating point intrinsics and, optionally, vector predicated 
> intrinsics. These intrinsics may not be of interest to many of you, 
> but I have a more general question.
> I would like some general feedback on the way I am proposing to use 
> token arguments and operand bundles. I have an incomplete 
> understanding of how these are intended to be used, and I want to make 
> sure what I have in mind is consistent with the philosophy behind them.
> Currently, the constrained floating point intrinsics require string 
> metadata arguments to describe the rounding mode and exception 
> semantics. These “arguments” are really providing information to the 
> optimizer about what it can and cannot assume when acting on these 
> intrinsics. The rounding mode argument potentially overrides the 
> default optimizer assumption that the “to nearest” rounding mode is in 
> use, and the exception behavior argument overrides the default 
> optimizer assumption that floating point operations have no side 
> effects. I’ve never liked the use of strings here, and the fact that 
> these arguments are not actually inputs to the operation represented 
> by the intrinsic seems vaguely wrong.
> A typical call to a current intrinsic looks like this:
> *%sum = call double @llvm*.experimental.constrained.fadd(double %x,
> double %y,
> Metadata “fpround.dynamic”,
>       Metadata “fpexcept.strict”)
> The idea I am pursuing in my patch is to replace these metadata 
> arguments with optional operand bundles, “fpround” and “fpexcept”. If 
> the operand bundles are present, they would mean what the arguments 
> currently mean. If not, the default assumption is allowed. A typical 
> call to a constrained intrinsic would look like this:
> *%sum = call double @llvm*.experimental2.constrained.fadd(double %x,
>  double %y) [ “fpround”(token rmDynamic),
>                     “fpexcept”(token ebStrict) ]
> Does that seem like a valid use of tokens and operand bundles? Does it 
> seem better than the current approach?
> Thanks,
> Andy
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://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/20191118/fd85f93d/attachment.html>

More information about the llvm-dev mailing list