https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97139
--- Comment #3 from Martin Liška <marxin at gcc dot gnu.org> --- Ok, I've got the problem, it's bit later in the function: The diff is: diff -u before.txt after.txt --- before.txt 2020-09-21 15:29:56.462394644 +0200 +++ after.txt 2020-09-21 15:29:48.086453128 +0200 @@ -1,15 +1,24 @@ + 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; - 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; + MEM <vector(4) int> [(int *)&pix + 8B] = vect_patt_185.11470_1966; _492 = active_pps; _493 = _492->constrained_intra_pred_flag; pretmp_2084 = pix.mb_addr; @@ -25,12 +34,12 @@ _511 = *_510; _512 = subblock_x_278 / 2; _513 = _512 * 2; - _515 = _513 + _649; + _515 = _513 + _1943; _516 = (long unsigned int) _515; _517 = _516 * 8; _518 = _511 + _517; _519 = *_518; - _521 = _651 + 4; + _521 = _1942 + 4; _522 = (long unsigned int) _521; _523 = _522 * 4; _524 = _519 + _523; The bad assignmed is + _515 = _513 + _1943; where + _1943 = BIT_FIELD_REF <vect_patt_180.11468_1944, 32, 0>; which is bogus VEC_COND_EXPR <_1946, { 3, 3, 3, 3 }, { 0, 0, 0, 0 }>; while in the original code we do: - _515 = _513 + _649; where _649 is pix.x / 4 So I think correct would be + _515 = _513 + _1967; ?