diff options
| -rw-r--r-- | clang/lib/CodeGen/TargetInfo.cpp | 5 | ||||
| -rw-r--r-- | clang/test/CodeGen/arm64-aapcs-arguments.c | 7 |
2 files changed, 10 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp index 47c5269ec5a..246f238e658 100644 --- a/clang/lib/CodeGen/TargetInfo.cpp +++ b/clang/lib/CodeGen/TargetInfo.cpp @@ -3368,8 +3368,9 @@ ABIArgInfo ARM64ABIInfo::classifyReturnType(QualType RetTy) const { if (const EnumType *EnumTy = RetTy->getAs<EnumType>()) RetTy = EnumTy->getDecl()->getIntegerType(); - return (RetTy->isPromotableIntegerType() ? ABIArgInfo::getExtend() - : ABIArgInfo::getDirect()); + return (RetTy->isPromotableIntegerType() && isDarwinPCS() + ? ABIArgInfo::getExtend() + : ABIArgInfo::getDirect()); } // Structures with either a non-trivial destructor or a non-trivial diff --git a/clang/test/CodeGen/arm64-aapcs-arguments.c b/clang/test/CodeGen/arm64-aapcs-arguments.c index 72527b5acfb..b430630b071 100644 --- a/clang/test/CodeGen/arm64-aapcs-arguments.c +++ b/clang/test/CodeGen/arm64-aapcs-arguments.c @@ -33,3 +33,10 @@ typedef __attribute__((neon_vector_type(16))) signed char int8x16_t; typedef struct { int8x16_t arr[3]; } BigHFA; void test4(BigHFA v0_v2, BigHFA v3_v5, BigHFA sp, double sp48, BigHFA sp64) { } + +// It's the job of the argument *consumer* to perform the required sign & zero +// extensions under AAPCS. There shouldn't be + +// CHECK: define i8 @test5(i8 %a, i16 %b) +unsigned char test5(unsigned char a, signed short b) { +} |

