diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp index 98b54dfb1651f..aec170ae55706 100644 --- a/clang/lib/CodeGen/TargetInfo.cpp +++ b/clang/lib/CodeGen/TargetInfo.cpp @@ -8445,6 +8445,10 @@ class AVRABIInfo : public DefaultABIInfo { LargeRet = true; return getNaturalAlignIndirect(Ty); } + // An i8 return value should not be extended to i16, since AVR has 8-bit + // registers. + if (Ty->isIntegralOrEnumerationType() && getContext().getTypeSize(Ty) <= 8) + return ABIArgInfo::getDirect(); // Otherwise we follow the default way which is compatible. return DefaultABIInfo::classifyReturnType(Ty); } diff --git a/clang/test/CodeGen/avr/avr-builtins.c b/clang/test/CodeGen/avr/avr-builtins.c index bdecff3fc38a8..7c2c424848080 100644 --- a/clang/test/CodeGen/avr/avr-builtins.c +++ b/clang/test/CodeGen/avr/avr-builtins.c @@ -8,7 +8,7 @@ unsigned char bitrev8(unsigned char data) { return __builtin_bitreverse8(data); } -// CHECK: define{{.*}} zeroext i8 @bitrev8 +// CHECK: define{{.*}} i8 @bitrev8 // CHECK: i8 @llvm.bitreverse.i8(i8 unsigned int bitrev16(unsigned int data) { @@ -35,7 +35,7 @@ unsigned char rotleft8(unsigned char x, unsigned char y) { return __builtin_rotateleft8(x, y); } -// CHECK: define{{.*}} zeroext i8 @rotleft8 +// CHECK: define{{.*}} i8 @rotleft8 // CHECK: i8 @llvm.fshl.i8(i8 unsigned int rotleft16(unsigned int x, unsigned int y) { @@ -62,7 +62,7 @@ unsigned char rotright8(unsigned char x, unsigned char y) { return __builtin_rotateright8(x, y); } -// CHECK: define{{.*}} zeroext i8 @rotright8 +// CHECK: define{{.*}} i8 @rotright8 // CHECK: i8 @llvm.fshr.i8(i8 unsigned int rotright16(unsigned int x, unsigned int y) {