r206594 - ARM64: make sure the caller is expected to extend in AAPCS.

Tim Northover tnorthover at apple.com
Fri Apr 18 06:46:08 PDT 2014


Author: tnorthover
Date: Fri Apr 18 08:46:08 2014
New Revision: 206594

URL: http://llvm.org/viewvc/llvm-project?rev=206594&view=rev
Log:
ARM64: make sure the caller is expected to extend in AAPCS.

This is one of those DarwinPCS differences. It'd been caught in
arguments, but not return values.

Modified:
    cfe/trunk/lib/CodeGen/TargetInfo.cpp
    cfe/trunk/test/CodeGen/arm64-aapcs-arguments.c

Modified: cfe/trunk/lib/CodeGen/TargetInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/TargetInfo.cpp?rev=206594&r1=206593&r2=206594&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/TargetInfo.cpp (original)
+++ cfe/trunk/lib/CodeGen/TargetInfo.cpp Fri Apr 18 08:46:08 2014
@@ -3368,8 +3368,9 @@ ABIArgInfo ARM64ABIInfo::classifyReturnT
     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

Modified: cfe/trunk/test/CodeGen/arm64-aapcs-arguments.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/arm64-aapcs-arguments.c?rev=206594&r1=206593&r2=206594&view=diff
==============================================================================
--- cfe/trunk/test/CodeGen/arm64-aapcs-arguments.c (original)
+++ cfe/trunk/test/CodeGen/arm64-aapcs-arguments.c Fri Apr 18 08:46:08 2014
@@ -33,3 +33,10 @@ typedef __attribute__((neon_vector_type(
 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) {
+}





More information about the cfe-commits mailing list