https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77621
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Target| |x86_64-*-*, i?86-*-* Status|NEW |ASSIGNED CC| |uros at gcc dot gnu.org Assignee|unassigned at gcc dot gnu.org |rguenth at gcc dot gnu.org --- Comment #7 from Richard Biener <rguenth at gcc dot gnu.org> --- Mine. The issue is that we have a non-vectorizable load as part of an interleaving group (that stmt is later not used in the SLP). But the odd part of this testcase is that we have t.c:7:1: note: not vectorized: no vectype for stmt: _51 = *x_18(D); scalar_type: double t.c:7:1: note: got vectype for stmt: _32 = *_33; vector(4) int t.c:7:1: note: got vectype for stmt: _25 = *_28; vector(2) double this seems to be a backend issue with targetm.vectorize.preferred_simd_mode (DFmode) which seems to return SImode (!?) but once we fixed vector size by looking for a SImode vector mode (V4SImode) mode_for_vector happily returns V2DFmode for us to use. So it seems V2DFmode is available but discouraged via the above hook when tuning for atom. Indeed: static machine_mode ix86_preferred_simd_mode (machine_mode mode) { ... case DFmode: if (!TARGET_VECTORIZE_DOUBLE) return word_mode; but targetm.vector_mode_supported_p happily returns true for V2DFmode. This means the above is _not_ a good way to achieve what it tries to (make the vectorizer not use V2DFmode). A more proper way would be to handle this in ix86_add_stmt_cost, increasing the cost for double type vectorization. Nevertheless the vectorizer shouldn't ICE on this inconsistency, I'll see what it takes to "fix" it on the vectorizer side.