http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50788
--- Comment #6 from Eric Botcazou <ebotcazou at gcc dot gnu.org> 2011-10-23 11:27:22 UTC --- > It is OK for expanders to have match_dup. We just don't want to have > post-reload passes to trip on double-output to the same register. No disagreement. I just wanted to state the argument for the + approach, but the manual clearly points to the match_operand approach here instead. > BTW: There is another spot with similar problem: > > @@ -8011,7 +8011,8 @@ > [(set (mem:V16QI (match_operand:P 0 "register_operand" "D")) > (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "x") > (match_operand:V16QI 2 "register_operand" "x") > - (mem:V16QI (match_dup 0))] > + (mem:V16QI > + (match_operand:P 3 "register_operand" "0"))] > UNSPEC_MASKMOV))] > "TARGET_SSE2" > "%vmaskmovdqu\t{%2, %1|%1, %2}" > > While compilation won't break here, IMO we should tell the reload that we have > matching constraint. Indeed.