On November 26, 2014 8:33:52 PM CET, Jakub Jelinek <ja...@redhat.com> wrote: >On Wed, Nov 26, 2014 at 02:25:54PM -0500, Jason Merrill wrote: >> How about converting the rhs to unsigned int if it is already >unsigned? > >That is fine. I'm just worried about the casts to wider types. >So perhaps just promote and cast to int if the promoted type is >signed or unsigned if it is unsigned? > >E.g. if you have >long long foo (long long x, long long y, long long z) >{ > return x << (y * z); >} >and long long multiplication requires say a libcall, while >int * int can be expanded inline, using long long for shift >count penalizes the code unnecessarily. Ditto for >long long foo (void) __attribute__((const)); >int >bar (int x) >{ > return x << (foo () & ~0xffffffffLL); >} >and similar. I know, we are running here back into the sadly :( >still missing type demotion and promotion passes, but changing this >now when those passes are missing can only hurt code.
Well, if you want to aggressively prune unused bits then you could "back-propagate" the shift count value-range. And note that all the frontend shorten-optimizations should move to the middle-end. That said, instead of casting to int we could cast to unsigned char... Richard. > > Jakub