I still use AVR-GCC 4.1.1, it also generates dumb code although not as much (this same code is generated with -Os, -O1, -O2 and -O3):
unsigned short f(unsigned char a, unsigned char b)
{
4c: 99 27 eor r25, r25
4e: 77 27 eor r23, r23
50: 76 2f mov r23, r22
52: 66 27 eor r22, r22
return a | (b << 8);
}
54: 86 2b or r24, r22
56: 97 2b or r25, r23
58: 08 95 ret