On 2 July 2014 08:02, Marc Glisse <marc.gli...@inria.fr> wrote: > On Wed, 2 Jul 2014, Tom de Vries wrote: > >> On 02-07-14 08:23, Marc Glisse wrote: >>> >>> I think it could have used (match_dup 0) instead of operand 1, if there >>> had been only the first alternative. And then the constraint would have been >>> +&. >> >> >> isn't that explicitly listed as unsupported here ( >> https://gcc.gnu.org/onlinedocs/gccint/RTL-Template.html#index-match_005fdup-3244 >> ): >> ... >> Note that match_dup should not be used to tell the compiler that a >> particular register is being used for two operands (example: add that adds >> one register to another; the second register is both an input operand and >> the output operand). Use a matching constraint (see Simple Constraints) for >> those. match_dup is for the cases where one operand is used in two places in >> the template, such as an instruction that computes both a quotient and a >> remainder, where the opcode takes two input operands but the RTL template >> has to refer to each of those twice; once for the quotient pattern and once >> for the remainder pattern.
Note that this uses 'should', not must. That's a shorthand that, in general, you shouldn't do that, although there can be special circumstances where it is valid. The distinction between multiple operands vs. single operands that appears multiple times in the RTL is not even something that makes sense in the framework that the register allocators operate in. Although you'd be well-advised not to use match_dup in your add pattern, because reload needs to generate adds in some circumstances, and it has specific requirements there. The long explanation is that the matching constraint allows the register allocators / reload to fix up the operands to match, so if you want the pattern to be used to implement this operation, and you don't mind some reg-reg moves to be used if that's what it takes, you should use a matching constraint. If, on the other hand, you have a pattern of marginal utiliy, that is not worth the trouble of doing extra reg-reg copies to utilize, a match_dup is better. Such patterns are not all that likely to be recognized by simple matching/combining, but you can generate then in expanders/splitters/peephole2s.