https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113607
--- Comment #23 from Robin Dapp <rdapp at gcc dot gnu.org> --- > this is: > > _429 = mask_patt_205.47_276[i] ? vect_cst__262[i] : (vect_cst__262 << > {0,..})[i]; > vect_iftmp.55_287 = mask_patt_209.54_286[i] ? _429 [i] : vect_cst__262[i] But isn't it rather _429 = mask_patt_205.47_276[i] ? (vect_cst__262[i] << vect_cst__262[i]) : {0,..})[i]? The else should be the last operand, shouldn't it? On aarch64 we don't seem to emit a COND_SHL therefore this particular situation does not occur. However the simplification was introduced for aarch64: (for cond_op (COND_BINARY) (simplify (vec_cond @0 (cond_op:s @1 @2 @3 @4) @3) (cond_op (bit_and @1 @0) @2 @3 @4))) It is supposed to simplify (in gcc.target/aarch64/sve/pre_cond_share_1.c) _256 = .COND_MUL (mask__108.48_193, vect_iftmp.45_187, vect_cst__190, { 0.0, ... }); vect_prephitmp_151.50_197 = VEC_COND_EXPR <mask__101.46_189, _256, vect_cst__190>; into COND_MUL (mask108 & mask101, vect_iftmp.45_187, vect_cst__190, { 0.0, ... }); But that doesn't look valid to me either. No matter what _256 is, the result for !mask101 should be vect_cst__190 and not 0.0.