r220854 - Pass aggregates on the stack without splitting in NVPTX.
Eli Bendersky
eliben at google.com
Wed Oct 29 06:43:22 PDT 2014
Author: eliben
Date: Wed Oct 29 08:43:21 2014
New Revision: 220854
URL: http://llvm.org/viewvc/llvm-project?rev=220854&view=rev
Log:
Pass aggregates on the stack without splitting in NVPTX.
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.
Modified:
cfe/trunk/lib/CodeGen/TargetInfo.cpp
cfe/trunk/test/CodeGen/nvptx-abi.c
Modified: cfe/trunk/lib/CodeGen/TargetInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/TargetInfo.cpp?rev=220854&r1=220853&r2=220854&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/TargetInfo.cpp (original)
+++ cfe/trunk/lib/CodeGen/TargetInfo.cpp Wed Oct 29 08:43:21 2014
@@ -5055,6 +5055,10 @@ ABIArgInfo NVPTXABIInfo::classifyArgumen
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());
}
Modified: cfe/trunk/test/CodeGen/nvptx-abi.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/nvptx-abi.c?rev=220854&r1=220853&r2=220854&view=diff
==============================================================================
--- cfe/trunk/test/CodeGen/nvptx-abi.c (original)
+++ cfe/trunk/test/CodeGen/nvptx-abi.c Wed Oct 29 08:43:21 2014
@@ -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)
+}
More information about the cfe-commits
mailing list