https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114070
--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> --- So we vectorize this to _97 = vect__4.15_91 == { 0, 0 }; vect_patt_8.17_98 = VEC_COND_EXPR <_97, { 1, 1 }, { 0, 0 }>; _102 = vect__5.16_93 != { 0, 0 }; vect_patt_19.18_103 = VEC_COND_EXPR <_102, { 1, 1 }, { 0, 0 }>; vect_patt_10.19_104 = vect_patt_8.17_98 | vect_patt_19.18_103; _108 = vect_patt_10.19_104 != { 0, 0 }; vect_patt_7.20_109 = VEC_COND_EXPR <_108, { 1, 1 }, { 0, 0 }>; where the _108/_109 defs are really redundant. VRP2 is then the first pass folding every stmt I think and it transforms this to _97 = vect__4.15_91 == { 0, 0 }; _102 = vect__5.16_93 != { 0, 0 }; _108 = VEC_COND_EXPR <_97, { -1, -1 }, _102>; vect_patt_7.20_109 = VEC_COND_EXPR <_108, { 1, 1 }, { 0, 0 }>; I think this is matching (simplify (op (vec_cond:s @0 @1 @2) @3) (vec_cond @0 (op! @1 @3) (op! @2 @3))) but since this changes the type of the vec_cond it has to verify it's still supported.