https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103431
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Ever confirmed|0 |1 Status|UNCONFIRMED |NEW Component|rtl-optimization |middle-end Last reconfirmed| |2021-11-25 --- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Confirmed. reduced testcase (removing the globals): typedef unsigned __int128 B; __attribute__((noipa)) void f(unsigned short a) { B b = 5; int size = (sizeof(b)*8)-1; a /= 0xfffffffd; B b1 = (b << (a & size) | b >> (-(a & size) & size)); if (b1 != 5) __builtin_abort (); } int main (void) { f(0); } ----- CUT --- The gimple level does not change. In GCC 11 and the trunk, we have: _1 = (unsigned intD.9) a_8(D); _2 = _1 / 4294967293; a_9 = (short unsigned intD.18) _2; _13 = a_9 & 127; _3 = (intD.6) _13; b1_10 = 5 r<< _3; if (b1_10 != 5) It looks like the expansion from gimple to RTL of the rotate is different between the two versions.