bridge: put StructRet parameter in address space 0
StructRet parameter is on stack, so we put it in address space 0.
This reduces addrspacecasts and generates better code.
Change-Id: I573e3b22c394782d7b7e51e405ab2071e627b4b3
Reviewed-on: https://go-review.googlesource.com/c/gollvm/+/165237
Reviewed-by: Than McIntosh <thanm@google.com>
diff --git a/bridge/go-llvm-cabi-oracle.cpp b/bridge/go-llvm-cabi-oracle.cpp
index be6d0f6..d339cf7 100644
--- a/bridge/go-llvm-cabi-oracle.cpp
+++ b/bridge/go-llvm-cabi-oracle.cpp
@@ -595,7 +595,8 @@
if (rdisp == ParmIndirect) {
// Return value will be passed in memory, via a hidden
// struct return param.
- llvm::Type *ptrTyp = tm()->makeLLVMPointerType(rtyp);
+ // It is on stack, therefore address space 0.
+ llvm::Type *ptrTyp = llvm::PointerType::get(rtyp, 0);
state.addIndirectReturn();
return CABIParamInfo(ptrTyp, ParmIndirect, AttrStructReturn, 0);
}
diff --git a/bridge/go-llvm-materialize.cpp b/bridge/go-llvm-materialize.cpp
index 3d6a4c7..dce76d1 100644
--- a/bridge/go-llvm-materialize.cpp
+++ b/bridge/go-llvm-materialize.cpp
@@ -1129,16 +1129,8 @@
Btype *resTyp = state.calleeFcnType->resultType();
assert(state.callerFcn);
state.sretTemp = state.callerFcn->createTemporary(resTyp, tname);
- if (returnInfo.disp() == ParmIndirect) {
- llvm::Value *sretval = state.sretTemp;
- if (addressSpace_ != 0) {
- llvm::Type *typ =
- makeLLVMPointerType(sretval->getType()->getPointerElementType());
- sretval =
- state.builder.CreateAddrSpaceCast(sretval, typ, "sret.actual.ascast");
- }
- state.llargs.push_back(sretval);
- }
+ if (returnInfo.disp() == ParmIndirect)
+ state.llargs.push_back(state.sretTemp);
}
// Chain param if needed