http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50788
Eric Botcazou <ebotcazou at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|ASSIGNED |NEW CC| |ebotcazou at gcc dot | |gnu.org, uros at gcc dot | |gnu.org Component|rtl-optimization |target AssignedTo|ebotcazou at gcc dot |unassigned at gcc dot |gnu.org |gnu.org --- Comment #3 from Eric Botcazou <ebotcazou at gcc dot gnu.org> 2011-10-22 20:41:53 UTC --- This appears to be a problem in the AVX maskmov patterns: operand 0 is seen as a double output operand. The solution is either to use a match_operand for the input with constraint 0 or to use '+' instead of '=' in the constraint. The former is the preferred approach in this case though: Index: config/i386/sse.md =================================================================== --- config/i386/sse.md (revision 180235) +++ config/i386/sse.md (working copy) @@ -12298,7 +12298,7 @@ (define_insn "*avx2_maskmov<ssemodesuffi (unspec:VI48_AVX2 [(match_operand:<sseintvecmode> 1 "register_operand" "x,x") (match_operand:VI48_AVX2 2 "nonimmediate_operand" "m,x") - (match_dup 0)] + (match_operand:VI48_AVX2 3 "nonimmediate_operand" "0,0")] UNSPEC_MASKMOV))] "TARGET_AVX2 && (REG_P (operands[0]) == MEM_P (operands[2]))" @@ -12313,7 +12313,7 @@ (define_insn "*avx_maskmov<ssemodesuffix (unspec:VF [(match_operand:<sseintvecmode> 1 "register_operand" "x,x") (match_operand:VF 2 "nonimmediate_operand" "m,x") - (match_dup 0)] + (match_operand:VF 3 "nonimmediate_operand" "0,0")] UNSPEC_MASKMOV))] "TARGET_AVX && (REG_P (operands[0]) == MEM_P (operands[2]))" but the expanders have match_dup. Uros, would you mind taking it over? TIA.