https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77621
--- Comment #18 from rguenther at suse dot de <rguenther at suse dot de> --- On Tue, 20 Sep 2016, ubizjak at gmail dot com wrote: > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77621 > > --- Comment #17 from Uroš Bizjak <ubizjak at gmail dot com> --- > (In reply to rguent...@suse.de from comment #16) > > > At least you won't get called for the scalar loop copy and you have > > definite acccess to vectype. > > Thanks for the hint, the following patch is effective as well: Looks good to me. > --cut here-- > diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c > index 60b81bb..9d72681 100644 > --- a/gcc/config/i386/i386.c > +++ b/gcc/config/i386/i386.c > @@ -49554,9 +49554,7 @@ ix86_preferred_simd_mode (machine_mode mode) > return V4SFmode; > > case DFmode: > - if (!TARGET_VECTORIZE_DOUBLE) > - return word_mode; > - else if (TARGET_AVX512F) > + if (TARGET_AVX512F) > return V8DFmode; > else if (TARGET_AVX && !TARGET_PREFER_AVX128) > return V4DFmode; > @@ -49647,6 +49645,11 @@ ix86_add_stmt_cost (void *data, int count, enum > vect_cost_for_stmt kind, > tree vectype = stmt_info ? stmt_vectype (stmt_info) : NULL_TREE; > int stmt_cost = ix86_builtin_vectorization_cost (kind, vectype, misalign); > > + /* Penalize DFmode vector operations for !TARGET_VECTORIZE_DOUBLE. */ > + if (kind == vector_stmt && !TARGET_VECTORIZE_DOUBLE > + && vectype && GET_MODE_INNER (TYPE_MODE (vectype)) == DFmode) > + stmt_cost *= 5; /* FIXME: The value here is arbitrary. */ > + > /* Statements in an inner loop relative to the loop being > vectorized are weighted more heavily. The value here is > arbitrary and could potentially be improved with analysis. */ > --cut here--