https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97239
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Ever confirmed|0 |1 Last reconfirmed| |2020-09-29 Status|UNCONFIRMED |NEW Target Milestone|--- |11.0 --- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- Confirmed. Yet another VEC_COND_EXPR producing masks from masks. This time: 201 gcc_assert (known_eq (GET_MODE_SIZE (mode), GET_MODE_SIZE (cmp_op_mode)) 202 && known_eq (GET_MODE_NUNITS (mode), 203 GET_MODE_NUNITS (cmp_op_mode))); (gdb) p mode $1 = E_HImode (gdb) p cmp_op_mode $2 = E_V16SImode (gdb) p debug_gimple_stmt (stmt) mask__29.155_75 = VEC_COND_EXPR <mask__2.147_61, { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, mask__5.150_67>; vector(16) <signed-boolean:1> mask__2.147; vector(16) <signed-boolean:1> mask__5.150; vector(16) <signed-boolean:1> mask__29.155; mask__2.147_61 = simd.38_17(D) != { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; mask__5.150_67 = simd.38_17(D) == { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; mask__29.155_75 = VEC_COND_EXPR <mask__2.147_61, { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, mask__5.150_67>; so this is simd != 0 ? true : simd == 0 which is just 'true'? That said, it's probably an uphill battle to try to combat all such cases with more foldings ... Rather we need to synthesize mask from mask VEC_COND via bit ops? mask__29.155_75 = mask__2.147_61 | (~mask__2.147_61 & mask__5.150_67); in this case.