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 ;)

Reply via email to