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 .