This is the mail archive of the
mailing list for the GCC project.
Re: combination of read/write and earlyclobber constraint modifier
- From: Jeff Law <law at redhat dot com>
- To: gcc at gcc dot gnu dot org, Tom de Vries <Tom_deVries at mentor dot com>
- Cc: Vladimir Makarov <vmakarov at redhat dot com>
- Date: Wed, 02 Jul 2014 09:52:47 -0600
- Subject: Re: combination of read/write and earlyclobber constraint modifier
- Authentication-results: sourceware.org; auth=none
- References: <53B30B96 dot 2000603 at mentor dot com> <53B31041 dot 8060608 at redhat dot com> <alpine dot DEB dot 2 dot 10 dot 1407012155000 dot 2640 at laptop-mg dot saclay dot inria dot fr> <53B32D3A dot 1030700 at mentor dot com> <alpine dot DEB dot 2 dot 10 dot 1407020800530 dot 2059 at laptop-mg dot saclay dot inria dot fr>
On 07/02/14 00:23, Marc Glisse wrote:
Note carefully that match_dup requires the exact same operand or the
insn will not be recognized. A matching constraint allows different
pseudos and relies upon the register allocator to assign the different
pseudos to the same hard register.
On Tue, 1 Jul 2014, Tom de Vries wrote:
On 01-07-14 21:58, Marc Glisse wrote:
So my question is: is the combination of '&' and '+' supported ? If
what is the exact semantics ? If not, should we warn or give an
I don't think we can define any reasonable semantics for &+. My
recommendation would be for this to be considered a hard error.
Uh? The doc explicitly says "An input operand can be tied to an
operand" and goes on to explain why that is useful. It avoids using
register for other input when they are identical.
That part of the doc refers to the mulsi3 insn for ARM as example:
;; Use `&' and then `0' to prevent the operands 0 and 1 being the same
[(set (match_operand:SI 0 "s_register_operand" "=&r,&r")
(mult:SI (match_operand:SI 2 "s_register_operand" "r,r")
(match_operand:SI 1 "s_register_operand" "%0,r")))]
"TARGET_32BIT && !arm_arch6"
"mul%?\\t%0, %2, %1"
[(set_attr "type" "mul")
(set_attr "predicable" "yes")]
Note that there's no combination of & and + here.
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
It sometimes happens when a define_insn is converted into a
define_expand -- folks just forget to remove the pointless constraints.
(by the way, in the same aarch64-simd.md file, I noticed some
define_expand with constraints, that looks strange)