https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97139

--- Comment #2 from Martin Liška <marxin at gcc dot gnu.org> ---
So one can reproduce it with current master with:
-O3 -march=znver2 -g -flto=auto -flto-partition=one

where first bad debug counter value is:
-fdbg-cnt=vect_slp:357

The change is:

before:
  _648 = pix.x;
  _649 = _648 / 4;
  pix.x = _649;
  _650 = pix.y;
  _651 = _650 / 4;
  pix.y = _651;
  _652 = pix.pos_x;
  _653 = _652 / 4;
  pix.pos_x = _653;
  _654 = pix.pos_y;
  _655 = _654 / 4;
  pix.pos_y = _655;
...

after:

  vect__648.11467_1941 = MEM <vector(4) int> [(int *)&pix + 8B];
  _1946 = vect__648.11467_1941 < { 0, 0, 0, 0 };
  vect_patt_180.11468_1944 = VEC_COND_EXPR <_1946, { 3, 3, 3, 3 }, { 0, 0, 0, 0
}>;
  vect_patt_182.11469_1947 = vect__648.11467_1941 + vect_patt_180.11468_1944;
  vect_patt_185.11470_1966 = vect_patt_182.11469_1947 >> 2;
  _1967 = BIT_FIELD_REF <vect_patt_185.11470_1966, 32, 0>;
  _1968 = BIT_FIELD_REF <vect_patt_185.11470_1966, 32, 32>;
  _1950 = BIT_FIELD_REF <vect_patt_182.11469_1947, 32, 0>;
  _1965 = BIT_FIELD_REF <vect_patt_182.11469_1947, 32, 32>;
  _1943 = BIT_FIELD_REF <vect_patt_180.11468_1944, 32, 0>;
  _1942 = BIT_FIELD_REF <vect_patt_180.11468_1944, 32, 32>;
  _1945 = &pix.x + 4;
  _648 = pix.x;
  _649 = _648 / 4;
  _650 = pix.y;
  _651 = _650 / 4;
  _652 = pix.pos_x;
  _653 = _652 / 4;
  _654 = pix.pos_y;
  _655 = _654 / 4;
  MEM <vector(4) int> [(int *)&pix + 8B] = vect_patt_185.11470_1966;
...

So a vector shift by 2 instead of division by 4. It looks fine (assuming the
trick for negative numbers is correct).
@Richi: can you please dig into it?

Reply via email to