https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110557
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Keywords|needs-bisection | Last reconfirmed| |2023-07-05 Ever confirmed|0 |1 Component|target |tree-optimization --- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> --- ifcvt produces correctly the sign extend: <unnamed-signed:56> _ifc__18; _3 = a_14(D) + _2; _ifc__22 = _3->D.3439; _ifc__18 = BIT_FIELD_REF <_ifc__22, 56, 8>; _5 = (long long int) _ifc__18; _6 = _5 * -4; _7 = (long unsigned int) _6; _15 = MAX_EXPR <_7, size_19>; But then the vectorizer misses that: ``` _ifc__18 = BIT_FIELD_REF <_ifc__22, 56, 8>; vect_patt_13.20_76 = vect__ifc__22.19_74 & { 18446744073709551360, 18446744073709551360, 18446744073709551360, 18446744073709551360 }; vect_patt_10.21_77 = vect_patt_13.20_76 >> 8; vect_patt_9.22_78 = VIEW_CONVERT_EXPR<vector(4) long long int>(vect_patt_10.21_77); _5 = (long long int) _ifc__18; vect__6.23_80 = vect_patt_9.22_78 * { -4, -4, -4, -4 }; _6 = _5 * -4; ``` vect_patt_9.22_78 should have been sign extended ... With the C front-end, we get: ``` <unnamed-signed:56> _24; <unnamed-signed:56> _23; _24 = _25->y; _23 = _24 * -4; _22 = (long unsigned int) _23; ``` Which the vectorizer does not understand could be prompted to 64bit and then truncated so it does not vectorize it. r13-3219-g25413fdb2ac24933214123e24ba16502 .