On Mon, Jun 13, 2011 at 5:17 AM, Mike Stump <mikest...@comcast.net> wrote: > On Jun 12, 2011, at 3:55 AM, Richard Guenther wrote: >> In almost all cases(*) the need for a lvalue VIEW_CONVERT_EXPR can be avoided >> by moving the VIEW_CONVERT_EXPR to the rvalue assigned too it. Remember that >> VIEW_CONVERT_EXPR always conver the full object and are not allowed to >> change sizes. >> >> So, do you have an example? > > Sure, take a divmod type of instruction.[1] It has two outputs, a div and a > mod. The instruction operates on registers, and produces two completely > independent values. But really, it is a general features of the built-in > mechanism that Kenny and I are working on that some people would like to > reuse for other ports. The general feature is that one can declare any > argument to a built-in to be input only, output only or input/output. This > nicely matches what I think quite of lot of machines do for assembly language > semantics. The support isn't to match my machine, but rather to support > building a port, in which 1 or more instructions have such parameters. > Requiring memory is a non-starter, and in fact, we already have a scheme for > memory_operand type things for the instructions that take memory. The scheme > used for them is borrowed from C++, where we just declare that the built-in > takes a reference type. This reuses most of the code paths from C++ and it > seems to work nicely. I'd be tempting to use it for register references, > but, in my current scheme for registers, I support data flow in, out and > in/out at the tree level and at the rtl level. We believe this is nice from > an optimizing perspective, and probably required to get the warnings about > using uninitialized variables correct.
That's not exactly an example - I can't think of how you want or need to use VIEW_CONVERT_EXPRs to implement said divmod instruction or why you would need anything special for the _argument_ of said instruction. An instruction or call with multiple outputs would simply be something like { div_1, mod_2 } = __builtin_divmod (arg_3); with two SSA defs. A nice representation for the tree for { div_1, mod_2 } remains to be found (if it should be a single tree at all, or possibly multiple ones). We already play tricks for sincos for example via tem_1 = __builtin_cexpi (arg_2); sin_3 = REALPART_EXPR <tem_1>; cos_4 = IMAGPART_EXPR <tem_1>; which avoids the two defs by using a single def which is then decomposed. So, can you elaborate a bit more on what you want to do with special argument kinds? Elaborate with an actual example, not words. Thanks, Richard.