https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83565
James Clarke <jrtc27 at jrtc27 dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jrtc27 at jrtc27 dot com --- Comment #3 from James Clarke <jrtc27 at jrtc27 dot com> --- Created attachment 42960 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=42960&action=edit rotate test case Jason (in Cc) sent me this example, which is similar. What's basically happening, as far as I understand, is that, since the source for the "extr.u" is being used for a 32-bit integer, it knows that the high 32 bits of the register should be 0, and thus it can always increase the length parameter to 32, but the earlier rotate (which is implemented with a mix4.r, i.e. copy lower 32 bits to upper 32 bits, and a shr.u) doesn't clear out the high 32 bits.