]> granicus.if.org Git - clang/commitdiff
Pass aggregates on the stack without splitting in NVPTX.
authorEli Bendersky <eliben@google.com>
Wed, 29 Oct 2014 13:43:21 +0000 (13:43 +0000)
committerEli Bendersky <eliben@google.com>
Wed, 29 Oct 2014 13:43:21 +0000 (13:43 +0000)
Following the NVVM IR specifications, arguments of aggregate type should be
passed on the stack without splitting (byval).

http://reviews.llvm.org/D6020

Patch by Jacques Pienaar.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@220854 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/TargetInfo.cpp
test/CodeGen/nvptx-abi.c

index 4fcfc79abd7a5d3e9c283c2680f904acab5dec28..44bc36f514ed4547a2f3689e21bd8a89895a3c64 100644 (file)
@@ -5055,6 +5055,10 @@ ABIArgInfo NVPTXABIInfo::classifyArgumentType(QualType Ty) const {
   if (const EnumType *EnumTy = Ty->getAs<EnumType>())
     Ty = EnumTy->getDecl()->getIntegerType();
 
+  // Return aggregates type as indirect by value
+  if (isAggregateTypeForABI(Ty))
+    return ABIArgInfo::getIndirect(0, /* byval */ true);
+
   return (Ty->isPromotableIntegerType() ?
           ABIArgInfo::getExtend() : ABIArgInfo::getDirect());
 }
index f846def2de520bef796f8eb2a1e4a42732ebef90..58ad6a17f242a4d5f265ea35a4e4d246061ab885 100644 (file)
@@ -5,13 +5,39 @@ typedef struct float4_s {
   float x, y, z, w;
 } float4_t;
 
-float4_t my_function(void);
-
-// CHECK-DAG: declare %struct.float4_s @my_function
+float4_t my_function(void) {
+// CHECK-LABEL: define %struct.float4_s @my_function
+  float4_t t;
+  return t;
+};
 
 float bar(void) {
   float4_t ret;
-// CHECK-DAG: call %struct.float4_s @my_function
+// CHECK-LABEL: @bar
+// CHECK: call %struct.float4_s @my_function
   ret = my_function();
   return ret.x;
 }
+
+void foo(float4_t x) {
+// CHECK-LABEL: @foo
+// CHECK: %struct.float4_s* byval %x
+}
+
+void fooN(float4_t x, float4_t y, float4_t z) {
+// CHECK-LABEL: @fooN
+// CHECK: %struct.float4_s* byval %x
+// CHECK: %struct.float4_s* byval %y
+// CHECK: %struct.float4_s* byval %z
+}
+
+typedef struct nested_s {
+  unsigned long long x;
+  float z[64];
+  float4_t t;
+} nested_t;
+
+void baz(nested_t x) {
+// CHECK-LABEL: @baz
+// CHECK: %struct.nested_s* byval %x)
+}