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?