https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115406
--- Comment #3 from Hongtao Liu <liuhongt at gcc dot gnu.org> --- typedef __attribute__((__vector_size__ (1))) char V; char foo (V v) { return ((V) v == v)[0]; } int main () { char x = foo ((V) { }); if (x != -1) __builtin_abort (); } w/ vcond_mask_qiqi, it's not lowered by veclower, and we get char foo (V v) { vector(1) signed char D.5142; char D.5141; vector(1) <signed-boolean:8> _1; vector(1) signed char _2; char _5; <bb 2> : _1 = { -1 }; _2 = VEC_COND_EXPR <_1, { -1 }, { 0 }>; D.5142 = _2; _5 = VIEW_CONVERT_EXPR<char>(D.5142); <bb 3> : <L0>: return _5; } But it's further simplified to char foo (V v) { vector(1) signed char D.3765; char D.3764; vector(1) <signed-boolean:8> _1; vector(1) signed char _2; char _5; <bb 2> : _1 = { -1 }; _2 = VIEW_CONVERT_EXPR<vector(1) signed char>(_1); D.3765 = _2; _5 = VIEW_CONVERT_EXPR<char>(D.3765); <bb 3> : <L0>: return _5; } by isel and for _2 = VIEW_CONVERT_EXPR<vector(1) signed char>(_1); we explicitly clear the upper bits due to PR113576, and then we get 1 hit the abort. It sound to me _1 = { -1 }; _2 = VEC_COND_EXPR <_1, { -1 }, { 0 }>; shouldn't be simplified to _2 = VIEW_CONVERT_EXPR<vector(1) signed char>(_1); when nunits is less than mode precision since the upper bit will be cleared.