https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111156

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |ASSIGNED
           Assignee|unassigned at gcc dot gnu.org      |rguenth at gcc dot 
gnu.org

--- Comment #16 from Richard Biener <rguenth at gcc dot gnu.org> ---
OK, so the missed SLP is a known one:

t.c:8:26: note:   starting SLP discovery for node 0x5d42840
t.c:8:26: note:   Build SLP for _27 = _3 <= 7;
t.c:8:26: note:   precomputed vectype: vector([8,8]) <signed-boolean:2>
t.c:8:26: note:   nunits = [8,8]
t.c:8:26: note:   Build SLP for _14 = _3 > 2;
t.c:8:26: note:   precomputed vectype: vector([8,8]) <signed-boolean:2>
t.c:8:26: note:   nunits = [8,8]
t.c:8:26: missed:   Build SLP failed: different operation in stmt _14 = _3 > 2;
t.c:8:26: missed:   original stmt _27 = _3 <= 7;

I'm not sure we can do this with a single vector stmt but of course using
'two_operator' support might be possible here (do both > and <= and then
blend the result).

I see we end up using .MASK_STORE_LANES in the end but we're not using
load-lanes.

t.c:8:26: note:   ==> examining pattern statement: .MASK_STORE (_5, 8B,
patt_12, pretmp_29);
t.c:8:26: note:   vect_is_simple_use: operand (<signed-boolean:1>) _27, type of
def: internal
t.c:8:26: note:   vect_is_simple_use: vectype vector([16,16])
<signed-boolean:1>
t.c:8:26: note:   vect_is_simple_use: operand *_28, type of def: internal
t.c:8:26: note:   vect_is_simple_use: vectype vector([16,16]) signed char
t.c:8:26: missed:   cannot use vec_mask_len_store_lanes<VNx32QI><VNx16QI>
t.c:8:26: note:   can use vec_mask_store_lanes<VNx32QI><VNx16QI>
t.c:8:26: note:   vect_is_simple_use: operand *_28, type of def: internal
t.c:8:26: missed:   cannot use vec_mask_len_store_lanes<VNx32QI><VNx16QI>
t.c:8:26: note:   can use vec_mask_store_lanes<VNx32QI><VNx16QI>
...
t.c:8:26: note:   ==> examining pattern statement: .MASK_STORE (_9, 8B, patt_4,
pretmp_29);
t.c:8:26: note:   vect_is_simple_use: operand (<signed-boolean:1>) _14, type of
def: internal
t.c:8:26: note:   vect_is_simple_use: vectype vector([16,16])
<signed-boolean:1>
t.c:8:26: note:   vect_is_simple_use: operand *_28, type of def: internal
t.c:8:26: note:   vect_is_simple_use: vectype vector([16,16]) signed char
t.c:8:26: missed:   cannot use vec_mask_len_store_lanes<VNx32QI><VNx16QI>
t.c:8:26: note:   can use vec_mask_store_lanes<VNx32QI><VNx16QI>
t.c:8:26: missed:   cannot use vec_mask_len_store_lanes<VNx32QI><VNx16QI>
t.c:8:26: note:   can use vec_mask_store_lanes<VNx32QI><VNx16QI>

and somehow transform decides to put the two stores together again, probably
missing to verify the masks are the same.

I'll dig a bit more after lunch.

Reply via email to