Hi, Consider code:
char A; char B; char sum_A_B ( void ) { char sum = A + B; return sum; } Compile it on any backend (for example x86): gcc (SUSE Linux) 4.5.0 20100604 [gcc-4_5-branch revision 160292] gcc -m32 -O2 -S repro.c -fdump-tree-all-lineno-details Now look at repro.c.004t.gimple: sum_A_B () [repro.c : 5:1] { char A.0; unsigned char A.1; char B.2; unsigned char B.3; unsigned char D.1990; char D.1991; char sum; [repro.c : 6:8] A.0 = A; [repro.c : 6:8] A.1 = (unsigned char) A.0; [repro.c : 6:8] B.2 = B; [repro.c : 6:8] B.3 = (unsigned char) B.2; [repro.c : 6:8] D.1990 = A.1 + B.3; [repro.c : 6:8] sum = (char) D.1990; [repro.c : 8:3] D.1991 = sum; [repro.c : 8:3] return D.1991; } It looks really weird. Why gcc promotes char to unsigned char internally? This case is simple repro, but in my production code it is a reason of productivity overhead (vectorizer fails on such promotions). Thanks in advance for any responses. Previous discussion about inline assembler was really helpful. --- With best regards, Konstantin