https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94643
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Ever confirmed|0 |1 Keywords| |missed-optimization Status|UNCONFIRMED |NEW Last reconfirmed| |2020-04-18 Summary|[x86_64] gratuitous sign |[sign extension of |extension of nonnegative |nonnegative value from 32 |value from 32 to 64 bits |to 64 bits Severity|normal |enhancement Component|target |tree-optimization --- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> --- This could be done on the tree level: Given (where _1 is short unsigned): _2 = (int) _1; _3 = _2 * 16; _6 = (uint64_t) _3; We should be able to convert this to: _7 = (uint64_t) _1; _6 = _7 << 4; But there might be a few steps inbetween. I will let someone decide on how it would work. This is true even on AARCH64: adrp x1, a add x1, x1, :lo12:a ldrh w0, [x1, w0, sxtw 1] ubfiz x0, x0, 4, 16 ret But ubfiz is the the zero extend and shift in one instruction so it does not matter in the end ...