https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82285
--- Comment #2 from Martin Liška <marxin at gcc dot gnu.org> ---
Simplified test-case:
$ cat ~/Programming/testcases/pr82285.c
#define MAX (16)
enum tst {
first = 0,
second = 1
};
int
main (void)
{
enum tst data[MAX];
for (unsigned i = 0; i < MAX; i++)
data[i] = (i < 5 ? second : first);
if (data[2] != second) {
__builtin_abort ();
}
return 0;
}
Problem is that vectorizes does:
vect_cst__20 = { 4, 4, 4, 4 };
# vect_vec_iv_.0_13 = PHI <vect_vec_iv_.0_5(4), { 0, 1, 2, 3 }(2)>
mask__1.1_21 = vect_vec_iv_.0_13 <= vect_cst__20;
vect__2.2_25 = VIEW_CONVERT_EXPR<vector(4) unsigned int>(mask__1.1_21);
MEM[(tst *)vectp_data.3_29] = vect__2.2_25;
which is folded in dom3 to:
gimple_simplified to mask__1.1_21 = { -1, -1, -1, -1 };
Then we end up with:
MEM[(tst *)&data] = { 4294967295, 4294967295, 4294967295, 4294967295 };
It's related to fact that vector of true values is represented as {-1,..., -1}.
Leaving to someone skilled in vectorizer ;)