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