https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91940
--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> --- Another option is to elide the promotion? int foo (unsigned short x) { return __builtin_bswap16 (x); } return (int) __builtin_bswap16 ((int) x); but BUILT_IN_BSWAP16 is BT_FN_UINT16_UINT16, not sure why there's a truncation missing?! Is that the frontend "promote according to ABI" thing? Yeah, I guess so :/