https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82713
--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
My bet is boolean vectors with QI/HImode. But eventually the vectorizer uses
vector_load on sth not being a vector load as well. Yeah...
/* Without looking at the actual initializer a vector of
constants can be implemented as load from the constant pool.
??? We need to pass down stmt_info for a vector type
even if it points to the wrong stmt. */
if (dt == vect_constant_def)
record_stmt_cost (prologue_cost_vec, 1, vector_load,
stmt_info, 0, vect_prologue);
so the stmt vector type is
<vector_type 0x7ffff6695690
type <boolean_type 0x7ffff66955e8 public QI
size <integer_cst 0x7ffff6891dc8 constant 8>
unit-size <integer_cst 0x7ffff6891de0 constant 1>
align:8 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type
0x7ffff66955e8 precision:1 min <integer_cst 0x7ffff6a8b918 -1> max <integer_cst
0x7ffff6a8b948 0>>
HI
size <integer_cst 0x7ffff6891d20 type <integer_type 0x7ffff68a90a8
bitsizetype> constant 128>
unit-size <integer_cst 0x7ffff6891d38 type <integer_type 0x7ffff68a9000
sizetype> constant 16>
align:128 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type
0x7ffff6695690 nunits:16>
as I said. The stmt we're looking at is
_2 = _1 <= 10;
so for costing the proper vector type would be not the boolean vector type
but the vector type of the operand.
Cost of constant handling in SLP is a hack (somewhat). Given we're
using the new & shiny cost interface here there's no way to stuff down
the "proper" vector type. Not passing stmt_info down would make the
constant case work but the external case quite pointless.
As said, you can't expect the "correct" vector type to be passed down
consistently :/