https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113607
--- Comment #22 from Andrew Pinski <pinskia at gcc dot gnu.org> --- (In reply to Robin Dapp from comment #19) > What seems odd to me is that in fre5 we simplify > > _429 = .COND_SHL (mask_patt_205.47_276, vect_cst__262, vect_cst__262, { 0, > ... }); > vect_prephitmp_129.51_282 = _429; > vect_iftmp.55_287 = VEC_COND_EXPR <mask_patt_209.54_286, > vect_prephitmp_129.51_282, vect_cst__262>; 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] Which should have folded into: tmp_ = mask_patt_205.47_276 | ~mask_patt_209.54_286; _429 = .COND_SHL (tmp_, vect_cst__262, vect_cst__262, { 0, ... }); What is the definition of mask_patt_209.54_286 and mask_patt_205.47_276? is `mask_patt_209.54_286 = ~mask_patt_205.47_276` ? If so then this is a valid transformation I think.