CodeGen: Let byval parameter use alloca address space

Differential Revision: https://reviews.llvm.org/D32133

llvm-svn: 300487
This commit is contained in:
Yaxun Liu 2017-04-17 20:10:44 +00:00
parent ef700d550e
commit d7523283a7
2 changed files with 21 additions and 2 deletions

View File

@ -1586,9 +1586,10 @@ CodeGenTypes::GetFunctionType(const CGFunctionInfo &FI) {
case ABIArgInfo::Indirect: {
assert(NumIRArgs == 1);
// indirect arguments are always on the stack, which is addr space #0.
// indirect arguments are always on the stack, which is alloca addr space.
llvm::Type *LTy = ConvertTypeForMem(it->type);
ArgTypes[FirstIRArg] = LTy->getPointerTo();
ArgTypes[FirstIRArg] = LTy->getPointerTo(
CGM.getDataLayout().getAllocaAddrSpace());
break;
}

View File

@ -0,0 +1,18 @@
// RUN: %clang_cc1 -emit-llvm -o - -triple amdgcn %s | FileCheck %s
// RUN: %clang_cc1 -emit-llvm -o - -triple amdgcn---amdgizcl %s | FileCheck %s -check-prefix=AMDGIZ
struct A {
int x[100];
};
int f(struct A a);
int g() {
struct A a;
// CHECK: call i32 @f(%struct.A* byval{{.*}}%a)
// AMDGIZ: call i32 @f(%struct.A addrspace(5)* byval{{.*}}%a)
return f(a);
}
// CHECK: declare i32 @f(%struct.A* byval{{.*}})
// AMDGIZ: declare i32 @f(%struct.A addrspace(5)* byval{{.*}})