https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91202
--- Comment #2 from Uroš Bizjak <ubizjak at gmail dot com> --- (In reply to Andrew Pinski from comment #1) > >does not need its operand to be promoted to int on targets that have shift > >instruction > > Yes it does as that is what C says it does ... The standard also says that all narrow operations have to be promoted to int, but we live just fine with: unsigned char bar (unsigned char a, unsigned char b) { return a + b; } that dumps to: --cut here-- bar (unsigned char a, unsigned char b) { unsigned char _3; <bb 2> [local count: 1073741824]: _3 = a_1(D) + b_2(D); return _3; } --cut here-- I fail to see the difference...